前言
有5种方法可以让集群外访问运行在Kubernetes集群上的应用程序(pod)。接下来我们 详细讨论Kubernetes的hostNetwork,hostPort,NodePort,LoadBalancer和Ingress功能。本章内容主要解读一下hostNetwork。
hostNetwork
demo
hostNetwork设置适用于Kubernetes pod。当pod配置为hostNetwork:true时,在此类pod中运行的应用程序可以直接查看启动pod的主机的网络接口。配置为侦听所有网络接口的应用程序,又可以在主机的所有网络接口上访问。以下是使用主机网络的pod的示例定义:
apiVersion: v1 kind: Pod metadata: name: influxdb spec: hostNetwork: true containers: - name: influxdb image: influxdb
您可以使用以下命令启动pod:
$ kubectl create -f influxdb-hostnetwork.yml
您可以检查InfluxDB应用程序是否正在运行:
$ curl -v http://kubenode01.example.com:8086/ping
剖析
当pod 设置hostNetwork: true时候,Pod中的所有容器就直接暴露在宿主机的网络环境中,这时候,Pod的PodIP就是其所在Node的IP。
对于同Deployment下的hostNetwork: true启动的Pod,每个node上只能启动一个。也就是说,Host模式的Pod启动副本数不可以多于“目标node”的数量,“目标node”指的是在启动Pod时选定的node,若未选定(没有指定nodeSelector),“目标node”的数量就是集群中全部的可用的node的数量。当副本数大于“目标node”的数量时,多出来的Pod会一直处于Pending状态,因为schedule已经找不到可以调度的node了。
以下示例中,集群只有4个node,当设置副本数量为5时,最后一个Pod状态会一直处于Pending状态。
root@k8s-master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
test-host-1108333573-11wbl 1/1 Running 0 17s 10.0.251.153 k8s-node-1
test-host-1108333573-2k35s 1/1 Running 0 17s 10.0.251.146 k8s-node-3
test-host-1108333573-lnlpy 1/1 Running 0 17s 10.0.251.222 k8s-node-4
test-host-1108333573-t6izr 1/1 Running 0 17s 10.0.251.155 k8s-node-2
test-host-1108333573-tf4mc 0/1 Pending 0 17s <none>
当多个host模式deployment的端口冲突的时候,最后启动的那些Pod就会一直处于Pending状态。
PS
请注意,每次重新启动pod时,Kubernetes都可能将pod重新安排到其他节点上,因此应用程序的IP地址将更改。除此之外,需要相同端口的两个应用程序不能在同一节点上运行。当群集上运行的应用程序数量增加时,这可能会导致端口冲突。由于这些原因,主机网络不是使您的应用程序可以从群集外部访问的好方法。
主机网络在那些方面有用那?
- 对于需要直接访问主机网络的情况。例如,可以将Kubernetes网络插件Flannel部署为在Kubernetes集群的所有节点上设置的守护进程。由于hostNetwork:true,Flannel完全控制集群中每个节点上的网络,允许它管理与hostNetwork:false的pod连接到的覆盖网络。
- 因为每个node上只能启动一个同deployment的pod,通过该特性,在某种程度上可以实现同一应用的pod不部署在同一台主机的需求。但是我更倾向于使用之前文章介绍过的pod的反亲和性来解决。