在这里插入图片描述

一.init容器(初始化容器)

1.init容器简介

Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。

Init容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成。
    每个 Init 容器必须运行成功,下一个才能够运行。

Init 容器能做什么?

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
  • Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
  • 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
  • Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
  • 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动

2.init初始化

初始化验证脚本,需要初始化两个service,只有两个service创建成功,pod才会进入下一周期

将service1和service2注释,模拟初始化失败

[root@server1 ~]# cat init.yml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busyboxplus
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busyboxplus
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busyboxplus
    command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

#---
#apiVersion: v1
#kind: Service
#metadata:
#  name: myservice
#spec:
#  ports:
#  - protocol: TCP
#    port: 80
#    targetPort: 9376
#---
#apiVersion: v1
#kind: Service
#metadata:
#  name: mydb
#spec:
#  ports:
#  - protocol: TCP
#    port: 80
#    targetPort: 9377

执行脚本,查看service,nydb与myservice没有创建

[root@server1 ~]# kubectl  apply  -f init.yml 
pod/myapp-pod created
[root@server1 ~]# kubectl  get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
demo         ClusterIP   10.105.217.194   <none>        80/TCP    5h22m
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   2d21h

在这里插入图片描述
查看pod状态,显示init 0/2,说明初始化失败

[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          14s

在这里插入图片描述
修改脚本,将注释部分依次还原依次执行脚本,查看变化,发现init初始化成功,pod初始化完成后进入running状态


[root@server1 ~]# vim init.yml 
[root@server1 ~]# kubectl  apply  -f init.yml 
pod/myapp-pod unchanged
service/myservice created
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          90s
[root@server1 ~]# kubectl  get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
demo         ClusterIP   10.105.217.194   <none>        80/TCP    5h23m
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   2d21h
myservice    ClusterIP   10.100.6.8       <none>        80/TCP    8s
[root@server1 ~]# vim init.yml 
[root@server1 ~]# kubectl  apply  -f init.yml 
pod/myapp-pod unchanged
service/myservice unchanged
service/mydb created
[root@server1 ~]# kubectl  get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
demo         ClusterIP   10.105.217.194   <none>        80/TCP    5h24m
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   2d21h
mydb         ClusterIP   10.98.3.156      <none>        80/TCP    2s
myservice    ClusterIP   10.100.6.8       <none>        80/TCP    34s
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:1/2   0          2m3s
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:1/2   0          2m5s
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:1/2   0          2m7s
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS            RESTARTS   AGE
myapp-pod   0/1     PodInitializing   0          2m8s
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          2m9s
[root@server1 ~]# kubectl  get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          2m10s

二.探针

1.探针概述

探针 是由 kubelet 对容器执行的定期诊断:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  • TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTPGet 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • 成功:容器通过了诊断。
  • 失败:容器未通过诊断。
  • 未知:诊断失败,因此不会采取任何行动。

Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:

  • livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
  • readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态Success。
  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

重启策略

  • PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和Never。默认为 Always。

Pod 的生命

  • 一般Pod 不会消失,直到人为销毁他们,这可能是一个人或控制器。
  • 建议创建适当的控制器来创建 Pod,而不是直接自己创建 Pod。因为单独的Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。

三种可用的控制器:

  • 使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod。
  • 对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod。
  • 提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod 。

2.livenessProbe存活探针

yml脚本,设定存活探针,设置寻找80端口,找不到无法确定存活,将会按照默认重启策略,一直重启,直到找到端口

[root@server1 ~]# cat pod.yaml 
apiVersion: v1
  kind: Pod
metadata:
  name: pod-example
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: myapp:v1
    
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

执行脚本,监控pod状态,由于未满足存活探针条件,始终处于重启状态

[root@server1 ~]# kubectl  apply  -f pod.yaml 
pod/pod-example created
[root@server1 ~]# kubectl  get pod
NAME          READY   STATUS    RESTARTS   AGE
pod-example   0/1     Running   1          14s
[root@server1 ~]# kubectl  get pod -w
NAME          READY   STATUS    RESTARTS   AGE
pod-example   0/1     Running   2          21s
pod-example   0/1     CrashLoopBackOff   2          27s
pod-example   0/1     Running            3          43s
pod-example   0/1     Running            4          51s
pod-example   0/1     CrashLoopBackOff   4          60s

3.readinessProbe就绪探针

就绪探针在脚本的应用是判断80端口访问下,是否能够获取/test.html页面内容,如果能够获取内容,证明服务访问正常,一切准备就绪,可以进入下一周期,反之不满足,失败。

[root@server1 ~]# cat pod.yaml 
apiVersion: v1
  kind: Pod
metadata:
  name: pod-example
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: myapp:v1
    
    readinessProbe:
      httpGet:
        path: /test.html
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

就绪探针的特点是,未处于就绪的容器,仅可以通过内网访问,不可以开放给外部访问,因此创建service服务脚本,通过查看能否进行外部访问确认是否就绪
svc.yml

    [root@server1 ~]# cat svc.yml 
    apiVersion: v1
    kind: Service
    metadata:
      name: mysvc
    spec:
      ports:
  - protocol: TCP
    port: 80
    targetPort: 80
      selector:
    app: myapp

执行脚本,查看pod状态

[root@server1 ~]# kubectl  apply  -f svc.yml 
service/mysvc created
[root@server1 ~]# kubectl  get pod --show-labels
NAME          READY   STATUS    RESTARTS   AGE   LABELS
pod-example   0/1     Running   0          51s   app=myapp

查看svc,进行访问,被拒绝 Endpoints 内为空

[root@server1 ~]# kubectl  get svc mysvc 
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
mysvc   ClusterIP   10.96.220.88   <none>        80/TCP    45s
[root@server1 ~]# curl 10.96.220.88
curl: (7) Failed connect to 10.96.220.88:80; Connection refused
[root@server1 ~]# kubectl describe svc mysvc 
Name:              mysvc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myapp
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.96.220.88
IPs:               10.96.220.88
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         
Session Affinity:  None
Events:            <none>

进入交互界面,创建默认发布页面test.html

[root@server1 ~]# kubectl  exec  pod-example  -it -- sh
~ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html    index.html
/usr/share/nginx/html # echo www.westos.org > test.html
/usr/share/nginx/html # exit
[root@server1 ~]# kubectl  get pod --show-labels 
NAME          READY   STATUS    RESTARTS   AGE     LABELS
pod-example   1/1     Running   0          3m53s   app=myapp
[root@server1 ~]# curl 10.96.220.88
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server1 ~]# curl 10.96.220.88/test.html
www.westos.org

查看svc,获取内容Endpoints: 10.244.2.25:80,可以进行外部访问

[root@server1 ~]# kubectl describe svc mysvc 
Name:              mysvc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myapp
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.96.220.88
IPs:               10.96.220.88
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.25:80
Session Affinity:  None
Events:            <none>

测试
在这里插入图片描述
查看pod状态,处于ready

[root@server1 ~]# kubectl  get pod --show-labels
NAME          READY   STATUS    RESTARTS   AGE   LABELS
pod-example   1/1     Running   0          51s   app=myapp
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐