k8s核心资源Pod-容器指定端口和重启策略
本文介绍了Kubernetes中Pod容器的端口设置和重启策略。在端口设置方面,详细说明了containers.ports的配置选项,包括容器端口、主机端口等参数,并通过示例展示了如何创建带端口配置的Pod。在重启策略部分,阐述了三种策略:Always(默认)、OnFailure和Never,通过不同YAML配置示例演示了各策略的实际效果。
·
一、Pod容器指定端口
本小节来介绍容器的端口设置,也就是containers的ports选项。
首先看下ports支持的子选项:
[root@master ~]# kubectl explain pod.spec.containers.ports KIND: Pod VERSION: v1 RESOURCE: ports <[]Object> FIELDS: name <string> # 端口名称,如果指定,必须保证name在pod中是唯一的 containerPort<integer> # 容器要监听的端口(0<x<65536) hostPort <integer> # 容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本(一般省略) hostIP <string> # 要将外部端口绑定到的主机IP(一般省略) protocol <string> # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”。
容器端口和主机端口的区别

接下来,编写一个测试案例,创建pod-ports.yaml
apiVersion: v1 kind: Pod metadata: name: pod-ports namespace: test spec: containers: - name: nginx image: nginx:1.18 ports: # 设置容器暴露的端口列表 - name: nginx-port containerPort: 80 protocol: TCP
# 创建Pod [root@master ~]# kubectl create -f pod-ports.yaml pod/pod-ports created # 查看pod # 在下面可以明显看到配置信息 [root@master ~]# kubectl get pod pod-ports -n test -o yaml ...... spec: containers: - image: nginx:1.18 imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 name: nginx-port protocol: TCP ......
访问容器中的程序需要使用的是podIp:containerPort
二、重启策略
作用
kubernetees中,一旦容器探测出现了问题,kubernetes就会对容器所在的Pod进行重启,其实这是由pod的重启策略决定的
种类
pod的重启策略有 3 种,分别如下:
-
Always :容器失效时,自动重启该容器,这也是默认值。
-
OnFailure : 容器终止运行且退出码不为0时重启
-
Never : 不论状态为何,都不重启该容器
重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行
案例
创建pod-alwayspolicy.yaml
apiVersion: v1 kind: Pod metadata: name: pod-alwayspolicy namespace: test spec: containers: - name: nginx image: nginx:1.18 ports: - name: nginx-port containerPort: 80 livenessProbe: httpGet: scheme: HTTP port: 80 path: /hello restartPolicy: Always # 默认就是用Always的策略
# 查看pod的实时状态 kubectl get pod -n test -o wide -w NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-alwayspolicy 1/1 Running 0 12s 10.244.2.110 node1 <none> <none> pod-alwayspolicy 1/1 Running 1 30s 10.244.2.110 node1 <none> <none> #定期重启。默认30s秒重启一次;restarts的次数逐渐增加 #探测curl 10.244.2.110:80 有时候能探测通;重启时提示探测不通 #查看pod描述的事件状态,发现健康检查探针失败 kubectl describe pod pod-restartpolicy -n test
创建pod-neverpolicy.yaml
apiVersion: v1 kind: Pod metadata: name: pod-neverpolicy namespace: test spec: containers: - name: nginx image: nginx:1.18 ports: - name: nginx-port containerPort: 80 livenessProbe: httpGet: scheme: HTTP port: 80 path: /hello restartPolicy: Never #设置重启策略为Never,默认是Always
此处设置的调度策略为never即不重启容器
创建pod并查看测试结果
[root@master ~]# kubectl create -f pod-neverpolicy.yaml pod/pod-restartpolicy created [root@master ~]# kubectl describe pods pod-neverpolicy -n test .......... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 117s default-scheduler Successfully assigned test/pod-neverpolicy to node2 Normal Pulled 116s kubelet, node2 Container image "nginx:1.18" already present on machine Normal Created 116s kubelet, node2 Created container nginx Normal Started 116s kubelet, node2 Started container nginx Warning Unhealthy 86s (x3 over 106s) kubelet, node2 Liveness probe failed: HTTP probe failed with statuscode: 404 Normal Killing 86s kubelet, node2 Stopping container nginx
查看Pod详情,发现nginx容器失败,多等一会,再观察pod的重启次数,发现一直是0,并未重启
[root@master ~]# kubectl get pod -n test -o wide -w NAME READY STATUS RESTARTS AGE pod-neverpolicy 0/1 Completed 0 105s
创建pod-onfailure.yaml
apiVersion: v1 kind: Pod metadata: name: pod-onfailure namespace: test spec: containers: - name: nginx image: nginx:1.18 ports: - name: nginx-port containerPort: 80 livenessProbe: httpGet: scheme: HTTP port: 80 path: /hello restartPolicy: OnFailure
非正常停止pod容器,会重启(比如存活性探针探测失败,返回的退出码不是0)
如果正常进入pod容器,中止nginx程序,不会重启(退出码是0)
# 前提修改pod-onfailurepolicy.yaml文件,把path->/,否则存活性探针一直是404 # 重新创建一下pod-onfailure # 以交互式的方式进入该容器 kubectl exec -it pod-onfailure -n test -- /bin/bash # 退出nginx程序->进行退出码为0的正常退出。 kill 1 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-onfailure 1/1 Running 0 4s 10.244.1.86 node2 <none> <none> pod-onfailure 0/1 Completed 0 68s 10.244.1.86 node2 <none> <none>
总结

更多推荐

所有评论(0)