Kubernetes、Flannel 和公开服务

Kubernetes, Flannel and exposing services

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

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

flannel 网络配置: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 是我唯一的选择?

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

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

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

我也犯了命令错误。

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

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.

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

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

您定义容器和端口

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

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

这里的 2 个限制显然是: 1) 每个主机最多只能有其中一个 pods。 2)IP是它绑定的节点的主机IP

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

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