ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kubernetes-3 k8s集群中的生命周期

2021-07-30 13:29:50  阅读:151  来源: 互联网

标签:容器 00 生命周期 kubernetes ## 探针 myapp Pod k8s


1、什么是Pod生命周期

Pod 可以包含多个容器,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。Init 容器和普通容器区别不大,主要是init优先运行,init成功运行完成后,才会启动主容器,所以Init 容器不支持 Readiness。如果 Pod 的 Init 容器启动失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。
在这里插入图片描述Init 容器的优势:
1、想用某些工具,又不想放在主容器中,就把这些工具放在初始镜像init使用,运行完,初始镜像结束,再用主容器
2、Init 容器可以安全地运行这些工具,减少风险
3、应用镜像的创建者和部署者可以各自独立工作

2、Pod生命周期实现

(1)init容器

编写myapp.yaml文件

[root@server2 ~]# cat myapp.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  initContainers:  ## 优先执行init容器
  - name: init-myservice
    image: busybox:latest
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]    ##休眠两秒检测一次 do输出信息
  containers:
  - name: myapp-container
    image: myapp:v1
    imagePullPolicy: IfNotPresent

在这里插入图片描述

没有运行起来,当前正在初始化,只有一个初始化容器,一直在探测解析。

在这里插入图片描述

创建svc,添加init容器要求的服务

[root@server2 ~]# cat myservice.yaml 
---   ##标记语言,代表分割多个清单
apiVersion: v1
kind: Service   ##创建的服务
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80  ##对外的端口
    targetPort: 80    ##容器内的端口

[root@server2 ~]# kubectl apply -f myservice.yaml 
service/myservice created

running!!

在这里插入图片描述

[root@server2 ~]# kubectl describe svc myservice 
Name:              myservice
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.98.205.219
IPs:               10.98.205.219
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

(2)存活探针livenessProbe

表示容器是否正在运行(running)
注意:当存活和就绪探针同时存在,但只有存活探针通过时,容器会运行,但只能内部运行,无法对外访问。只有两个探针都运行成功,才可以对外访问。
Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态Success。

[root@server2 ~]# cat myapp.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    livenessProbe: 
      tcpSocket:
        port: 8080
      initialDelaySeconds: 2  ##容器启动多久后检测
      periodSeconds: 3      ## 检测间隔
      timeoutSeconds: 2    ## 检测超时                  

因为我改变了端口,肯定监测不到,所以容器一直无法启动。

[root@server2 ~]# kubectl get pod -o wide
NAME    READY   STATUS             RESTARTS   AGE    IP            NODE      NOMINATED NODE   READINESS GATES
myapp   0/1     CrashLoopBackOff   5          111s   10.244.1.22   server3   <none>           <none>

改回端口

在这里插入图片描述

肯定成功running

在这里插入图片描述

(3)就绪探针readinessProbe

readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 F 。
就绪探针就绪后,才能用这个后端,否则svc不会暴露端口。

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 2
      periodSeconds: 3
      timeoutSeconds: 2
    readinessProbe:
      httpGet:
        path: /test.html     ##通过监测/test.html这个文件判断是否就绪
        port: 80
      initialDelaySeconds: 2
      periodSeconds: 3
      timeoutSeconds: 2


running但处于未就绪状态,存活探针OK,就绪探针不OK,没有检测到test.html文件,无法就绪。

在这里插入图片描述

进入容器内部添加test.html文件

[root@server2 ~]# kubectl exec -it myapp -- sh
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP 
    link/ether e2:57:bb:7e:a5:6d brd ff:ff:ff:ff:ff:ff
    inet 10.244.2.18/24 brd 10.244.2.255 scope global eth0
       valid_lft forever preferred_lft forever

直接READYL

在这里插入图片描述

我们可以看到发布的内容

在这里插入图片描述

标签:容器,00,生命周期,kubernetes,##,探针,myapp,Pod,k8s
来源: https://blog.csdn.net/Ma_JunSSR/article/details/119221347

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有