我正在使用 Google 的 Container Engine 服务,并且有一个运行服务器的 pod 监听端口 3000。我设置服务以将端口 80 连接到该 pod 的端口 3000。我能够使用其本地和公共 ip 卷曲服务在节点内,而不是从外部。我设置了一个防火墙规则以允许端口 80 并将其发送到节点,但我不断收到来自网络外部的“连接被拒绝”。我正在尝试在没有转发规则的情况下执行此操作,因为只有一个 pod,而且看起来转发规则需要花钱并进行负载平衡。我认为防火墙规则有效,因为当我将其添加createExternalLoadBalancer: true
到服务规范时,转发规则创建的外部 IP 会按预期工作。我需要做其他事情吗?设置路线之类的?
控制器.yaml
kind: ReplicationController
apiVersion: v1beta3
metadata:
name: app-frontend
labels:
name: app-frontend
app: app
role: frontend
spec:
replicas: 1
selector:
name: app-frontend
template:
metadata:
labels:
name: app-frontend
app: app
role: frontend
spec:
containers:
- name: node-frontend
image: gcr.io/project_id/app-frontend
ports:
- name: app-frontend-port
containerPort: 3000
targetPort: 3000
protocol: TCP
服务.yaml
kind: Service
apiVersion: v1beta3
metadata:
name: app-frontend-service
labels:
name: app-frontend-service
app: app
role: frontend
spec:
ports:
- port: 80
targetPort: app-frontend-port
protocol: TCP
publicIPs:
- 123.45.67.89
selector:
name: app-frontend
编辑(其他详细信息):
创建此服务会添加这些附加规则,在我运行时发现iptables -L -t nat
Chain KUBE-PORTALS-CONTAINER (1 references)
target prot opt source destination
REDIRECT tcp -- anywhere 10.247.247.206 /* default/app-frontend-service: */ tcp dpt:http redir ports 56859
REDIRECT tcp -- anywhere 89.67.45.123.bc.googleusercontent.com /* default/app-frontend-service: */ tcp dpt:http redir ports 56859
Chain KUBE-PORTALS-HOST (1 references)
target prot opt source destination
DNAT tcp -- anywhere 10.247.247.206 /* default/app-frontend-service: */ tcp dpt:http to:10.241.69.28:56859
DNAT tcp -- anywhere 89.67.45.123.bc.googleusercontent.com /* default/app-frontend-service: */ tcp dpt:http to:10.241.69.28:56859
我不完全了解 iptables,所以我不确定目标端口如何匹配我的服务。我发现 DNS89.67.45.123.bc.googleusercontent.com
解析为123.45.67.89
.
kubectl get services 显示我指定的 IP 地址和端口:
NAME IP(S) PORT(S)
app-frontend-service 10.247.243.151 80/TCP
123.45.67.89
/var/log/kube-proxy.log 中没有显示来自外部 IP 的最新信息