Kubernetes(三) Pod 详解与 YAML 配置实战指南
Kubernetes Pod 详解与 YAML 配置实战指南
一、Pod 基础概念详解
1.1 Pod 的核心概念
Pod 是 Kubernetes 中的最小部署单元,代表集群中的一个运行进程。一个 Pod 可以包含一个或多个紧密耦合的容器,这些容器共享网络和存储资源。
1.2 Pod 的两种使用方式
单容器 Pod(最常见)
apiVersion: v1
kind: Pod
metadata:
name: single-container-pod
spec:
containers:
- name: nginx
image: nginx:1.14
多容器 Pod
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: app
image: my-app:latest
- name: sidecar
image: log-collector:latest
1.3 Pause 容器(基础容器)
在每个 Pod 中,都有一个特殊的 Pause 容器,负责提供 Pod 的 Linux 命名空间基础:
-
维护整个 Pod 的网络和存储空间
-
其他容器共享其网络和存储资源
-
对用户透明,自动运行
1.4 Pod 中的共享资源
网络共享
-
每个 Pod 分配唯一 IP 地址
-
Pod 内所有容器共享该 IP 和端口
-
容器间通过
localhost直接通信 -
与外界通信需使用宿主机端口映射
存储共享
-
Pod 可指定多个共享 Volume
-
所有容器都可访问共享存储
-
确保容器重启后数据不丢失
二、Pod 容器的分类
2.1 基础容器(Infrastructure Container)
# 查看 kubelet 配置中的基础容器镜像
cat /opt/kubernetes/cfg/kubelet | grep pause
2.2 初始化容器(Init Containers)
特性
-
必须在应用容器启动前运行完成
-
按顺序执行,前一个成功后才运行下一个
-
提供阻塞或延迟应用容器启动的机制
使用场景
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
2.3 应用容器(Main Container)
-
并行启动
-
运行业务逻辑的主要容器
三、Pod 的核心配置
3.1 镜像拉取策略(imagePullPolicy)
|
策略 |
说明 |
使用场景 |
|---|---|---|
|
IfNotPresent |
本地有则用本地,否则拉取 |
默认策略,生产环境推荐 |
|
Always |
每次都拉取新镜像 |
开发环境,需要最新版本 |
|
Never |
只用本地镜像 |
离线环境 |
spec:
containers:
- name: nginx
image: nginx:1.15
imagePullPolicy: IfNotPresent
3.2 重启策略(restartPolicy)
|
策略 |
说明 |
适用控制器 |
|---|---|---|
|
Always |
总是重启 |
Deployment、StatefulSet |
|
OnFailure |
失败时重启 |
Job、CronJob |
|
Never |
从不重启 |
自主式Pod |
spec:
restartPolicy: Always
四、Pod 资源限制
4.1 资源请求与限制
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
4.2 资源单位详解
CPU 资源单位
-
1 CPU=1000m -
500m= 0.5个CPU -
100m= 0.1个CPU
内存资源单位
-
1 Gi = 1024 Mi
-
1 Mi = 1024 Ki
-
1 G = 1000 M
-
1 M = 1000 K
4.3 实战案例
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: web
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: db
image: mysql
resources:
requests:
memory: "512Mi"
cpu: "0.5"
limits:
memory: "1Gi"
cpu: "1"
五、健康检查(探针)
5.1 三种探针类型
|
探针类型 |
作用 |
失败后果 |
|---|---|---|
|
livenessProbe |
检查容器是否运行 |
重启容器 |
|
readinessProbe |
检查是否就绪接收请求 |
从Service endpoints中剔除 |
|
startupProbe |
检查应用是否启动 |
在成功前其他探针无效 |
5.2 三种检查方法
exec 方式
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
httpGet 方式
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
tcpSocket 方式
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
5.3 就绪检测实战
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget
spec:
containers:
- name: readiness-httpget-container
image: nginx
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: 80
path: /index1.html
initialDelaySeconds: 1
periodSeconds: 3
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 10
六、YAML 配置详解
6.1 YAML 语法规范
-
使用空格缩进,禁止使用Tab
-
缩进空格数不重要,但要同级对齐
-
---表示YAML文件开始 -
#表示注释
6.2 快速生成YAML模板
# 生成Pod模板
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml
# 生成Deployment模板
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml
# 导出现有资源配置
kubectl get svc nginx-service -o yaml
6.3 完整Deployment配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 5
6.4 Service配置示例
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: nginx
七、端口类型详解
7.1 四种端口对比
|
端口类型 |
作用 |
示例 |
|---|---|---|
|
containerPort |
容器内部暴露的端口 |
80 |
|
targetPort |
Pod的端口,Service转发目标 |
80 |
|
port |
Service的端口,集群内部访问 |
80 |
|
nodePort |
节点端口,外部访问入口 |
30080-32767 |
7.2 端口映射关系
外部用户 → nodeIP:nodePort → Service:port → Pod:targetPort → Container:containerPort
八、实战技巧总结
8.1 常用命令速查
# 查看API版本
kubectl api-versions
# 查看资源字段说明
kubectl explain pods.spec.containers
# 动态查看Pod状态
kubectl get pods -w
# 查看Pod详细事件
kubectl describe pod <pod-name>
# 进入Pod容器
kubectl exec -it <pod-name> -- bash
8.2 故障排查命令
# 查看Pod日志
kubectl logs <pod-name>
# 查看特定容器日志
kubectl logs <pod-name> -c <container-name>
# 查看节点资源分配
kubectl describe nodes <node-name>
# 查看Endpoints
kubectl get endpoints
8.3 最佳实践建议
-
资源设置:始终设置requests和limits,避免资源竞争
-
健康检查:配置完整的探针,确保应用稳定性
-
镜像策略:生产环境使用IfNotPresent,开发环境可用Always
-
版本控制:使用稳定的API版本,避免使用beta版本
-
标签管理:使用有意义的标签,便于服务发现和管理
通过本文的详细讲解和实战案例,您应该能够深入理解Kubernetes Pod的各个方面,并能够熟练编写和管理YAML配置文件。记得在实际工作中多练习、多实践,逐步掌握Kubernetes的强大功能。
更多推荐
所有评论(0)