ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

k8S的pod管理

k8S的pod管理 一.命令对象管理1.命名空间管理命名空间用于集群资源隔离把集群逻辑划分为多个虚拟集群[rootk8s-master ~]# kubectl get namespaces #查看命名空间 [rootk8s-master ~]# kubectl create namespace dev #创建命名空间 [rootk8s-master ~]# kubectl delete namespacesns dev #删除命名空间2.pod管理epod是运行程序的最小单元内含容器#查看pod的运行情况和在哪里运行 [rootk8s-master ~]# kubectl get pods -o wide No resources found in default namespace. #创建pod [rootk8s-master ~]# kubectl run lee --image nginx:latest pod/lee created [rootk8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES lee 1/1 Running 0 25s 10.244.1.10 k8s-node1 none none #当pod创建出现问题 [rootk8s-master ~]# kubectl run error --image lee:v1 [rootk8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES error 0/1 ImagePullBackOff 0 38s 10.244.2.3 k8s-node2 none none #查看pod运行的详细信息 [rootk8s-master ~]# kubectl describe pods error #删除 [rootk8s-master ~]# kubectl delete pods error [rootk8s-master ~]# kubectl delete pods --all二.Kubectl命令1.上传实验镜像到仓库[rootk8s-master ~]# docker load -i myapp.tar.gz [rootk8s-master ~]# docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1 [rootk8s-master ~]# docker push reg.timinglee.org/library/myapp:v1 [rootk8s-master ~]# docker tag timinglee/myapp:v2 reg.timinglee.org/library/myapp:v2 [rootk8s-master ~]# docker push reg.timinglee.org/library/myapp:v22.生成实验所需的yml文件[rootk8s-master ~]# vim replica.yml apiVersion: apps/v1 kind: ReplicaSet metadata: labels: app: replica #设定控制器标签 name: replica spec: replicas: 2 #启动pod数量 selector: matchLabels: app: replica #控制器标签选择器 template: metadata: labels: app: replica #开启pod的属性模板 spec: containers: - image: myapp:v1 name: myapp3.kubectl命令create[rootk8s-master ~]# kubectl create deployment webcluster --replicas 2 --image myapp:v1edit[rootk8s-master ~]# kubectl edit deployments.apps webcluster #在线修改存在的资源patch[rootk8s-master ~]# kubectl patch deployments.apps webcluster -p {spec:{replicas:1}} #局部更新补丁只修改指定字段不替换整个资源配置exposekubectl expose deployment webcluster --port 80 --target-port 80 #kubectl expose 专门给资源 (deployment/pod/rs) 快速创建 Service 的命令。 #deployment webcluster 要暴露的资源类型和名字给 webcluster 这个 Deployment 下的所有 Pod 做服务。 #--port 80 Service 自身的端口集群内其他 Pod 访问就用这个端口。 集群内访问webcluster:80 #--target‑port 80 Pod 内部容器的端口流量最终转发到 Pod 容器的 80 端口。 流量走向 客户端 → Service:80 → 转发到后端 Pod 的 target‑port (80)logs[rootk8s-master ~]# kubectl logs pods/webcluster-77c87d9946-gh9v7 #查看指定容器的日志attach[rootk8s-master ~]# kubectl attach pods/testpod -it #attach 连接到 Pod 里面正在运行的容器挂载容器的标准输入输出终端直接看容器当前控制台输出可以交互execrootk8s-master ~]# kubectl exec -it pods/testpod -c testpod -- /bin/bash #进去容器内部cpkubectl cp testpod:/usr/share/nginx/html /mnt/ #在K8sPod容器 ↔ 宿主机节点之间拷贝文件 / 目录类似 Linux 的scprollout[rootk8s-master pod]# kubectl rollout status deployment webcluster #专门管理资源版本滚动的命令组scale[rootk8s-master pod]# kubectl scale deployment webcluster --replicas 4 #专门用来修改控制器副本数的快捷命令label[rootk8s-master pod]# kubectl label pods webcluster-9787d97f6-zl6q2 app- pod/webcluster-9787d97f6-zl6q2 unlabeled #Label标签给 k8s 资源打 keyvalue 键值对标记用于筛选、匹配资源Service、Deployment 靠标签选 Pod三.利用控制器实习版本更替1.建立控制器[rootk8s-master ~]# kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-runclient -o yaml webcluster.yml rootk8s-master ~]# vim webcluster.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: webcluster name: webcluster spec: replicas: 2 # 期望副本数 selector: matchLabels: app: webcluster # 标签选择器匹配pod模板的label template: metadata: labels: app: webcluster # Pod的标签必须和selector.matchLabels一致 spec: containers: - image: myapp:v1 name: myapp [rootk8s-master ~]# kubectl apply -f webcluster.yml deployment.apps/webcluster created [rootk8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE webcluster-77c87d9946-2xl44 1/1 Running 0 3s webcluster-77c87d9946-cd9zv 1/1 Running 0 3s [rootk8s-master ~]# kubectl rollout history deployment webcluster deployment.apps/webcluster REVISION CHANGE-CAUSE 1 none [rootk8s-master ~]# kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort [rootk8s-master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 none 443/TCP 24h webcluster NodePort 10.99.3.32 none 80:30713/TCP 2m54s [Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713/hostname.html2.更新版本[rootk8s-master ~]# kubectl set image deployments webcluster myappmyapp:v2 deployment.apps/webcluster image updated [rootk8s-master ~]# kubectl annotate deployment webcluster kubernetes.io/change-causemyappv2 --overwrite #为此次更新设定标签 [rootk8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE webcluster-6c8b4bb9d7-hpxf7 1/1 Running 0 7s webcluster-6c8b4bb9d7-kz46j 1/1 Running 0 8s [rootk8s-master ~]# kubectl rollout history daemonset deployment statefulset [rootk8s-master ~]# kubectl rollout history deployment webcluster #查看历史版本 deployment.apps/webcluster REVISION CHANGE-CAUSE 1 none 2 none [2026-08-21 11:30.21] ~ [Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:307133.版本回滚[rootk8s-master ~]# kubectl rollout history deployment webcluster deployment.apps/webcluster REVISION CHANGE-CAUSE 2 none 3 none [rootk8s-master ~]# kubectl rollout undo deployment webcluster --to-revision 3四.利用yuml文件声明资源1.在pod中运行多个容器[rootk8s-master ~]# kubectl run testpod --image myapp:v1 --dry-runclient -o yaml testpod.yaml [rootk8s-master ~]# vim testpod.yaml apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: containers: #是数组列表下面有多少个-即多少个容器 - image: myapp:v1 #容器名称1 name: myapp1 - image: busyboxplus:latest #容器名称2 name: busybox command: - /bin/sh - -c - sleep 100002.在pod运行的主机中暴露多个端口[rootk8s-master pod]# vim testpod.yaml apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: containers: - image: myapp:v1 name: myapp1 ports: - name: http containerPort: 80 #pod内部容器端口 hostPort: 80 #pod所在节点端口 protocol: TCP #端口所用协议3.在pod中指定变量[rootk8s-master pod]# vim mysql.yml apiVersion: v1 kind: Pod metadata: labels: run: mysql name: mysql spec: containers: - image: mysql:8.0 name: mysql8 env: - name: MYSQL_ROOT_PASSWORD #指定变量和密码 value: lee - image: phpmyadmin:latest name: mysqladmin env: - name: PMA_ARBITRARY value: 1 ports: - name: phpadminport containerPort: 80 hostPort: 80 protocol: TCP4.选择运行的节点rootk8s-master ~]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master Ready control-plane 29h v1.35.7 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io/hostnamek8s-master,kubernetes.io/oslinux,node-role.kubernetes.io/control-plane,node.kubernetes.io/exclude-from-external-load-balancers k8s-node1 Ready none 29h v1.35.7 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io/hostnamek8s-node1,kubernetes.io/oslinux k8s-node2 Ready none 24h v1.35.7 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io/hostnamek8s-node2,kubernetes.io/oslinux [rootk8s-master pod]# vim mysql.yml apiVersion: v1 kind: Pod metadata: labels: run: mysql name: mysql spec: nodeSelector: #选择节点 kubernetes.io/hostname: k8s-node2 containers: - image: mysql:8.0 name: mysql8 env: - name: MYSQL_ROOT_PASSWORD value: lee - image: phpmyadmin:latest name: mysqladmin env: - name: PMA_ARBITRARY value: 1 ports: - name: phpadminport containerPort: 80 hostPort: 80 protocol: TCP5.共享宿主机网络[rootk8s-master pod]# vim testpod.yaml apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: hostNetwork: true #开启宿主机网络共享 containers: - image: busybox:latest name: busybox command: - /bin/sh - -c - sleep 100006.资源优先级6.1besteffort不做资源限制即yml文件中没有队limits字段的配置[rootk8s-master pod]# kubectl describe pods testpod | grep QoS Class: QoS Class: BestEffort6.2做资源限制且期望值与限制值不同[rootk8s-master pod]# vim testpod.yaml apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: hostNetwork: true containers: - image: busybox:latest name: busybox command: - /bin/sh - -c - sleep 10000 apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: hostNetwork: true containers: - image: busybox:latest name: busybox command: - /bin/sh - -c - sleep 10000 resources: limits: #限制值 cpu: 700m memory: 200M requests: #期望值 cpu: 500m memory: 100M结果是[rootk8s-master pod]# kubectl describe pods testpod | grep QoS Class: QoS Class: Burstable6.3做资源限制且相同[rootk8s-master pod]# vim testpod.yaml apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: hostNetwork: true containers: - image: busybox:latest name: busybox command: - /bin/sh - -c - sleep 10000 apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: hostNetwork: true containers: - image: busybox:latest name: busybox command: - /bin/sh - -c - sleep 10000 resources: limits: cpu: 500m memory: 100M requests: cpu: 500m memory: 100M7.容器重启规则7.1alwaysapiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod spec: hostNetwork: true restartPolicy: Always #重启规则在此处删除容器后pod会重启容器 containers: - image: busybox:latest name: busybox command: - /bin/sh - -c - sleep 607.2onfailure异常关闭会重启正常关闭不会重启7.3never pod绝对不重启五.pod的生命周期1.init容器init容器是串行执行其他容器则是并行执行可用于数据库等管理例让数据存去再去操作。spec: initContainers: # 这里就是初始化容器专门写这个字段 - name: busybox image: busybox:latest command: - /bin/sh - -c - until test -e /testfile;do echo wating for myservice; sleep 2;done containers: # 业务普通容器 - image: myapp:v1 name: webserver restartPolicy: Always2.livness存活指针spec: containers: - image: myapp:v1 name: testpod command: [/bin/sh, -c] args: - | nginx -g daemon off; sleep 10000 # 这里就是存活探针 livenessProbe livenessProbe: tcpSocket: # 检测方式TCP套接字探测端口连通性检测 port: 80 # 检测容器内部80端口是否能连通 initialDelaySeconds: 3 # Pod启动后等待3秒才开始第一次探测 periodSeconds: 1 # 每1秒执行一次探测 timeoutSeconds:1 # 探测超时时间1秒 restartPolicy: Always检测# 查看pod状态如果探测失败会看到Restart计数上涨 kubectl get pod webserver3.readness就绪指针spec: containers: - image: myapp:v1 name: webserver # 就绪探针就在这里 readinessProbe readinessProbe: httpGet: # 检测方式httpGet发GET请求 path: /index.html # 访问容器内 /index.html port: 80 # 访问80端口 initialDelaySeconds: 3 # 启动后等3秒开始探测 periodSeconds: 2 # 每2秒探测一次 timeoutSeconds: 1 # 1秒超时算失败1. 探测成功Pod 状态变为 Ready加入 Service 的 Endpoint 后端Service 可以转发流量到这个 Pod。2. 探测失败Pod 变成 NotReady从 Service 的 Endpoint 列表剔除不会重启容器 只是不给它转发流量。3. 容器继续运行反复探测等探测恢复成功再重新加入 Service 接收请求项目livenessProbe 存活探针readinessProbe 就绪探针字段livenessProbereadinessProbe目的判断容器是否卡死、是否还活着判断容器是否准备好接收流量探测失败行为重启容器不重启容器摘除 Service 流量Pod 状态影响Pod 依然 ReadyRestart 计数增加Pod 变为 NotReady移出 Service 端点
返回列表