Kubernetes Pod 管理实战详解

一、命令式对象管理

1、命名空间管理

命名空间用于集群资源隔离,不同 namespace 资源相互隔离。

bash 复制代码
# 查看命名空间
kubectl get namespaces

# 创建命名空间
kubectl create namespace timinglee

# 删除命名空间(会删除该命名空间下全部资源)
kubectl delete namespaces timinglee

2、Pod 基础管理

Pod 是 k8s 最小调度单元,一个 Pod 可以包含一个或多个容器。

bash 复制代码
# 查看pod,-o wide显示节点、IP信息
kubectl get pods -o wide

# 创建pod
kubectl run lee --image nginx:latest

# 删除pod
kubectl delete pods lee

# 删除default命名空间下所有pod
kubectl delete pods --all
Pod 异常排查

镜像不存在会出现ImagePullBackOff状态

bash 复制代码
# 查看pod详细事件,定位报错
kubectl describe pods error

常见报错:Failed to pull image xxx:not found,代表镜像仓库找不到对应镜像,检查镜像名称、镜像仓库地址。

二、kubectl 核心命令实操

bash 复制代码
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'

前置准备:上传镜像到私有 Harbor 仓库

bash 复制代码
docker load -i myapp.tar.gz
docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1
docker push reg.timinglee.org/library/myapp:v1

docker tag timinglee/myapp:v2 reg.timinglee.org/library/myapp:v2
docker push reg.timinglee.org/library/myapp:v2

1、create:命令式创建资源

bash 复制代码
# 创建deployment,2副本
kubectl create deployment webcluster --replicas 2 --image myapp:v1

# 查看deployment
kubectl get deployments.apps

# 删除deployment
kubectl delete deployments.apps webcluster

2、edit:直接编辑在线资源 yaml

直接修改集群中运行的资源配置,保存立即生效

bash 复制代码
kubectl create deployment webcluster --image myapp:v1
# 修改副本数replicas
kubectl edit deployments.apps webcluster

3、patch:补丁方式修改资源

不需要完整 yaml,只提交需要修改的字段

bash 复制代码
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'

4、expose:创建 Service 暴露应用

bash 复制代码
# 创建ClusterIP类型service,端口80,后端容器80
kubectl expose deployment webcluster --port 80 --target-port 80

# 查看service
kubectl get service

# 查看service详细信息,查看Endpoints后端pod列表
kubectl describe svc webcluster

# 集群内访问服务
curl 10.97.61.108/hostname.html

5、logs:查看容器日志

bash 复制代码
kubectl logs pods/webcluster-77c87d9946-gh9v7

6、attach:连接容器标准输出

bash 复制代码
kubectl attach pods/testpod -it

7、exec:进入容器执行命令(最常用)

bash 复制代码
# 进入pod容器,多容器需要 -c 指定容器名
kubectl exec -it pods/testpod -c testpod -- /bin/bash

8、cp:宿主机与 pod 容器之间拷贝文件

bash 复制代码
# 容器文件下载到宿主机
kubectl cp testpod:/usr/share/nginx/html/index.html /mnt/test

# 宿主机文件上传到容器
kubectl cp /mnt/index.html testpod:/usr/share/nginx/html/index.html

9、rollout:版本滚动管理

bash 复制代码
# 查看发布状态
kubectl rollout status deployment webcluster

# 重启deployment,全部pod重建
kubectl rollout restart deployment webcluster

10、scale:扩缩副本数量

bash 复制代码
# 扩容到4个副本
kubectl scale deployment webcluster --replicas 4
# 缩容到1个副本
kubectl scale deployment webcluster --replicas 1

11、label:管理资源标签

标签是 k8s 筛选资源的核心

bash 复制代码
# 显示标签
kubectl get pods --show-labels

# 添加标签
kubectl label pods webcluster-9787d97f6-zl6q2 app=webcluster

# 删除标签,标签名后加减号
kubectl label pods webcluster-9787d97f6-zl6q2 app-

三、Deployment 控制器版本更替(滚动更新 & 回滚)

前提 harbor 仓库 library 项目存在myapp:v1myapp:v2镜像

1)编写 yaml 创建 deployment

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp
bash 复制代码
# 导出yaml方式
kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webcluster.yml
kubectl apply -f webcluster.yml

# 暴露为NodePort,外部可以访问
kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort

# 查看版本历史
kubectl rollout history deployment webcluster

2)业务版本升级

bash 复制代码
# 修改镜像版本为v2
kubectl set image deployments webcluster myapp=myapp:v2
# 记录更新原因,写入revision历史
kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite

3)版本回退

bash 复制代码
# 回退到指定revision版本
kubectl rollout undo deployment webcluster --to-revision=1

四、YAML 声明式编写 Pod

1、Pod 多容器

一个 Pod 运行多个容器,pod 内容器共享网络,可以 127.0.0.1 互相访问

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: myapp:v1
    name: myapp1
  - image: busyboxplus:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000

2、hostPort 节点端口映射

将容器端口映射到宿主机节点端口

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: myapp:v1
    name: myapp1
    ports:
    - name: http
      containerPort: 80
      hostPort: 80
      protocol: TCP

3、环境变量 env 注入

bash 复制代码
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

4、nodeSelector 指定调度节点

根据节点标签,强制 pod 调度到指定节点

bash 复制代码
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node2

5、hostNetwork 共享宿主机网络

Pod 直接复用节点网络栈,PodIP = 节点 IP

bash 复制代码
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

6、Pod QoS 资源优先级

集群节点资源不足时,k8s 会驱逐低优先级 Pod

QoS 类型 配置说明 优先级
BestEffort 不配置 requests、limits 最低,优先被驱逐
Burstable requests≠limits 中等
Guaranteed requests=limits 最高,最后驱逐

示例 Burstable:

bash 复制代码
resources:
  limits:
    cpu: 700m
    memory: 200M
  requests:
    cpu: 500m
    memory: 100M

示例 Guaranteed:

bash 复制代码
resources:
  limits:
    cpu: 500m
    memory: 100M
  requests:
    cpu: 500m
    memory: 100M

7、restartPolicy 容器重启策略

  • Always:容器退出永远重启,Deployment 默认策略
  • OnFailure:异常退出(非 0 退出码)才重启
  • Never:无论什么退出,绝不重启
bash 复制代码
spec:
  restartPolicy: OnFailure

五、Pod 生命周期与探针

1、init 容器

Init 容器会在业务容器启动前顺序执行,init 容器全部执行完成后才启动业务容器。常用于等待依赖服务、初始化配置。

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
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: Always

2、livenessProbe 存活探针

检测容器是否正常运行,如果探针失败,k8s 直接重启容器。 示例 tcpSocket 探测 80 端口:

bash 复制代码
containers:
- image: myapp:v1
  name: testpod
  livenessProbe:
    tcpSocket:
      port: 80
    initialDelaySeconds: 3 # 启动后等待3s开始探测
    periodSeconds: 1 # 探测间隔
    timeoutSeconds: 1 # 探测超时时间

3、readinessProbe 就绪探针

检测业务是否就绪,探针失败会将 pod 从 service 的 endpoints 摘除,不再接收流量;不会重启 Pod

bash 复制代码
containers:
- image: myapp:v1
  name: webserver
  readinessProbe:
    httpGet:
      path: /index.html
      port: 80
    initialDelaySeconds: 3
    periodSeconds: 2
    timeoutSeconds: 1

两者区别总结: liveness:容器挂掉,直接重启容器;readiness:业务没准备好,摘掉流量,不重启。

相关推荐
喜欢吃燃面1 小时前
Linux网络编程深度解析:从Socket API到自定义协议设计
linux·网络·arm开发
流星白龙1 小时前
【Docker】9.Docker 镜像仓库实战
运维·docker·容器
想要成为老金高手1 小时前
Kubernetes 实战笔记(一):Pod 管理与 kubectl 核心命令全解
笔记·容器·kubernetes
张洛闻Eren1 小时前
云原生k8s【第六课】:K8s 访问控制
运维·docker·云原生·容器·kubernetes·k8s
Kina_C1 小时前
Kubernetes Pod 全生命周期管理:从命令实操到控制器版本更替
云原生·容器·kubernetes
奇特認2 小时前
kubernetes pod管理
云原生·容器·kubernetes
苹果嘉尔121382 小时前
Linux系统编程——网络(TCP)
linux·运维·服务器
昌原的儿子LEO2 小时前
Linux进程知识点总结
linux·服务器·c语言·数据库
mohesashou2 小时前
k8s控制器管理
云原生·容器·kubernetes