3

我有一个运行良好的 kubernetes 设置,但我似乎无法在外部公开服务。我认为我的网络设置不正确:

kubernetes 服务地址:--service-cluster-ip-range=172.16.0.1/16

法兰绒网络配置:etcdctl get /test.lan/network/config {"Network":"172.17.0.0/16"}

docker子网设置:--bip=10.0.0.1/24

主机节点IP:192.168.4.57

我已经运行了 nginx 服务,并且尝试像这样公开它:

[root@kubemaster ~]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
nginx-px6uy   1/1       Running   0          4m
[root@kubemaster ~]# kubectl get services
NAME         LABELS                                    SELECTOR    IP(S)           PORT(S)    AGE
kubernetes   component=apiserver,provider=kubernetes   <none>      172.16.0.1      443/TCP    31m
nginx        run=nginx                                 run=nginx   172.16.84.166   9000/TCP   3m

然后我像这样暴露了服务:

kubectl expose rc nginx --port=9000 --target-port=9000 --type=NodePort
NAME      LABELS      SELECTOR    IP(S)     PORT(S)    AGE
nginx     run=nginx   run=nginx             9000/TCP   292y

我现在希望能够访问主机节点 IP(192.168.4.57)上的 nginx 容器 - 我误解了网络吗?如果我有,可以解释一下:(

注意:这是在没有云提供商提供负载均衡器的物理硬件上,所以我认为 NodePort 是我唯一的选择?

4

3 回答 3

2

所以这里的问题是当你使用 nodePort 时缺少一块拼图。

我在命令上也犯了一个错误。

首先,您需要确保公开正确的端口,在本例中为 80 用于 nginx:

kubectl expose rc nginx --port=80 --type=NodePort

其次,您需要使用kubectl describe svc nginx它,它会向您显示它在每个节点上分配的 NodePort:

[root@kubemaster ~]# kubectl describe svc nginx
Name:           nginx
Namespace:      default
Labels:         run=nginx
Selector:       run=nginx
Type:           NodePort
IP:         172.16.92.8
Port:           <unnamed>   80/TCP
NodePort:       <unnamed>   32033/TCP
Endpoints:      10.0.0.126:80,10.0.0.127:80,10.0.0.128:80
Session Affinity:   None
No events.

您当然可以在部署时分配一个,但在使用随机分配的端口时我错过了此信息。

于 2015-12-24T12:55:04.733 回答
1

如果您在裸机上运行集群或不在提供负载均衡器的提供商处运行集群,您还可以将端口定义为 pod 上的 hostPort

你定义你的容器和端口

containers:
- name: ningx
  image: nginx
  ports:
  - containerPort: 80
    hostPort: 80
    name: http

这会将容器绑定到主机网络并使用定义的端口。

这里的两个限制显然是:1)每个主机上最多只能有一个这些 pod。2)IP是它绑定到的节点的主机IP

这本质上就是云提供商负载均衡器的工作方式。

使用新DaemonSet功能,可以定义 pod 将登陆的节点并修复 IP。然而,这必然会损害高可用性方面,但在某些时候没有太多选择,因为 DNS 负载平衡不会避免转发到死节点

于 2016-01-05T22:14:55.100 回答
1

是的,您需要使用 NodePort。当您点击服务时,destPort 应该等于 NodePort。服务的 destIP 应被节点视为本地。例如,您可以使用其中一个节点的 hostIP..

负载均衡器会有所帮助,因为它可以处理您的节点出现故障但其他节点仍然可以处理服务的情况。

于 2015-12-18T18:33:30.153 回答