kubernetes的基本单位Pod详解( 三 )


因为 Pod 的 IP 地址本身是虚拟 IP,所以只有 kubernetes 集群内部的机器( Master 和 Node )和其他 Pod 可以直接访问这个 IP 地址,集群之外的机器无法直接访问 Pod 的 IP 地址 。我们创建了一个 Nginx Pod:
apiVersion: v1kind: Podmetadata:name: nginxspec:containers:- name: exnginximage: nginximagePullPolicy: IfNotPresentports:- name: nginxportcontainerPort: 80通过命令创建后查询以下 IP 地址:
[root@k8s-master]# kubectl apply -f exnginx.yml[root@k8s-master]# kubectl get pod -o wide

kubernetes的基本单位Pod详解

文章插图
 
集群中的所有机器和 Pod 都可以访问这个虚拟地址和 containerPort 暴露的端口
[root@k8s-master]# curl http://10.244.1.6
kubernetes的基本单位Pod详解

文章插图
 
同时我们看到我们有两个 Pod,一个在 Node1 上,一个在 Node2 上,而 Node2 上的 Pod IP 地址是10.244.2.6,Node1 上的 Pod IP 地址是10.244.1.6,登录到两台机器上,使用 ifconfig flannel.1 命令查看集群子网段 。
kubernetes的基本单位Pod详解

文章插图
k8s-node1

kubernetes的基本单位Pod详解

文章插图
K8s-node2
要使集群外的机器访问 Pod 提供的服务,后面我们会介绍 Service 和 Ingress 来发布服务 。
Pod 的生命周期Pod 的状态
kubernetes的基本单位Pod详解

文章插图
 
一旦开始在集群节点中创建 Pod,首先就会进入 Pending 状态,只要 Pod 中的所有容器都已启动并正常运行,则 Pod 接下来会进入 Running 状态,如果 Pod 被要求终止,且所有容器终止退出时的状态码都为0,Pod 就会进入 Succeeded 状态 。
如果进入 Failed 状态,通常有以下3种原因 。
  • Pod 启动时,只要有一个容器运行失败,Pod 将会从 Pending 状态进入 Failed 状态 。
  • Pod 正处于 Running 状态,若 Pod 中的一个容器突然损坏或者在退出时状态码不为0,Pod 将会从 Running 进入 Failed 状态 。
  • 在要求 Pod 正常关闭的时候,只要有一个容器退出的状态码不为0,Pod 就会进入 Failed 状态 。
Pod 的重启策略在配置 Pod 的模板文件中有个 spec 模块,其中有一个名为 restartPolicy 的字段,字段的值为 Always、OnFailure、Never 。Node 上的 kubelet 通过 restartPolicy 执行重启操作,由 kubelet 重新启动的已退出容器将会以递增延迟的方式(10s,20s,40s,...)尝试重新启动,上限时间为 5min,延时的累加值会在成功运行 10min 后重置,一旦 Pod 绑定到某个节点上,就绝对不会重新绑定到另一个节点上 。
重启策略对 Pod 状态的影响如下:
  • 假设有1个运行中的 Pod,包含1个容器,容器退出成功后 。
Always:重启容器,Pod 状态仍为 Running 。
OnFailure:Pod 状态变为 Completed 。
Never:Pod 状态变为 Completed 。
  • 假设有1个运行中的 Pod,包含1个容器,容器退出失败后 。
Always:重启容器,Pod 状态仍为 Running 。
OnFailure:重启容器,Pod 状态仍为 Running 。
Never:Pod 状态变为 Failed 。
  • 假设有1个运行中的 Pod,包含2个容器,第1个容器退出失败后 。
Always:重启容器,Pod 状态仍为 Running 。
OnFailure:重启容器,Pod 状态仍为 Running 。
Never:不会重启容器,Pod 状态仍为 Completed 。
  • 假设第1个容器没有运行起来,而第2个容器也退出了 。
Always:重启容器,Pod 状态仍为 Running 。
OnFailure:重启容器,Pod 状态仍为 Running 。
Never:Pod 状态变为 Failed 。
  • 假设有1个运行中的 Pod,包含1个容器,容器发生内存溢出后 。
Always:重启容器,Pod 状态仍为 Running 。
OnFailure:重启容器,Pod 状态仍为 Running 。
Never:记录失败事件,Pod 状态变为 Failed 。
Pod 的创建于销毁过程Pod 的创建过程: