一、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>

总结

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐