• k8s上对Pod的管理部分详解


    目录

    一.Pod结构介绍

    1.user container

    2.pause

    二.Pod工作形式介绍

    1.自主式pod

    2.控制器管理下的pod

    三.对Pod的操作介绍

    1.run/apply -f/create -f运行pod

    2.get查看pod信息

    3.exec操作运行中的pod

    (1)进入运行中的pod

    (2)进入pod中的容器

    4.logs打印pod日志

    5.describe描述pod详细信息用于排错

    6.edit编辑运行中的pod

    7.cp复制pod内的文件到master

    9.delete删除pod

    10.扩展使用kubectl命令插件

    四.pod的yaml文件配置定义解析

    五.Pod对容器的封装

    1.对单个容器的封装

    2.对多个容器封装并绑定为一个Pod

    六.静态Pod管理

    1.配置文件方式

    2.http方式


    一.Pod结构介绍

    pod中包含若干个容器,大体可以分为两大类

    1.user container

    用户程序所在容器,数量一般可多可少

    2.pause

    是每一个pod的根容器,主要是用来评估pod的健康状态和以根容器设置的IP实现pod内部通信

     

    二.Pod工作形式介绍

    主要通过yaml/json文件或kubectl run创建pod,但是pod的形式又可以分为两大类

    1.自主式pod

    通过命令行或run直接定义pod资源,这种情况下创建的pod在被删除后就彻底被删除了

    2.控制器管理下的pod

    控制器管理pod可以保障pod始终维持在指定的数量下运行,常见的pod控制器有上篇文章介绍到的deployment控制器,还有replicaset、job、cronjob、daemonset等

    三.对Pod的操作介绍

    1.run/apply -f/create -f运行pod

    1. [root@k8s-master pod]# kubectl run mynginx --image=nginx -n myns
    2. pod/mynginx created
    3. [root@k8s-master pod]# kubectl create -f tomcat.yaml
    4. pod/tomcat created
    5. [root@k8s-master pod]# kubectl apply -f httpd.yaml
    6. pod/httpd created
    7. [root@k8s-master pod]# kubectl get pods -n myns
    8. NAME     READY   STATUS   RESTARTS   AGE
    9. httpd     1/1     Running   0         2m20s
    10. mynginx   1/1     Running   0         4m33s
    11. tomcat   1/1     Running   0         8s

    2.get查看pod信息

    (1)查看所有pod

    [root@k8s-master ~]# kubectl get pods -A

    (2)查看指定的单个/多个pod

    1. [root@k8s-master ~]# kubectl get pod nginx -n myns
    2. NAME   READY   STATUS   RESTARTS   AGE
    3. nginx   1/1     Running   0         9s
    4. [root@k8s-master ~]# kubectl get pod nginx nginx1 -n myns
    5. NAME     READY   STATUS   RESTARTS   AGE
    6. nginx   1/1     Running   0         97s
    7. nginx1   1/1     Running   0         15s

    (3)查看pod同时查看其他类型资源(需要具体指定资源类型和名称)

    1. [root@k8s-master ~]# kubectl get pod/nginx -n myns node/k8s-node1
    2. NAME       READY   STATUS   RESTARTS   AGE
    3. pod/nginx   1/1     Running   0         104s
    4. NAME             STATUS   ROLES   AGE   VERSION
    5. node/k8s-node1   Ready   <none>   3m6s   v1.28.2

    (4)同时应用多个关于pod的yaml文件时添加多个-f参数即可

    (5)列出在某个节点上运行的pod

    [root@k8s-master ~]# kubectl get pods --field-selector=spec.nodeName=k8s-node1

    (6)-w实时查看pod信息

    1. [root@k8s-master ~]# kubectl get pod -w nginx -n myns
    2. NAME   READY   STATUS   RESTARTS   AGE
    3. nginx   1/1     Running   0         4h16m
    4. [root@k8s-master ~]#

    3.exec操作运行中的pod

    (1)进入运行中的pod

    1. [root@k8s-master ~]# kubectl exec -it nginx -n myns -- /bin/bash
    2. root@nginx:/# ls
    3. bin   docker-entrypoint.d   home   lib64   mnt root srv usr
    4. boot docker-entrypoint.sh lib   libx32 opt run   sys var
    5. dev   etc   lib32 media   proc sbin tmp
    6. #不进入但执行命令
    7. [root@k8s-master ~]# kubectl exec -it nginx -n myns -- ls
    8. bin   docker-entrypoint.d   home   lib64   mnt root srv usr
    9. boot docker-entrypoint.sh lib   libx32 opt run   sys var
    10. dev   etc   lib32 media   proc sbin tmp

    (2)进入pod中的容器

    1. [root@k8s-master ~]# kubectl exec -it nginx -c xxx -n myns -- /bin/bash
    2. #-c后指定容器名称

    4.logs打印pod日志

    1. [root@k8s-master ~]# kubectl logs nginx -n myns
    2. /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    3. /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    4. /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    5. 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    6. 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    7. /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
    8. /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    9. /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    10. /docker-entrypoint.sh: Configuration complete; ready for start up
    11. 2023/10/31 09:08:21 [notice] 1#1: using the "epoll" event method
    12. 2023/10/31 09:08:21 [notice] 1#1: nginx/1.25.3
    13. 2023/10/31 09:08:21 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
    14. 2023/10/31 09:08:21 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64
    15. 2023/10/31 09:08:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    16. 2023/10/31 09:08:21 [notice] 1#1: start worker processes
    17. 2023/10/31 09:08:21 [notice] 1#1: start worker process 29
    18. 2023/10/31 09:08:21 [notice] 1#1: start worker process 30
    19. 2023/10/31 09:08:21 [notice] 1#1: start worker process 31
    20. 2023/10/31 09:08:21 [notice] 1#1: start worker process 32
    21. [root@k8s-master ~]# kubectl logs nginx -n myns -f #加-f参数持续监控

    5.describe描述pod详细信息用于排错

    [root@k8s-master ~]# kubectl describe pod nginx -n myns

    6.edit编辑运行中的pod

    更改完后需要w/wq保存

    [root@k8s-master ~]# kubectl edit pod nginx -n myns

    7.cp复制pod内的文件到master

    1. [root@k8s-master ~]# kubectl exec -it nginx -n myns -- cat /etc/hosts
    2. # Kubernetes-managed hosts file.
    3. 127.0.0.1 localhost
    4. ::1 localhost ip6-localhost ip6-loopback
    5. fe00::0 ip6-localnet
    6. fe00::0 ip6-mcastprefix
    7. fe00::1 ip6-allnodes
    8. fe00::2 ip6-allrouters
    9. 10.244.36.65 nginx
    10. [root@k8s-master ~]# kubectl cp nginx:etc/hosts -n myns /root/myhosts #“:”后不需要指示“/”号,master的目标路径需要是一个文件而不是一个目录(此处的/root/myhosts)
    11. [root@k8s-master ~]# cat myhosts
    12. # Kubernetes-managed hosts file.
    13. 127.0.0.1 localhost
    14. ::1 localhost ip6-localhost ip6-loopback
    15. fe00::0 ip6-localnet
    16. fe00::0 ip6-mcastprefix
    17. fe00::1 ip6-allnodes
    18. fe00::2 ip6-allrouters
    19. 10.244.36.65 nginx

    9.delete删除pod

    (1)通过delete pod进行删除

    1. [root@k8s-master pod]# kubectl get pod mynginx -n myns --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. mynginx 1/1 Running 0 37m run=nginx,user=sulibao
    4. [root@k8s-master pod]# kubectl delete pod mynginx -n myns
    5. pod "mynginx" deleted

    (2)若是通过文件创建的pod,可以通过delete -f进行删除

    1. [root@k8s-master pod]# kubectl delete -f nginx.yaml
    2. pod "mynginx" deleted

    (3)若是拥有标签的pod,可以通过匹配标签进行删除

    1. [root@k8s-master pod]# kubectl delete pods -l run=nginx -n myns
    2. pod "mynginx" deleted

    10.扩展使用kubectl命令插件

    (1)必须是“kubectl-自定义名称”格式命名

    1. [root@k8s-master ~]# vim /usr/local/bin/kubectl-pwd #放在/usr/local/bin下
    2. [root@k8s-master ~]# cat /usr/local/bin/kubectl-pwd
    3. #!/bin/bash
    4. pwd
    5. [root@k8s-master ~]# chmod +x /usr/local/bin/kubectl-pwd #一定要加上执行权限
    6. [root@k8s-master ~]# kubectl pwd
    7. /root
    8. [root@k8s-master pod]# kubectl pwd pod httpd -n myns
    9. /root/pod

    (2)kubectl plugin list查看已安装插件列表

    1. [root@k8s-master ~]# kubectl plugin list
    2. /usr/local/bin/kubectl-pwd

    (3)rm直接删除该文件即可卸载插件

    1. [root@k8s-master ~]# rm -f /usr/local/bin/kubectl-pwd
    2. [root@k8s-master ~]# kubectl plugin list
    3. error: unable to find any kubectl plugins in your PATH

    四.pod的yaml文件配置定义解析

    1. [root@k8s-master ~]# kubectl explain pod.spec
    2. #可以以此形式来一层一层获取可配置项
    3. apiVersion: v1
    4. #必选项,版本号,如V1
    5. kind: Pod
    6. #必选项,资源类型,pod等
    7. metadata:
    8. #必选项,元数据部分
    9. name: xxx
    10. #Pod名称
    11. namespace: xxx
    12. #Pod所属的命名空间,默认为"default"
    13. labels:
    14. #自定义标签列表
    15. - name: xxx
    16. #自定义标签内容
    17. spec:
    18. #必选项,Pod中容器的详细定义
    19. containers:
    20. #必选项,Pod中容器列表
    21. - name: xxx
    22. #必选项,容器名称
    23. image: xxx
    24. #必选项,容器的镜像名称
    25. imagePullPolicy: [ Always|Never|IfNotPresent ]
    26. #获取镜像的策略,tag为latest默认always,tag为具体版本号,默认IfNotPresent。always表示每次都尝试重新拉取镜像;ifNotPresent表示如果本地有那个镜像就使用本地的,不存在时才拉取;Nerver表示仅使用本地有的镜像,绝不拉取,本地没有时报错
    27. command: [xxx]
    28. #容器的启动命令列表,如不指定则使用打包时使用的启动命令
    29. args: [xxx]
    30. #容器的启动命令给定参数列表
    31. workingDir: xxx
    32. #容器的工作目录
    33. volumeMounts:
    34. #挂载到容器内部的存储卷配置
    35. - name: xxx
    36. #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
    37. mountPath: xxx
    38. #存储卷在容器内mount的绝对路径,应少于512字符
    39. readOnly: xxx
    40. #布尔值,是否为只读模式
    41. ports:
    42. #需要暴露的端口库号列表
    43. - name: xxx
    44. #端口的名称
    45. containerPort: xxx
    46. #容器需要监听的端口号
    47. hostPort: xxx
    48. #容器所在主机需要监听的端口号,默认与Container相同
    49. protocol: xxx
    50. #端口协议,支持TCP和UDP,默认TCP
    51. env:
    52. #容器运行前需设置的环境变量列表
    53. - name: xxx
    54. #环境变量名称
    55. value: xxx
    56. #环境变量的值
    57. resources:
    58. #资源限制和请求的设置
    59. limits:
    60. #资源限制的设置
    61. cpu: xxx
    62. #cpu的限制,单位为core数,将用于docker run --cpu-shares参数
    63. memory: xxx
    64. #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
    65. requests:
    66. #资源请求的设置
    67. cpu: xxx
    68. #cpu请求,容器启动的初始可用数量
    69. memory: xxx
    70. #内存请求,容器启动的初始可用数量
    71. lifecycle:
    72. #生命周期钩子
    73. postStart:
    74. #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
    75. preStop:
    76. #容器终止前执行此钩子,无论结果如何,容器都会终止
    77. livenessProbe:
    78. #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
    79. exec:
    80. #对Pod容器内检查方式设置为exec方式
    81. command: [xxx]
    82. #exec方式需要制定的命令或脚本
    83. httpGet:
    84. #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
    85. path: xxx
    86. port: xxx
    87. host: xxx
    88. scheme: xxx
    89. HttpHeaders:
    90. - name: xxx
    91. value: xxx
    92. tcpSocket:
    93. #对Pod内个容器健康检查方式设置为tcpSocket方式
    94. port: number
    95. initialDelaySeconds: 0
    96. #容器启动完成后首次探测的时间,单位为秒
    97. timeoutSeconds: 0
    98. #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
    99. periodSeconds: 0
    100. #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
    101. successThreshold: 0
    102. failureThreshold: 0
    103. securityContext:
    104. privileged: false
    105. restartPolicy: [Always | Never | OnFailure]
    106. #Pod的重启策略
    107. nodeName:
    108. #设置NodeName表示将该Pod调度到指定到名称的node节点上
    109. nodeSelector: xxx
    110. #设置NodeSelector表示将该Pod调度到包含这个label的node上
    111. imagePullSecrets:
    112. #Pull镜像时使用的secret名称,以key:secretkey格式指定
    113. - name: xxx
    114. hostNetwork: false
    115. #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    116. volumes:
    117. #在该pod上定义共享存储卷列表
    118. - name: string
    119. #共享存储卷名称 (volumes类型有很多种)
    120. emptyDir: {}
    121. #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    122. hostPath: xxx
    123. #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
    124. path: xxx
    125. #Pod所在宿主机的目录,将被用于同期中mount的目录
    126. secret:
    127. #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
    128. scretname: xxx
    129. items:
    130. - key: xxx
    131. path: xxx
    132. configMap:
    133. #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
    134. name: xxx
    135. items:
    136. - key: xxx
    137. path: xxx

    五.Pod对容器的封装

    1.对单个容器的封装

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: httpd
    5. labels:
    6. run: httpd
    7. namespace: myns
    8. spec:
    9. containers:
    10. - name: httpd
    11. image: httpd
    12. ports:
    13. - containerPort: 80

    2.对多个容器封装并绑定为一个Pod

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: two-containers
    5. namespace: myns
    6. labels:
    7. name: tc
    8. spec:
    9. containers:
    10. - name: first-container
    11. image: nginx
    12. ports:
    13. - containerPort: 80
    14. - name: second-container
    15. image: busybox
    16. command: ["/bin/sh", "-c", "while true; do echo 'Hello from the second container' > /shared-data/index.html; sleep 10; done"]
    17. volumeMounts:
    18. - name: shared-data
    19. mountPath: /shared-data
    20. ports:
    21. - containerPort: 8080
    22. volumes:
    23. - name: shared-data
    24. emptyDir: {}

    六.静态Pod管理

    1.配置文件方式

    (1)首先找到你的kubelet的service位置

    1. [root@k8s-master ~]# rpm -ql kubelet
    2. /etc/kubernetes/manifests
    3. /etc/sysconfig/kubelet
    4. /usr/bin/kubelet
    5. /usr/lib/systemd/system/kubelet.service #

    (2)到该目录下查看是否有conf文件

    1. [root@k8s-master ~]# ll /usr/lib/systemd/system/kubelet.service.d/
    2. total 4
    3. -rw-r--r-- 1 root root 1009 Nov 11 11:03 10-kubeadm.conf
    4. [root@k8s-master ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

    (3)旧版本应该会有,我的Kubernetes v1.28.2没有行命令,手动添加

    Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"

    这行命令中指定了mainifest-path为/etc/kubernetes/manifests,那么我们在这个目录中去创建一个pod的yaml文件,重启kubelet服务,不需要apply此文件就会自动创建该pod

    1. # Note: This dropin only works with kubeadm and kubelet v1.11+
    2. [Service]
    3. Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    4. Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    5. Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
    6. # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    7. EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    8. # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    9. # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    10. EnvironmentFile=-/etc/sysconfig/kubelet
    11. ExecStart=
    12. ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

    (4)验证是否成功

    1. [root@k8s-master ~]# cat /etc/kubernetes/manifests/static.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: myweb
    6. namespace: myns
    7. labels:
    8. name: my-web
    9. spec:
    10. containers:
    11. - name: myhttpd
    12. image: httpd
    13. ports:
    14. - name: web
    15. containerPort: 80
    16. [root@k8s-master manifests]# systemctl daemon-reload #重载并重启
    17. [root@k8s-master manifests]# systemctl restart kubelet.service
    18. [root@k8s-master ~]# kubectl get pods -n myns
    19. NAME READY STATUS RESTARTS AGE
    20. myweb-k8s-master 1/1 Running 0 2m41s

    (5)删除时注意事项

    直接删除该静态pod只会让其呈现为pending状态,需要删除该yaml文件

    1. [root@k8s-master ~]# kubectl delete pod myweb-k8s-master -n myns
    2. pod "myweb-k8s-master" deleted
    3. [root@k8s-master ~]# kubectl get pods -n myns
    4. NAME READY STATUS RESTARTS AGE
    5. myweb-k8s-master 0/1 Pending 0 3s
    6. [root@k8s-master ~]# rm -rf /etc/kubernetes/manifests/static.yaml
    7. [root@k8s-master ~]# kubectl get pods -n myns
    8. NAME READY STATUS RESTARTS AGE
    9. myweb-k8s-master 0/1 Completed 0 80s
    10. [root@k8s-master ~]# kubectl get pods -n myns
    11. No resources found in myns namespace.

    2.http方式

    使用“--manifest-url”参数来指定1url地址(不常用的方式),但是可以配合第一种方式使用,就cd到启动配置的mainifest-path下,使用wget把url内的配置文件下载下来即立即创建(配置文件有误的情况不会创建)

    1. [root@k8s-master manifests]# wget http://47.115.228.189/web.yaml
    2. --2023-11-11 17:10:02-- http://47.115.228.189/web.yaml
    3. Connecting to 47.115.228.189:80... connected.
    4. HTTP request sent, awaiting response... 200 OK
    5. Length: 185 [application/octet-stream]
    6. Saving to: ‘web.yaml’
    7. 100%[========================================================================================>] 185 --.-K/s in 0s
    8. 2023-11-11 17:10:02 (50.0 MB/s) - ‘web.yaml’ saved [185/185]
    9. [root@k8s-master manifests]# kubectl get pods -n myns
    10. NAME READY STATUS RESTARTS AGE
    11. myweb-k8s-master 0/1 ContainerCreating 0 7s
    12. [root@k8s-master manifests]# kubectl get pods -n myns
    13. NAME READY STATUS RESTARTS AGE
    14. myweb-k8s-master 1/1 Running 0 2m45s
  • 相关阅读:
    echarts公司内部图表(冒死上传)
    WebRTC[52] - WebRTC 带宽分配逻辑详解
    【2023七夕】星河漫舞,七夕的璀璨之夜。分享:七夕表白的前端特效(附完整原代码+详细注释),情不知何起,却一往情深。愿天下有情人终成眷属
    PAN++学习笔记
    科技云报道:混合办公的B面:安全与效率如何兼得?
    flutter plugins插件【三】【Flutter Intl】
    Qt程序打包成安装包exe
    java智慧停车系统源码
    网络安全-抓包和IP包头分析
    ROS自学笔记十六:URDF优化_xacro文件
  • 原文地址:https://blog.csdn.net/weixin_64334766/article/details/134351912