Kubernetes Pod
·
一、理论知识
1. Kubernetes 资源抽象
- 核心概念:Kubernetes 将所有内容抽象为资源。用户通过操作资源来管理集群。
- 最小管理单元:Pod。Kubernetes 不直接管理容器,而是将容器封装在 Pod 中。
- 管理方式:通常不直接管理 Pod,而是通过 Pod 控制器(如 Deployment)来管理。
- 服务访问:通过 Service 资源实现 Pod 间及服务对外的访问。
- 数据持久化:通过 Volume、PVC、PV 等存储系统实现。
2. 资源管理方式
|
类型 |
命令示例 |
适用环境 |
优点 |
缺点 |
|
命令式对象管理 |
|
测试 |
简单快捷 |
无法审计、跟踪,只能操作活动对象 |
|
命令式对象配置 |
|
开发 |
可审计、跟踪 |
项目大时配置文件多,操作麻烦 |
|
声明式对象配置 |
|
生产/开发 |
支持目录操作,版本控制 |
意外情况下难以调试 |
3. Pod 生命周期与架构
- 定义:Pod 是 Kubernetes 创建和管理的最小可部署单元,代表集群中运行的一个进程,拥有唯一 IP。
- 结构:类似“豌豆荚”,包含一个或多个容器(共享 IPC、Network、UTC namespace)。
- 生命周期容器:
-
- Init 容器:在应用容器启动前运行,必须成功完成,支持阻塞启动直到满足先决条件。
- 应用容器:主业务容器。
- 探针 (Probes):
-
- LivenessProbe (存活探针):判断容器是否运行。失败则杀死容器并根据重启策略重启。
- ReadinessProbe (就绪探针):判断容器是否准备好服务请求。失败则从 Service 端点列表中移除 IP。
- StartupProbe (启动探针):判断应用是否已启动。成功前禁用其他探针。
4. 常用资源类型
- 工作负载:Pod (po), Deployment (deploy), ReplicaSet (rs), DaemonSet (ds), StatefulSet (sts), Job, CronJob。
- 服务发现:Service (svc), Ingress (ing)。
- 存储:VolumeAttachment, PersistentVolume (pv), PersistentVolumeClaim (pvc)。
- 配置:ConfigMap (cm), Secret。
- 集群:Nodes (no), Namespaces (ns)。
5. YAML 资源清单关键参数
apiVersion: API 版本 (如v1,apps/v1)。kind: 资源类型 (如Pod,Deployment)。metadata: 元数据 (name, namespace, labels)。spec: 详细定义 (containers, image, ports, resources, probes 等)。- 资源优先级 (QoS):
-
Guaranteed: limits 与 requests 一致且已设定。Burstable: limits 与 requests 不一致。BestEffort: 未设定资源限制。
二、操作命令与实操指南
2.1 集群信息与版本查看
# 显示集群客户端与服务端版本信息
kubectl version
# 显示集群控制平面及核心组件运行信息
kubectl cluster-info
2.2 资源基本管理 (CRUD)
# 查看所有 Pod 资源
kubectl get pod
# 查看某个特定 Pod 的详细信息
kubectl get pod <pod_name>
# 以 YAML 格式展示某个 Pod 的配置
kubectl get pod <pod_name> -o yaml
# 查看资源内部详细信息 (包含事件、IP 节点等)
kubectl describe pods <pod_name>
# 查看资源帮助文档 (例如查看 deployment 的字段说明)
kubectl explain deployment
kubectl explain deployment.spec
# 删除资源 (例如删除名为 web 的 deployment)
kubectl delete deployments.apps web
2.3 Pod 的创建与管理
2.3.1 命令式创建 (自主式 Pod,生产不推荐)
# 创建一个名为 testpod 的 Pod,使用 nginx 镜像
kubectl run testpod --image nginx
# 查看 Pod 运行状态及宽格式输出 (显示 IP 和节点)
kubectl get pods -o wide
# 创建一个交互式 Pod (用于调试)
kubectl run -it testpod --image busybox
# 创建一个非交互式 Pod
kubectl run nginxX --image nginx
2.3.2 控制器管理 (推荐方式)
# 创建一个名为 webcluster 的 Deployment 控制器,镜像 nginx,副本数 2
kubectl create deployment webcluster --image nginx --replicas 2
# 查看控制器状态
kubectl get deployments.apps
# 扩容:将 timinglee deployment 的副本数调整为 6
kubectl scale deployment timinglee --replicas 6
# 缩容:将 timinglee deployment 的副本数调整为 2
kubectl scale deployment timinglee --replicas 2
2.4 调试与日志管理
# 输出容器在 Pod 中的日志
kubectl logs pods/<pod_name>
# 查看特定容器的日志 (多容器 Pod 场景)
kubectl logs <pod_name> -c <container_name>
# 进入运行中的容器 (交互环境)
kubectl attach pods/<pod_name> -it
# 在运行中的 Pod 中执行指定命令 (例如进入 bash)
kubectl exec -it pods/<pod_name> -- /bin/bash
# 将本机文件复制到 Pod 中
kubectl cp <本地文件路径> <pod_name>:/<容器内路径>
# 将 Pod 中的文件复制到本机
kubectl cp <pod_name>:/<容器内文件路径> <本地文件路径>
2.5 声明式配置 (YAML 部署)
2.5.1 生成与 apply
# 利用命令生成 YAML 模板文件 (dry-run 模式)
kubectl create deployment webcluster --image nginx --dry-run=client -o yaml > webcluster.yml
# 利用 YAML 文件生成资源
kubectl apply -f webcluster.yml
# 利用 YAML 文件删除资源
kubectl delete -f webcluster.yml
2.5.2 标签管理
# 查看 Pod 及其标签
kubectl get pods --show-labels
# 给 Pod 添加标签
kubectl label pods <pod_name> app=lee
# 更改标签 (覆盖现有标签)
kubectl label pods <pod_name> app=webcluster --overwrite
# 删除标签 (将值设为 -)
kubectl label pods <pod_name> app-
2.6 应用版本更新与回滚
# 查看 Deployment 的历史版本
kubectl rollout history deployment <deployment_name>
# 更新控制器镜像版本 (将 myapp 容器镜像更新为 v2)
kubectl set image deployments/<deployment_name> myapp=myapp:v2
# 版本回滚到指定版本 (例如回滚到 revision 1)
kubectl rollout undo deployment <deployment_name> --to-revision 1
2.7 高级配置实操 (YAML 示例)
2.7.1 多容器 Pod 与网络共享
# pod.yml 示例:理解 Pod 间网络整合 (容器间通过 localhost 通信)
apiVersion: v1
kind: Pod
metadata:
name: test
labels:
run: timinglee
spec:
containers:
- image: myapp:v1
name: myapp1
- image: busybox:latest
name: busybox
command: ["/bin/sh", "-c", "sleep 1000000"]
- 注释:在 busybox 容器中
curl localhost可访问 myapp1 容器服务,因为同 Pod 容器共享网络 namespace。
2.7.2 资源限制 (QoS 配置)
# pod.yml 示例:设定资源限制 (Guaranteed 类型)
spec:
containers:
- name: myapp
image: myapp:v1
resources:
limits: # 资源使用上限
cpu: 500m
memory: 100M
requests: # 资源请求保障 (与 limits 一致则为 Guaranteed)
cpu: 500m
memory: 100M
2.7.3 存活探针 (Liveness Probe)
# pod.yml 示例:TCP 存活探测
spec:
containers:
- name: myapp
image: myapp:v1
livenessProbe:
tcpSocket: # 检测端口存在性
port: 8080
initialDelaySeconds: 3 # 容器启动后等待 3 秒开始探测
periodSeconds: 1 # 探测间隔 1 秒
timeoutSeconds: 1 # 超时时间 1 秒
- 注释:若端口不通,kubelet 会杀死容器并根据重启策略重启,状态可能显示
CrashLoopBackOff。
2.7.4 就绪探针 (Readiness Probe)
# pod.yml 示例:HTTP 就绪探测
spec:
containers:
- name: myapp
image: myapp:v1
readinessProbe:
httpGet:
path: /test.html # 探测路径
port: 80
initialDelaySeconds: 1
periodSeconds: 3
- 注释:若探测失败 (如 404),Pod 状态为 Running 但 READY 为 0/1,Service 不会将流量转发给该 Pod。需创建对应文件 (如
echo test > /usr/share/nginx/html/test.html) 使其就绪。
2.7.5 Init 容器
# pod.yml 示例:初始化容器
spec:
initContainers:
- name: init-myservice
image: busybox
command: ["sh", "-c", "until test -e /testfile; do echo waiting for myservice; sleep 2; done"]
containers:
- name: myapp
image: myapp:v1
- 注释:主容器
myapp会在init-myservice成功执行完毕 (即/testfile存在) 后才启动。
2.7.6 节点选择与主机网络
# 指定运行节点
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
# 共享宿主机网络 (不使用 Docker 网桥)
spec:
hostNetwork: true
- 注释:
hostNetwork: true时,容器直接使用宿主机网络栈,端口冲突风险增加,且同一宿主机无法启动相同端口的第二个副本。
更多推荐


所有评论(0)