• k8s创建pod - 启动pod的流程


    目录

    知识点一:启动一个pod

     1、使用命令启动一个nginx pod

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

     1.2、删除deployment

    2、将pod里的服务发布出去

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

     2.1、创建Service

    2.2、访问发布的pod

     3、利用yaml文件创建pod

    3.1、根据yaml文件启动pod

    3.2、删除pod

    4、pod的几种状态 

    知识点二:启动pod的流程

     知识点三:pod有哪些调度算法

    1、 kubectl describe node k8s-master  输出一个node的详细信息

     2、pod的重启策略

     知识点四:pod的通信方式

    知识点五:k8s的各种控制器

    1、k8s里面有哪些控制器?

    1.1、ReplicaSET 副本控制器 

    1.2、DaemonSet 

     1.3、Job

    2、deployment,replicaSET,pod的关系

    2.1、既然pod是replicaSET启动的,那么删除replicaSET会发生什么?

    知识点一:启动一个pod

     1、使用命令启动一个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,数量总数达到副本控制器当时设置的数量 -- 》高可用的体现

    1. [root@k8s-master ~]# kubectl create deployment k8s-nginx --image=nginx -r 3
    2. deployment.apps/k8s-nginx created
    3. [root@k8s-master ~]# kubectl get pod
    4. NAME READY STATUS RESTARTS AGE
    5. k8s-nginx-6d779d947c-58j42 1/1 Running 0 114s
    6. k8s-nginx-6d779d947c-mphkp 1/1 Running 0 114s
    7. k8s-nginx-6d779d947c-zwplb 1/1 Running 0 114s
    8. [root@k8s-master ~]# kubectl get deploy
    9. NAME READY UP-TO-DATE AVAILABLE AGE
    10. k8s-nginx 3/3 3 3 3m10s
    11. [root@k8s-master ~]# kubectl get pod -o wide
    12. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    13. k8s-nginx-6d779d947c-58j42 1/1 Running 0 13m 10.244.1.2 k8s-node1
    14. k8s-nginx-6d779d947c-mphkp 1/1 Running 0 13m 10.244.2.2 k8s-node2
    15. k8s-nginx-6d779d947c-zwplb 1/1 Running 0 13m 10.244.3.4 k8s-node3

     ########################################################################################## 

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

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

    1. [root@k8s-master ~]# curl 10.244.1.2
    2. <head>
    3. Welcome to nginx!
    4. Welcome to nginx!

    5. If you see this page, the nginx web server is successfully installed and

    6. working. Further configuration is required.

    7. For online documentation and support please refer to

    8. Commercial support is available at
    9. Thank you for using nginx.

     ########################################################################################## 

     1.2、删除deployment

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

     ########################################################################################## 

    2、将pod里的服务发布出去

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

    yaml文件:

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

     ########################################################################################## 

     2.1、创建Service

    my_service.yaml内容:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: my-nginx
    5. labels:
    6. run: my-nginx
    7. spec:
    8. type: NodePort
    9. ports:
    10. - port: 8080
    11. targetPort: 80
    12. protocol: TCP
    13. name: http
    14. selector:
    15. run: my-nginx

     创建service

    1. [root@k8s-master pod]# kubectl apply -f my_service.yaml
    2. service/my-nginx created
    3. [root@k8s-master pod]# kubectl get service
    4. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    5. kubernetes ClusterIP 10.1.0.1 443/TCP 24h
    6. my-nginx NodePort 10.1.20.144 8080:32697/TCP 5s

     ########################################################################################## 

    2.2、访问发布的pod

    我们只要随便访问k8s几区任何一台node节点服务器,包括master

    ########################################################################################## 

     3、利用yaml文件创建pod

    以下是nginx-pod.yaml文件内容

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

     ########################################################################################## 

    3.1、根据yaml文件启动pod

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

    3.2、删除pod

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

    ########################################################################################## 

    4、pod的几种状态 

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

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

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

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

    Unknown (未知)         因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败

    1. [root@k8s-master ~]# kubectl get pod -n kube-system
    2. NAME READY STATUS RESTARTS AGE
    3. coredns-6d8c4cb4d-92g7b 0/1 CrashLoopBackOff 32 (3m44s ago) 2d23h
    4. coredns-6d8c4cb4d-kl4q5 0/1 CrashLoopBackOff 32 (3m44s ago) 2d23h
    5. etcd-k8s-master 1/1 Running 0 2d23h
    6. kube-apiserver-k8s-master 1/1 Running 0 2d23h
    7. kube-controller-manager-k8s-master 1/1 Running 0 2d23h
    8. kube-proxy-422b5 1/1 Running 0 2d23h
    9. kube-proxy-6qpcz 1/1 Running 0 2d23h
    10. kube-proxy-ggnnt 1/1 Running 0 2d23h
    11. kube-proxy-vjcnc 1/1 Running 0 2d23h
    12. kube-scheduler-k8s-master 1/1 Running 0 2d23h

    ##########################################################################################

    知识点二:启动pod的流程

     

    用户通过kubectl提交pod创建指令,这个指令可以是命令也可以是yaml文件,yaml文件里面指定了很多关于pod的参数,例如名字,镜像,版本等

    pod创建指令信息传给API Server,API Server将Pod信息存入etcd

    Controller Manager控制器通过API Server接口发现pod信息的更新,做编排工作,创建应用锁需要的pod,并将创建信息返回给API Server,API Server再将pod信息更新到etcd

    Scheduler通过API Server中新pod信息的变化,就会为pod分配一个节点Node,并将分配结果反馈给API Server,API Server再将Pod信息存到etcd

    API Server通知对应节点的kubelet,kubelet发现Pod调度到本节点,通过容器(例如docker)创建并运行Pod的容器

    Kube-proxy给pod分配网络资源,包括服务的发布以及负载均衡的配置

     ##########################################################################################

     知识点三:pod有哪些调度算法

    根据pod调度策略和方法

    1、deployment:全自动调度,根据node的算力(cpu,内存,带宽,已经运行的pod等)

    2、node selector:定向调度

    3、nodeaffinity:  尽量把不同的pod放到一台node上

    4、podaffinity:    尽量把相同的pod放到一起

    5、taints和tolerations:污点和容忍

    1、 kubectl describe node k8s-master  输出一个node的详细信息

    1. [root@k8s-master ~]# kubectl describe node k8s-master
    2. Name: k8s-master
    3. Roles: control-plane,master
    4. Labels: beta.kubernetes.io/arch=amd64
    5. beta.kubernetes.io/os=linux
    6. kubernetes.io/arch=amd64
    7. kubernetes.io/hostname=k8s-master
    8. kubernetes.io/os=linux
    9. node-role.kubernetes.io/control-plane=
    10. node-role.kubernetes.io/master=
    11. node.kubernetes.io/exclude-from-external-load-balancers=
    12. Annotations: flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"fe:ca:d8:cc:01:2e"}
    13. flannel.alpha.coreos.com/backend-type: vxlan
    14. flannel.alpha.coreos.com/kube-subnet-manager: true
    15. flannel.alpha.coreos.com/public-ip: 192.168.44.210
    16. kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
    17. node.alpha.kubernetes.io/ttl: 0
    18. volumes.kubernetes.io/controller-managed-attach-detach: true
    19. CreationTimestamp: Sun, 25 Sep 2022 18:20:27 +0800
    20. Taints: node-role.kubernetes.io/master:NoSchedule
    21. Unschedulable: false
    22. Lease:
    23. HolderIdentity: k8s-master
    24. AcquireTime: <unset>
    25. RenewTime: Wed, 28 Sep 2022 17:36:36 +0800
    26. Conditions:
    27. Type Status LastHeartbeatTime LastTransitionTime Reason Message
    28. ---- ------ ----------------- ------------------ ------ -------
    29. NetworkUnavailable False Sun, 25 Sep 2022 18:33:20 +0800 Sun, 25 Sep 2022 18:33:20 +0800 FlannelIsUp Flannel is running on this node
    30. MemoryPressure False Wed, 28 Sep 2022 17:33:08 +0800 Sun, 25 Sep 2022 18:20:26 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
    31. DiskPressure False Wed, 28 Sep 2022 17:33:08 +0800 Sun, 25 Sep 2022 18:20:26 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
    32. PIDPressure False Wed, 28 Sep 2022 17:33:08 +0800 Sun, 25 Sep 2022 18:20:26 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
    33. Ready True Wed, 28 Sep 2022 17:33:08 +0800 Sun, 25 Sep 2022 18:33:28 +0800 KubeletReady kubelet is posting ready status
    34. Addresses:
    35. InternalIP: 192.168.44.210
    36. Hostname: k8s-master
    37. Capacity:
    38. cpu: 4
    39. ephemeral-storage: 17394Mi
    40. hugepages-1Gi: 0
    41. hugepages-2Mi: 0
    42. memory: 1863028Ki
    43. pods: 110
    44. Allocatable:
    45. cpu: 4
    46. ephemeral-storage: 16415037823
    47. hugepages-1Gi: 0
    48. hugepages-2Mi: 0
    49. memory: 1760628Ki
    50. pods: 110
    51. System Info:
    52. Machine ID: 6d6ca2c7ec0f478097733b00d2892ca0
    53. System UUID: 0A004D56-3924-4215-F717-9E4DAD9C840B
    54. Boot ID: dd78d95d-a6e7-460e-892b-8d4cf8191823
    55. Kernel Version: 3.10.0-1160.el7.x86_64
    56. OS Image: CentOS Linux 7 (Core)
    57. Operating System: linux
    58. Architecture: amd64
    59. Container Runtime Version: docker://20.10.18
    60. Kubelet Version: v1.23.6
    61. Kube-Proxy Version: v1.23.6
    62. PodCIDR: 10.244.0.0/24
    63. PodCIDRs: 10.244.0.0/24
    64. Non-terminated Pods: (6 in total)
    65. Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
    66. --------- ---- ------------ ---------- --------------- ------------- ---
    67. kube-flannel kube-flannel-ds-rphnc 100m (2%) 100m (2%) 50Mi (2%) 50Mi (2%) 2d23h
    68. kube-system etcd-k8s-master 100m (2%) 0 (0%) 100Mi (5%) 0 (0%) 2d23h
    69. kube-system kube-apiserver-k8s-master 250m (6%) 0 (0%) 0 (0%) 0 (0%) 2d23h
    70. kube-system kube-controller-manager-k8s-master 200m (5%) 0 (0%) 0 (0%) 0 (0%) 2d23h
    71. kube-system kube-proxy-ggnnt 0 (0%) 0 (0%) 0 (0%) 0 (0%) 2d23h
    72. kube-system kube-scheduler-k8s-master 100m (2%) 0 (0%) 0 (0%) 0 (0%) 2d23h
    73. Allocated resources:
    74. (Total limits may be over 100 percent, i.e., overcommitted.)
    75. Resource Requests Limits
    76. -------- -------- ------
    77. cpu 750m (18%) 100m (2%)
    78. memory 150Mi (8%) 50Mi (2%)
    79. ephemeral-storage 0 (0%) 0 (0%)
    80. hugepages-1Gi 0 (0%) 0 (0%)
    81. hugepages-2Mi 0 (0%) 0 (0%)
    82. Events:

     ########################################################################################## 

     2、pod的重启策略

    always :当容器失败时,由kubelet自动重启该容器

    OnFailure :当容器终止运行且退出码为0时,由kubelet自动重启该容器

    Never :不论容器运行状态如何,kubelet都不会重启该容器

     ##########################################################################################

     知识点四:pod的通信方式

    kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,kubernetes假定这个网络已经存在,

     ##########################################################################################

    知识点五:k8s的各种控制器

    1、k8s里面有哪些控制器?

    deployment

    replicaSET

    daemonSET

    1.1、ReplicaSET 副本控制器 

    ReplicaSET 副本控制器,用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代,而如果异常出来的容器也会自动回收

    1.2、DaemonSet 

    Daemon确保全部node(或者一些)上运行一个pod的副本,当有node加入集群时,也会为他们新增一个pod,当有node从集群移除时,这些pod也会被回收,删除DaemonSet会删除它创建的所有pod

     1.3、Job

    Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束

     ##########################################################################################

    2、deployment,replicaSET,pod的关系

    首先部署一个deployment k8s-nginx,启动三个pod,pod里面运行nginx

    1. [root@k8s-master ~]# kubectl create deployment k8s-nginx --image=nginx -r 3
    2. deployment.apps/k8s-nginx created
    3. [root@k8s-master ~]# kubectl get pod -o wide
    4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    5. k8s-nginx-6d779d947c-hd64b 1/1 Running 0 21s 10.244.1.3 k8s-node1
    6. k8s-nginx-6d779d947c-j9pkd 1/1 Running 0 21s 10.244.3.5 k8s-node3
    7. k8s-nginx-6d779d947c-rf7tm 1/1 Running 0 21s 10.244.2.4 k8s-node2
    8. [root@k8s-master ~]# kubectl get deploy
    9. NAME READY UP-TO-DATE AVAILABLE AGE
    10. k8s-nginx 3/3 3 3 27s
    11. [root@k8s-master ~]# kubectl get replicaset
    12. NAME DESIRED CURRENT READY AGE
    13. k8s-nginx-6d779d947c 3 3 3 41s

    2.1、既然pod是replicaSET启动的,那么删除replicaSET会发生什么?

    1. [root@k8s-master ~]# kubectl delete replicaset k8s-nginx-6d779d947c
    2. replicaset.apps "k8s-nginx-6d779d947c" deleted
    3. [root@k8s-master ~]# kubectl get pod
    4. NAME READY STATUS RESTARTS AGE
    5. k8s-nginx-6d779d947c-2xp8r 1/1 Running 0 7s
    6. k8s-nginx-6d779d947c-gw5x8 1/1 Running 0 7s
    7. k8s-nginx-6d779d947c-rmx9x 1/1 Running 0 7s
    8. [root@k8s-master ~]# kubectl get rs
    9. NAME DESIRED CURRENT READY AGE
    10. k8s-nginx-6d779d947c 3 3 3 12s

    可以看到,删除replicaSET以后,又会重新生成一个replicaSET副本控制器,因为replicaSET是由deployment部署的,所以replicaSET挂了以后又会重新生成

    但是如果删除了deployment,无论是replicaSET,pod,都会被删除

     ##########################################################################################

  • 相关阅读:
    代码随想录算法训练营第二天 | 242. 有效的字母异位词、349. 两个数组的交集、1. 两数之和
    白领要预防肾结石的发生
    混沌策略和单纯形法改进的鲸鱼优化算法-附代码
    【附源码】Python计算机毕业设计网上购物平台
    计算机毕业设计(附源码)python在线影视购票系统
    Bigemap是如何在生态林业科技行业去应用的
    【QML】QML与C++混合编程,结构体参数互相传递
    【Java基础系列】第14章 Java图形编程
    【网络原理】基本原理篇:I/O
    计算机毕业设计Java航空售票系统(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/qq_48391148/article/details/127042156