k8s Pod生命周期

k8s Pod生命周期

k8s Pod生命周期

如图,

  • Pod创建时,会先创建Pause容器,初始化网络栈共享网络卷
  • initC初始化容器,数量是0-Max,initC可以有多个,串行,如果有一个initC失败,就会删除所有,新建Pause和initC,重新开始创建。初始化完成后,init会退出。进入下一阶段
  • 前面InitC初始化完成以后,会进入mainC,数量是1-Max,mainC是并行启动,mainC里可以定义两个钩子,一个是启动前,一个是关闭前。启动前,比如可以定义变量等命令,同时接着运行启动命令,所以如果定义变量等命令耗费时间较长,运行命令可能无法读取到变量。关闭前,比如可以会先执行定义变量,再传递关闭信号,能确保容器关闭前可以执行定义好的钩子。
  • 期间也可以定义就绪探针和存活探针,就绪探针是在启动后定时不间断的去确定Pod是否准备好,确定Pod准备好后再运行其他命令。存活探针目前有三种: http,telnet,和判断返回值。就绪探针和启动前是有一定间隙的,就好比刚创建就确认容器是否就绪是没有意义的。

k8s kubectl创建pod过程

image

  • 用户通过kubectl命名发起请求。
  • apiserver通过对应的kubeconfig进行认证,认证通过后将yaml中的po信息存到etcd。
  • Controller-Manager通过apiserver的watch接口发现了pod信息的更新,执行该资源所依赖的拓扑结构整合,整合后将对应的信息交给apiserver,apiserver写到etcd,此时pod已经可以被调度。
  • Scheduler同样通过apiserver的watch接口更新到pod可以被调度,通过算法给pod分配节点,并将pod和对应节点绑定的信息交给apiserver,apiserver写到etcd,然后将pod交给kubelet。
  • kubelet收到pod后,调用CNI接口给pod创建pod网络,调用CRI接口去启动容器,调用CSI进行存储卷的挂载。
  • 网络,容器,存储创建完成后pod创建完成,等业务进程启动后,pod运行成功。

deployment,replicaSET,pod的关系

image

pod Terminating状态删除不掉

//强制删除,pod可能还在节点一直运行,只是看不到了
rancher kubectl  delete pod smartq-console-anta-7668f6cfb4-97s8g  --grace-period=0 --force  -n anta-warning-dip

//删除finalizers,同上面一样,pod可能还在跑
kubectl patch pod [POD_NAME] -p '{"metadata":{"finalizers":null}}'

//重启kubectl

使用命令启动一个nginx pod

deployment 控制器:专门负责在k8s里安装部署pod

kubectl create deployment  :创建部署控制器

k8s-nginx :是控制器的名字

--image=nginx :指定控制器去启动pod使用的镜像

-r 3  :启动3个nginx的pod

副本控制器replicaSET(rs):作用就是监控pod副本的数量,如果某个node节点挂了,这个节点上的pod也会挂,副本控制器就会在其他的node节点上启动新的pod,数量总数达到副本控制器当时设置的数量 -- 》高可用的体现
[root@k8s-master ~]# kubectl create deployment k8s-nginx --image=nginx -r 3
deployment.apps/k8s-nginx created
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
k8s-nginx-6d779d947c-58j42   1/1     Running   0          114s
k8s-nginx-6d779d947c-mphkp   1/1     Running   0          114s
k8s-nginx-6d779d947c-zwplb   1/1     Running   0          114s
[root@k8s-master ~]# kubectl get deploy
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
k8s-nginx   3/3     3            3           3m10s
[root@k8s-master ~]# kubectl get pod -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
k8s-nginx-6d779d947c-58j42   1/1     Running   0          13m   10.244.1.2   k8s-node1   <none>           <none>
k8s-nginx-6d779d947c-mphkp   1/1     Running   0          13m   10.244.2.2   k8s-node2   <none>           <none>
k8s-nginx-6d779d947c-zwplb   1/1     Running   0          13m   10.244.3.4   k8s-node3   <none>           <none>

访问刚才创建的pod的nginx服务

目前只能在内部访问pod的nginx服务,因为还没有将它发布出去,10.244网段是k8s内部的网段

[root@k8s-master ~]# curl 10.244.1.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
 
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
 
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

删除deployment

[root@k8s-master ~]# kubectl get deploy
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
k8s-nginx   3/3     3            3           18h
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
k8s-nginx-6d779d947c-58j42   1/1     Running   0          18h
k8s-nginx-6d779d947c-mphkp   1/1     Running   0          18h
k8s-nginx-6d779d947c-zwplb   1/1     Running   0          18h
[root@k8s-master ~]# kubectl delete deployment  k8s-nginx
deployment.apps "k8s-nginx" deleted
[root@k8s-master ~]# kubectl get deploy
No resources found in default namespace.
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.

将pod里的服务发布出去

首先创建根据yaml文件创建pod

[root@k8s-master pod]# cat my_nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 3
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
[root@k8s-master pod]# kubectl apply -f my_nginx.yaml 
deployment.apps/my-nginx created
[root@k8s-master pod]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   3/3     3            3           12s
[root@k8s-master pod]# kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
my-nginx-cf54cdbf7-5tnfx   1/1     Running   0          24s   10.244.1.5   k8s-node1   <none>           <none>
my-nginx-cf54cdbf7-c8wbq   1/1     Running   0          24s   10.244.2.6   k8s-node2   <none>           <none>
my-nginx-cf54cdbf7-rhqcv   1/1     Running   0          24s   10.244.3.7   k8s-node3   <none>           <none>

创建Service

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    run: my-nginx
[root@k8s-master pod]# kubectl apply -f my_service.yaml 
service/my-nginx created
[root@k8s-master pod]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP          24h
my-nginx     NodePort    10.1.20.144   <none>        8080:32697/TCP   5s

访问发布的pod
image

利用yaml文件创建pod

apiVersion: v1   # k8s的api版本 --》用来给k8s传递参数
kind: Pod        # k8s的资源对象类型:pod,deployment,replicaSET,daemonSET
metadata:        # 定义的元数据,描述数据
  name: sc-nginx    # pod的名字
spec:            # 详细信息,指定的信息
  containers:    # 容器
  - name: nginx  # 容器名字
    image: nginx:1.14.2     #容器镜像版本
    ports:       # 端口
    - containerPort: 80

根据yaml文件启动pod

[root@k8s-master ~]# vim nginx-pod.yaml 
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml 
pod/sc-nginx created
[root@k8s-master ~]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
sc-nginx   1/1     Running   0          80s   10.244.2.3   k8s-node2   <none>           <none>

删除pod

[root@k8s-master ~]# kubectl delete pod sc-nginx
pod "sc-nginx" deleted
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.

pod的几种状态

Pending(悬决)        pod已经被kubernetes系统接受,但有一个或者多个容器尚未创建,亦未运行,可以通过kubectl describe 查看处于 Pending 状态的原因

Running (运行中)        Pod已经绑定到了某个节点,Pod中所有容器都已被创建,至少有一个容器任在运行

Successed (成功)        Pod中的所有容器都已经执行成功并终止,并且不会再重启

Failed (失败)        Pod中所有容器都终止,并且至少有一个容器是因为失败终止

Unknown (未知)         因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败
[root@k8s-master ~]# kubectl get  pod -n kube-system
NAME                                 READY   STATUS             RESTARTS         AGE
coredns-6d8c4cb4d-92g7b              0/1     CrashLoopBackOff   32 (3m44s ago)   2d23h
coredns-6d8c4cb4d-kl4q5              0/1     CrashLoopBackOff   32 (3m44s ago)   2d23h
etcd-k8s-master                      1/1     Running            0                2d23h
kube-apiserver-k8s-master            1/1     Running            0                2d23h
kube-controller-manager-k8s-master   1/1     Running            0                2d23h
kube-proxy-422b5                     1/1     Running            0                2d23h
kube-proxy-6qpcz                     1/1     Running            0                2d23h
kube-proxy-ggnnt                     1/1     Running            0                2d23h
kube-proxy-vjcnc                     1/1     Running            0                2d23h
kube-scheduler-k8s-master            1/1     Running            0                2d23h
posted @   liwenchao1995  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示