瀚海知行

云计算 命令 & YAML 示例

2025/12/01
9
0

常用命令

# 容器管理
docker run [选项] 镜像					# 创建并启动容器
	-it					# 交互式终端(-i 保持输入打开,-t 分配伪终端)
	-d					# 后台运行容器(守护态)
	-p 主机端口:容器端口	# 端口映射(如 -p 8080:80)
	-v 主机路径:容器路径	# 挂载数据卷(如 -v /data:/app)
	--name 容器名		# 指定容器名称
	--network 网络名		# 加入指定网络
	--rm				# 容器退出后自动删除(默认情况仅停止容器但不删除)
	--restart=always	# 设置容器在docker启动时自启
	-h					# 指定容器中的主机名
	--add-host			# 在容器的hosts文件中追加解析
	--dns				# 指定容器所使用的DNS服务器
	-e, --env			# 运行容器时,覆盖ENV声明的变量
	
docker start <容器ID/名称>				# 启动容器
docker stop <容器ID/名称>				# 停止容器
docker restart <容器ID/名称>				# 重启容器
docker rm <容器ID/名称>					# 删除容器(-f 强制删除运行中容器)
	-f					# 强制删除运行中容器
	-v					# 同时删除volume匿名卷
docker ps [选项]							# 查看运行中容器(-a 查看所有容器)
	-a					# 显示所有容器(包括停止的)
	-q					# 只显示容器ID
	-l					# 显示最近创建的容器
	-n 数字				# 显示最近n个创建的容器
	--no-trunc			# 显示完整信息,不进行截取显示
docker logs [选项] <容器ID/名称>			# 查看容器日志(-f 实时跟踪)
	-f					# 实时跟踪日志输出
	-t					# 显示时间戳
	--tail 数字			# 只显示最后n行日志
docker exec [选项] <容器ID/名称> <命令>	# 进入容器执行命令
	-it					# 交互式执行(常用:docker exec -it 容器 bash)
	-d					# 后台执行命令
docker attach			# 连接的是容器的主进程,退出方式不当可能导致容器停止。
docker inspect <容器ID/名称>				# 查看容器详细信息
	docker inspect -f ' {{ .NetworkSettings.IPAddress }} ' 容器ID
# 镜像管理
docker pull [选项] <镜像名:标签>			# 拉取镜像
	--platform 平台		# 指定架构(如 --platform linux/amd64)
docker build [选项] <镜像名:标签> <Dockerfile路径>	# 构建镜像
	-t 镜像名:标签		# 指定镜像名称和标签
	--no-cache			# 不使用缓存构建
	-f Dockerfile文件名	# 指定Dockerfile文件(默认 ./Dockerfile)
	--build-arg 变量=值	# 覆盖Dockerfile中ARG定义的变量,ENV定义的变量无法修改
	<Dockerfile路径>		# 指定上下文的路径(如使用哪个目录的默认Dockerfile文件)
docker history							# 查看镜像的每层
docker image ls							# 查看本地镜像(管理命令)
	-a 					# 显示所有
	-q					# 只显示容器ID
	-f					# 过滤状态
docker images							# 查看本地镜像(普通命令)
docker image rm							# 删除镜像(管理命令)
docker rmi [选项] <镜像ID/名称>			# 删除镜像(普通命令)
	-f					# 强制删除(即使被容器引用)
docker tag <源镜像> <新镜像名:标签>		# 为镜像打标签
docker push <镜像名:标签>				# 推送镜像到仓库
docker save -o							# 将镜像保存成文件
docker load -i							# 将文件还原成镜像
# 网络管理
docker network ls						# 查看网络
docker network create [选项] <网络名>	# 创建网络
	--driver 驱动		# 指定网络驱动(如 bridge/overlay,默认 bridge)
	--subnet 子网		# 配置子网(如 --subnet 192.168.0.0/16)
docker network rm <网络名>				# 删除网络
docker network connect <网络名> <容器名>	# 连接容器到网络

# 数据卷管理
docker volume ls						# 查看卷
docker volume create [选项] <卷名>		# 创建卷
	--driver 驱动		# 指定卷驱动(默认 local)
	--opt 键=值			# 驱动特定选项(如 --opt type=none --opt device=/data)
docker volume rm <卷名>					# 删除卷
docker volume inspect <卷名>				# 查看卷详情

# 系统管理
docker info								# 查看Docker系统信息
docker stats [选项]						# 查看容器资源使用情况
	--no-stream			# 只显示一次统计信息,不实时更新
	--format 格式		# 自定义输出格式(如 "--format {{.Name}}: {{.CPUPerc}}")
docker system prune	[选项]				# 清理无用的容器、镜像、网络(-a 清理更多)
	-a					# 清理所有未使用的镜像(不仅是悬空镜像)
	--volumes			# 同时清理未使用的数据卷
	-f					# 强制清理,不提示确认
	
docker run --rm 镜像名 软件名 --version
# curl 常用选项和参数速查表

# 一、基础请求方法
-X, --request <方法>   指定HTTP方法(GET/POST/PUT/DELETE等),默认GET
        # 示例: curl -X POST https://api.example.com/data
-d, --data <数据>      发送POST数据(键值对),自动设为application/x-www-form-urlencoded
        # 示例: curl -d "name=John&age=30" https://api.example.com/user
--data-raw <数据>      发送原始字符串(不解析特殊字符)
        # 示例: curl --data-raw "name=John&Doe" https://api.example.com/user

# 二、请求头与认证
-H, --header <头部>    添加请求头,可多次使用
        # 示例: curl -H "Content-Type: application/json" -H "Authorization: Bearer token" https://api.example.com/data
-u, --user <用户:密码>  HTTP基础认证
        # 示例: curl -u "admin:123456" https://api.example.com/admin
-b, --cookie <cookie>  发送Cookie数据
        # 示例: curl -b "sessionId=abc123; user=John" https://api.example.com/profile
-c, --cookie-jar <文件> 保存服务器返回的Cookie到文件
        # 示例: curl -c cookies.txt https://api.example.com/login

# 三、文件传输与下载
-O, --remote-name      保存文件,文件名与远程一致
        # 示例: curl -O https://example.com/file.zip
-o, --output <文件名>  指定本地保存文件名
        # 示例: curl -o local_file.txt https://example.com/remote_file.txt
-L, --location         自动跟随重定向(301/302)
        # 示例: curl -L -O https://short.url/redirect
-C -, --continue-at -  断点续传
        # 示例: curl -C - -O https://example.com/large_file.iso

# 四、调试与信息展示
-v, --verbose          显示详细请求/响应过程(调试用)
        # 示例: curl -v https://example.com
-i, --include          显示响应头+响应体
        # 示例: curl -i https://example.com
-I, --head             只请求头部信息(类似HEAD方法)
        # 示例: curl -I https://example.com

# 五、其他实用选项
-k, --insecure         忽略SSL证书验证(测试用)
        # 示例: curl -k https://self-signed.example.com
-s, --silent           静默模式(不显示进度/错误)
        # 示例: curl -s https://api.example.com/data | jq
-x, --proxy <代理>     通过代理服务器请求
        # 示例: curl -x http://proxy:8080 https://example.com
# 集群基本信息查看
kubectl cluster-info                # 查看集群基本信息(API服务器地址等)
kubectl get nodes                   # 列出所有节点及其状态
kubectl describe node <node-name>   # 查看指定节点的详细信息(资源、标签等)
kubectl describe pods <pod-name>


# 工作负载资源管理(Pod/Deployment等)
kubectl get pods                    # 列出当前命名空间的所有Pod
kubectl get pods -n <namespace>     # 列出指定命名空间的Pod
kubectl get pods -o wide            # 显示Pod的IP、所在节点等详细信息
kubectl get pods -A					# 列出所有命名空间中请求的对象
kubectl describe pod <pod-name>     # 查看指定Pod的详细信息(事件、容器配置等)
kubectl logs <pod-name>             # 查看指定Pod的日志
kubectl logs -f <pod-name>          # 实时跟踪指定Pod的日志
kubectl exec -it <pod-name> -- bash # 进入指定Pod的容器交互终端

kubectl get deployments             # 列出当前命名空间的所有Deployment
kubectl get deploy <deploy-name>    # 查看指定Deployment的状态
kubectl create deployment <name> --image=<image> # 创建基础Deployment
kubectl apply -f <yaml-file>        # 通过YAML文件创建/更新资源(推荐)
kubectl delete deployment <name>    # 删除指定Deployment

kubectl get statefulsets            # 列出StatefulSet(有状态应用)
kubectl get daemonsets              # 列出DaemonSet(每个节点运行一个副本)
kubectl get jobs                    # 列出一次性任务Job
kubectl get cronjobs                # 列出定时任务CronJob


# 服务与网络管理
kubectl get services                # 列出当前命名空间的所有Service(服务发现)
kubectl get svc <svc-name>          # 查看指定Service的详细信息(IP、端口映射等)
kubectl get ingress                 # 列出Ingress(HTTP/HTTPS路由规则)
kubectl get networkpolicy           # 列出网络策略(控制Pod间通信)

kubectl port-forward pod/<pod-name> 8080:80 # 将Pod的80端口转发到本地8080端口


# 配置与存储管理
kubectl get configmaps              # 列出ConfigMap(非敏感配置)
kubectl get secrets                 # 列出Secret(敏感信息,如密码、证书)
kubectl get persistentvolumes       # 列出集群级存储PV
kubectl get persistentvolumeclaims  # 列出Pod的存储请求PVC


# 命名空间与权限管理
kubectl get namespaces              # 列出所有命名空间
kubectl create namespace <name>     # 创建新命名空间
kubectl get roles                   # 列出命名空间内的角色(权限)
kubectl get clusterroles            # 列出集群级角色


# 资源更新与操作
kubectl set image deployment/<deploy-name> <container-name>=<new-image> # 更新Deployment的镜像
kubectl rollout status deployment/<deploy-name>		# 查看Deployment更新状态
kubectl rollout undo deployment/<deploy-name>		# 回滚Deployment到上一版本
kubectl scale deployment/<deploy-name> --replicas=3 # 调整Deployment的副本数


# 其他常用命令
kubectl api-resources               # 列出集群支持的所有资源类型(kind)
kubectl explain <resource>          # 查看指定资源的YAML配置说明(如kubectl explain pod)
kubectl delete pod <pod-name> --force	# 强制删除卡住的Pod
kubectl top pods						# 查看Pod的CPU和内存使用情况

# 不常用命令
kubectl taint nodes <节点名> <key>=<value>:<effect>	# 设置污点
- kubectl taint nodes worker-01 gpu=yes:NoSchedule
kubectl cordon <node-name>				# 自动给节点打污点(标记为:调度已禁用)
kubectl uncordon <node-name>			# 恢复节点,继续调度
kubectl drain worker-01 				# 
	--ignore-daemonsets # 忽略DaemonSet
  • ctr

# ctr 是 containerd 的命令行工具,用于管理容器、镜像等资源,以下是常用命令及功能

# 镜像管理
ctr images pull <镜像地址>				# 拉取镜像(需指定完整地址,如 docker.io/library/nginx:latest)
ctr images push <镜像地址>				# 推送镜像到仓库
ctr images ls							# 列出所有镜像(可加 -q 只显示ID)
ctr images ls -f "name~nginx"			# 过滤显示名称包含nginx的镜像
ctr images rm <镜像ID/名称>				# 删除指定镜像
ctr images inspect <镜像ID/名称>			# 查看镜像详细信息(配置、层等)
ctr images export <文件> <镜像>			# 导出镜像为tar包
ctr images import <tar包>				# 从tar包导入镜像


# 容器管理(容器是静态定义,需通过task启动)
ctr containers create <镜像> <容器名>	# 创建容器(基于镜像,仅定义不启动)
ctr containers ls						# 列出所有容器
ctr containers ls -q					# 只显示容器ID
ctr containers inspect <容器名/ID>		# 查看容器详细配置
ctr containers rm <容器名/ID>			# 删除指定容器
ctr containers update <容器名> --cpu 2	# 更新容器资源限制(如CPU)


# 任务管理(task是容器的运行实例,关联容器生命周期)
ctr tasks start -d <容器名/ID>		# 启动容器为后台任务(-d 表示 detached 模式)
ctr tasks ls							# 列出所有运行的任务
ctr tasks attach <任务ID/容器名>			# 附加到任务(查看输出,类似docker attach)
ctr tasks logs <任务ID/容器名>			# 查看任务日志
ctr tasks kill <任务ID/容器名>			# 终止任务(类似 docker kill)
ctr tasks rm <任务ID/容器名>				# 删除已停止的任务


# 命名空间管理(containerd用命名空间隔离资源,默认default)
ctr namespaces ls						# 列出所有命名空间
ctr namespaces create <命名空间>			# 创建命名空间
ctr namespaces rm <命名空间>				# 删除命名空间
ctr -n <命名空间> images ls		# 操作指定命名空间的资源(如查看k8s.io命名空间的镜像)


# 快照管理(查看镜像层对应的快照)
ctr snapshots ls						# 列出所有快照
ctr snapshots inspect <快照ID>			# 查看快照详细信息
ctr snapshots rm <快照ID> 				# 删除快照(需先删除依赖的容器)


# 其他常用命令
ctr version								# 查看containerd和ctr版本
ctr info								# 查看containerd系统信息(运行时、存储等)
ctr plugins ls						# 列出containerd加载的插件(如存储、网络插件)
ctr -n k8s.io 							# 对 k8s命名空间进行操作
# kubeadm 是用于初始化、管理 Kubernetes 集群的工具,以下是常用命令及功能

# 集群初始化(控制平面)
kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \  # 指定Pod网络CIDR(需与网络插件匹配,如flannel默认此网段)
  --kubernetes-version=v1.28.0       # 指定K8s版本(可选,默认最新稳定版)
  # 初始化控制平面节点,生成加入集群的命令(包含token和hash)

# 节点加入集群(工作节点/控制平面节点)
kubeadm join 192.168.1.100:6443 \    # 控制平面API服务器地址:端口
  --token abcdef.0123456789abcdef \  # 集群加入token(通过kubeadm token create生成)
  --discovery-token-ca-cert-hash sha256:xxxxxx  # CA证书哈希(init输出中获取)
  # 工作节点加入集群;若加--control-plane则作为控制平面节点加入(需额外参数)

# 重置节点配置(清理集群相关资源)
kubeadm reset
# 清理节点上的K8s配置(证书、kubelet配置等),用于重新初始化或退出集群

# 集群升级相关
kubeadm upgrade plan                # 检查可升级的K8s版本及升级计划
kubeadm upgrade apply v1.28.1       # 执行升级(控制平面节点)
kubeadm upgrade node                # 升级工作节点(需先升级控制平面)

# Token管理(节点加入集群时使用)
kubeadm token create                # 生成新的集群加入token
kubeadm token list                  # 列出所有有效的token
kubeadm token delete <token>        # 删除指定token

# 证书管理
kubeadm certs check-expiration      # 检查集群证书过期时间
kubeadm certs renew all             # 更新所有证书(默认续期1年)
kubeadm certs renew apiserver       # 单独更新API服务器证书

# 配置管理
kubeadm config print init-defaults  # 打印默认的初始化配置(可保存为yaml修改后使用)
kubeadm config images pull          # 预拉取集群所需的镜像(避免init时下载超时)

# 查看版本信息
kubeadm version                     # 显示kubeadm及K8s版本信息

# 检查集群健康状态(控制平面节点)
kubeadm alpha certs check-expiration  # 早期版本证书检查(新版用kubeadm certs)
kubeadm reset pre-flight checks      # 检查重置节点前的环境依赖
# Helm 是 Kubernetes 的包管理工具,用于管理 Charts(预打包的 Kubernetes 资源集合)

# 基础信息
helm version                          	# 查看 Helm 客户端和服务端(Tiller)版本
helm help                              	# 查看 Helm 帮助信息
helm <command> --help                  	# 查看某个命令的详细帮助

# 仓库管理
helm repo add <仓库名> <仓库URL>        	# 添加 Chart 仓库(如 helm repo add stable https://charts.helm.sh/stable)
helm repo update                       	# 更新仓库索引,获取最新 Chart 列表
helm repo list                         	# 列出已添加的仓库
helm repo remove <仓库名>               	# 删除指定仓库
helm repo index <目录>                  	# 基于目录生成仓库索引文件

# Chart 搜索与获取
helm search repo <关键词>               	# 从仓库搜索 Chart
helm search hub <关键词>                	# 从 Helm Hub 搜索 Chart
helm pull <仓库名>/<chart名> --version <版本> --untar  # 拉取 Chart 到本地(--untar 自动解压)
helm create <chart名>                  	# 创建一个新的 Chart 模板
helm lint <chart目录>                  	# 检查 Chart 语法和配置是否正确

# Chart 打包与推送(Helm 3)
helm package <chart目录>                	# 将 Chart 打包成 .tgz 文件
helm push <chart.tgz> <仓库名>          	# 推送 Chart 到远程仓库(需仓库支持 OCI 或 ChartMuseum)

# 安装 Release
helm install <release名> <chart路径/仓库名/chart名> --namespace <命名空间> --create-namespace  # 安装 Chart 到集群
helm install <release名> <chart> --values <yaml文件>  	# 用指定 values 文件覆盖默认配置
helm install <release名> <chart> --set key=value      	# 临时设置配置项

# 升级 Release
helm upgrade <release名> <chart>                  	# 升级 Release 到新 Chart 或配置
helm upgrade <release名> <chart> --values <yaml>  	# 升级并使用新配置
helm upgrade <release名> <chart> --reuse-values   	# 升级时复用之前的 values 配置

# 回滚 Release
helm rollback <release名> <版本号>                	# 回滚到指定版本
helm rollback <release名> <版本号> --dry-run      	# 模拟回滚,不实际执行

# 卸载 Release
helm uninstall <release名>                        	# 卸载 Release(删除相关资源)
helm uninstall <release名> --keep-history         	# 卸载但保留历史记录,便于回滚

# 查看 Release 状态
helm list                                      		# 列出当前命名空间的所有 Release
helm list -A                                   		# 列出所有命名空间的 Release
helm list -A | grep <关键词>                    		# 过滤查看
helm status <release名>                         	# 查看指定 Release 的状态和资源信息
helm history <release名>                        	# 查看 Release 的历史版本
helm get values <release名>                   		# 查看 Release 的 values 配置
helm get manifest <release名>                  	 	# 查看 Release 生成的 Kubernetes 资源清单

# 其他功能
helm template <chart>                           	# 渲染 Chart 模板,不实际部署
helm diff upgrade <release名> <chart>           	# 对比升级前后的差异(需安装 helm-diff 插件)
helm plugin list                                	# 列出已安装插件
helm plugin install <插件URL>                   		# 安装插件
helm plugin uninstall <插件名>                   	# 卸载插件

Docker 加速器

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://u3a2se85.mirror.aliyuncs.com",
    "https://docker.m.daocloud.io",
    "https://ccr.ccs.tencentyun.com"
  ]
}
EOF

常用镜像

nginx:1.22.1

registry.cn-beijing.aliyuncs.com/xxhf/nginx:1.22.1

alpine:3.18

registry.cn-beijing.aliyuncs.com/xxhf/alpine:3.18

Busybox

registry.cn-beijing.aliyuncs.com/xxhf/busybox:latest
ccr.ccs.tencentyun.com/chijinjing/busybox:latest

Rockylinux:9

ccr.ccs.tencentyun.com/chijinjing/rockylinux:9

mysql:8.0

registry.cn-beijing.aliyuncs.com/xxhf/mysql:8.0
ccr.ccs.tencentyun.com/chijinjing/mysql:8.0

wordPress:php7.4

registry.cn-beijing.aliyuncs.com/xxhf/wordpress:php7.4
ccr.ccs.tencentyun.com/chijinjing/wordpress:php7.4

stress

registry.cn-beijing.aliyuncs.com/xxhf/stress:latest

python:3.7-alpine

registry.cn-beijing.aliyuncs.com/xxhf/python:3.7-alpine
ccr.ccs.tencentyun.com/chijinjing/python:3.7-alpine

golang:1.20

registry.cn-beijing.aliyuncs.com/xxhf/golang:1.20
ccr.ccs.tencentyun.com/chijinjing/golang:1.20

iojs:onbuild

registry.cn-beijing.aliyuncs.com/xxhf/iojs:onbuild
ccr.ccs.tencentyun.com/chijinjing/iojs:onbuild

配置文件

  • docker-compose 解释

version: '3.8' 		# 可选,指定Compose语法版本(3.8为较新稳定版)

# 全局配置:定义可被多个服务共享的数据卷
volumes: 			# 命名卷:会被Docker管理(默认存储在/var/lib/docker/volumes/)
  mysql_data: 			# 卷名称,服务中通过${卷名}引用
    driver: local 			# 驱动类型(默认local,还可支持nfs、glusterfs等)
    driver_opts: 			# 驱动选项(如本地卷的权限设置)
      o: bind
      device: /data/mysql 		# 绑定到宿主机的路径(类似-v的宿主机路径)
  # 匿名卷:无需命名,服务中直接使用,会自动生成随机名称

# 全局配置:定义容器间通信的网络
networks:
  frontend: 			# 网络名称
    driver: bridge 			# 网络驱动(默认bridge,还可支持overlay、host等)
    ipam: 					# IP地址管理配置
      driver: default
      config:
        - subnet: 172.20.0.0/16 	# 自定义子网
  backend:
    external: true 			# 引用宿主机已存在的网络(不会自动创建)

# 核心配置:定义服务(容器)
services:
  # 服务1:WordPress应用
  wordpress:
    image: wordpress:php8.1 # 基于的镜像(优先于build)
    build: 					# 若需构建镜像,替代image(二选一或同时存在)
      context: ./wordpress 		# Dockerfile所在目录
      dockerfile: Dockerfile 	# 自定义Dockerfile名称
      args: 					# 构建时的参数(Dockerfile中用ARG接收)
        - PHP_VERSION=8.1
    container_name: wordpress  # 自定义容器名称(默认:项目名_服务名_序号)
    restart: always 	# 重启策略(always/on-failure/unless-stopped/no)
    ports: 				# 端口映射(宿主机:容器)
      - "80:80" 			# 短格式:[宿主机端口]:[容器端口]
      - target: 443 		# 长格式:更详细的配置
        published: 443
        protocol: TCP
        mode: host 				# 映射模式(host/bridge)
    volumes: 			# 数据卷挂载
      - /data/wordpress/wp-content:/var/www/html/wp-content # 绑定挂载(宿主机:容器)
      - mysql_data:/var/lib/mysql # 命名卷挂载(使用全局定义的卷)
      - ./local-config.php:/var/www/html/config.php:ro  # 只读挂载(ro)
    environment: 			# 环境变量(键值对或列表)
      WORDPRESS_DB_HOST: db_wordpress:3306
      - WORDPRESS_DB_USER=wordpress_rw # 列表格式
      - WORDPRESS_DB_PASSWORD=123456
    env_file: 				# 从文件加载环境变量(替代environment的硬编码)
      - ./.env 					# 相对路径的环境变量文件
    depends_on: 			# 启动依赖(确保db_wordpress先启动)
      - db_wordpress 			# 依赖的服务名
    networks: 				# 加入的网络(引用全局定义的网络)
      - frontend
      - backend
    healthcheck: 			# 健康检查配置
      test: ["CMD", "curl", "-f", "http://localhost"]  # 检查命令
      interval: 30s 			# 检查间隔
      timeout: 5s 				# 超时时间
      retries: 3 				# 重试次数
      start_period: 60s 		# 启动后等待多久开始首次检查
    command: ["apache2ctl", "-D", "FOREGROUND"]  # 覆盖容器默认启动命令
    entrypoint: ./custom-entrypoint.sh  # 覆盖容器默认入口点
    working_dir: /var/www/html 	# 容器内的工作目录
    user: www-data 				# 容器内执行命令的用户
    deploy: 					# 用于Swarm集群的部署配置(单机模式忽略)
      replicas: 3 					# 副本数
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

  # 服务2:MySQL数据库
  db_wordpress:
    image: mariadb:10.6
    container_name: db_wordpress
    restart: unless-stopped
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: db_wordpress
    networks:
      - backend
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]
      interval: 30s
      timeout: 5s
      retries: 3

docker-nginx.yaml

version: '3.8'  # 使用较新的Compose语法版本,支持更多功能

# 定义外部依赖:网络和数据卷
networks:
  # 前端网络:供Nginx与其他前端服务通信(如静态资源服务器)
  frontend-network:
    driver: bridge  # 默认桥接网络,适合单机环境
    name: nginx-frontend  # 自定义网络名称,便于外部容器加入

  # 后端网络:供Nginx与后端API服务通信
  backend-network:
    driver: bridge
    name: nginx-backend
    internal: false  # 允许外部访问(若为true则仅内部容器可见)

volumes:
  # 持久化Nginx缓存数据(如proxy_cache)
  nginx-cache:
    driver: local
    driver_opts:
      type: none
      device: ./data/nginx/cache  # 宿主机缓存目录
      o: bind

  # 持久化Nginx日志
  nginx-logs:
    driver: local
    driver_opts:
      type: none
      device: ./data/nginx/logs  # 宿主机日志目录
      o: bind

# 敏感配置:使用secrets存储SSL私钥等敏感信息
secrets:
  # SSL私钥(权限需设为600,避免泄露)
  ssl_private_key:
    file: ./secrets/nginx.key
  # 基础认证密码文件(用于保护特定路径)
  htpasswd:
    file: ./secrets/.htpasswd

# 非敏感配置:使用configs存储Nginx配置文件
configs:
  # Nginx主配置文件
  nginx_main_config:
    file: ./config/nginx.conf
  # 虚拟主机配置(按站点分离)
  nginx_vhost_default:
    file: ./config/conf.d/default.conf
  nginx_vhost_api:
    file: ./config/conf.d/api-proxy.conf
  # SSL配置片段(可复用)
  nginx_ssl_params:
    file: ./config/conf.d/ssl-params.conf

services:
  nginx:
    # 使用官方Alpine镜像(体积小,适合生产环境)
    image: nginx:alpine
    container_name: nginx-proxy  # 自定义容器名称,便于管理

    # 容器重启策略:除非手动停止,否则总是重启(适合生产环境)
    restart: unless-stopped

    # 端口映射:暴露HTTP(80)和HTTPS(443)端口
    ports:
      - target: 80
        published: 80
        protocol: TCP
        mode: host  # 直接绑定宿主机端口,减少转发开销
      - target: 443
        published: 443
        protocol: TCP
        mode: host

    # 环境变量:可在Nginx配置中通过变量引用(需配合envsubst)
    environment:
      - TZ=Asia/Shanghai  # 时区设置
      - NGINX_WORKER_PROCESSES=auto  # 工作进程数(可被配置文件覆盖)

    # 挂载非敏感配置文件(通过configs机制)
    configs:
      - source: nginx_main_config
        target: /etc/nginx/nginx.conf
        mode: 0644  # 配置文件权限:所有者读写,其他只读
      - source: nginx_vhost_default
        target: /etc/nginx/conf.d/default.conf
        mode: 0644
      - source: nginx_vhost_api
        target: /etc/nginx/conf.d/api-proxy.conf
        mode: 0644
      - source: nginx_ssl_params
        target: /etc/nginx/conf.d/ssl-params.conf
        mode: 0644

    # 挂载敏感信息(通过secrets机制,权限更严格)
    secrets:
      - source: ssl_private_key
        target: /etc/nginx/ssl/nginx.key
        mode: 0400  # 私钥权限:仅所有者可读(安全最佳实践)
      - source: htpasswd
        target: /etc/nginx/conf.d/.htpasswd
        mode: 0400

    # 挂载数据卷(持久化数据)
    volumes:
      - nginx-cache:/var/cache/nginx  # 缓存目录
      - nginx-logs:/var/log/nginx     # 日志目录
      - ./data/nginx/html:/usr/share/nginx/html:ro  # 静态文件目录(只读)
      - ./data/nginx/ssl/certs:/etc/nginx/ssl/certs:ro  # SSL证书公钥(非敏感)

    # 加入网络:同时连接前端和后端网络,实现反向代理
    networks:
      - frontend-network
      - backend-network

    # 健康检查:监控Nginx服务状态
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider http://localhost/health || exit 1"]
      interval: 30s        # 检查间隔
      timeout: 5s          # 超时时间
      retries: 3           # 重试次数
      start_period: 60s    # 启动后延迟检查(等待服务就绪)

    # 资源限制:防止Nginx过度占用系统资源
    deploy:
      resources:
        limits:
          cpus: '1'        # 最多使用1个CPU核心
          memory: 512M     # 最多使用512MB内存
        reservations:
          cpus: '0.5'      # 至少预留0.5个CPU核心
          memory: 256M     # 至少预留256MB内存

    # 容器启动前的准备命令(如修改文件权限)
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        # 确保缓存目录权限正确
        chown -R nginx:nginx /var/cache/nginx
        # 启动Nginx(前台运行,确保容器不退出)
        nginx -g 'daemon off;'

  • k8s 的 yaml

# Kubernetes API对象的四大核心属性及主要项
apiVersion:  # 1. API版本,指定对象遵循的Kubernetes API版本
  # 主要项示例:
  - v1			# 核心组资源(如Pod、Service、ConfigMap)
  - apps/v1		# 应用组资源(如Deployment、StatefulSet、DaemonSet)
  - networking.k8s.io/v1	# 网络组资源(如Ingress、NetworkPolicy)
  - batch/v1	# 批处理组资源(如Job、CronJob)

kind:  # 2. 资源类型,指定API对象的类型(大驼峰命名)
  # 主要项示例:
  - Pod				# 最小部署单元
  - Deployment		# 无状态应用控制器
  - StatefulSet		# 有状态应用控制器
  - Service			# 服务发现与负载均衡
  - Ingress			# HTTP/HTTPS路由规则
  - ConfigMap		# 非敏感配置存储
  - Secret			# 敏感信息存储

metadata:  # 3. 元数据,描述对象的基本信息(用于标识和管理)
  # 主要项示例:
  name: my-app			# 对象名称(在命名空间内唯一)
  namespace: default	# 所属命名空间(默认default,用于资源隔离)
  labels: 				# 标签(键值对,用于选择器匹配)
    app: my-app
    env: prod
  annotations: 			# 注解(键值对,用于存储附加信息,不用于选择)
    description: "This is a production app"
    version: "v1.0.0"
  uid: 123e4567-e89b-12d3-a456-426614174000		# 唯一标识符(系统自动生成)
  creationTimestamp: "2023-10-01T08:00:00Z"		# 创建时间(系统自动生成)

spec:  # 4. 期望状态,定义对象的目标状态(不同资源结构不同)
  # 主要项示例(以Pod为例):
  containers: 				# 容器列表
    - name: app-container	# 容器名称
      image: nginx:alpine	# 容器镜像
      ports: 				# 暴露端口
        - containerPort: 80
      resources: 			# 资源限制
        limits:
          cpu: "1"
          memory: "1Gi"
  restartPolicy: Always		# 重启策略(Always/OnFailure/Never)
  nodeSelector: 			# 节点选择器(指定Pod运行在哪些节点)
    disk: ssd
  • k8s的Wordpress-mariadb-pod.yaml

# 1. 持久化存储配置
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/mysql  # 对应宿主机路径
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---

# 2. MariaDB数据库配置(使用MYSQL_环境变量保持兼容)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - name: mariadb
        image: mariadb:10.6
        # 保留MYSQL_前缀环境变量,兼容MySQL
        env:
        - name: MYSQL_ROOT_PASSWORD  # 保持与MySQL一致的变量名
          value: "123456"
        - name: MYSQL_DATABASE
          value: "db_wordpress"
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]
          interval: 30s
          timeout: 5s
          retries: 3
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: mariadb-service
spec:
  selector:
    app: mariadb
  ports:
  - port: 3306
    targetPort: 3306
  clusterIP: None  # 无头服务,类似Docker的服务发现
---

# 3. WordPress应用配置(连接信息保持不变)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:php8.1
        ports:
        - containerPort: 80
        env:
        - name: WORDPRESS_DB_HOST
          value: "mariadb-service:3306"  # 对应Docker的服务名访问
        - name: WORDPRESS_DB_USER
          value: "wordpress_rw"
        - name: WORDPRESS_DB_PASSWORD
          value: "123456"
        volumeMounts:
        - name: wp-content
          mountPath: /var/www/html/wp-content
        - name: local-config
          mountPath: /var/www/html/config.php
          readOnly: true
        livenessProbe:
          exec:
            command: ["curl", "-f", "http://localhost"]
          interval: 30s
          timeout: 5s
          retries: 3
      volumes:
      - name: wp-content
        hostPath:
          path: /data/wordpress/wp-content
      - name: local-config
        hostPath:
          path: ./local-config.php
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
spec:
  selector:
    app: wordpress
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080  # 对应宿主机端口映射
  type: NodePort  # 暴露到宿主机,类似Docker的-p

  • job

apiVersion: batch/v1                      # API版本,batch/v1为稳定版CronJob接口
kind: CronJob                             # 资源类型:定时任务
metadata:
  name: periodic-task-cronjob             # CronJob唯一名称
  labels:
    app: cron-job                         # 用于筛选的自定义标签
spec:
  schedule: "*/5 * * * *"                 # 定时规则(Cron表达式):每5分钟执行一次
  concurrencyPolicy: Allow                # 并发策略:允许前次任务未完成时启动新任务
  startingDeadlineSeconds: 120            # 任务启动超时时间:120秒内未启动视为失败
  successfulJobsHistoryLimit: 3           # 保留成功任务历史记录数量:3个
  failedJobsHistoryLimit: 1               # 保留失败任务历史记录数量:1个
  jobTemplate:                            # 嵌套Job配置,定义每次定时任务的执行内容
    spec:
      completions: 2                      # 每次任务需成功运行2个Pod才算完成
      parallelism: 1                      # 每次最多同时运行1个Pod(控制并发压力)
      activeDeadlineSeconds: 180          # 单个Job超时时间:180秒(3分钟)
      backoffLimit: 2                     # 失败重试次数:最多重试2次
      template:                           # Pod模板:定义任务容器配置
        spec:
          containers:
          - name: periodic-task                # 容器名称
            image: python:3.9-slim             # 基础镜像:轻量Python环境
            command: ["python", "-c"]          # 容器启动命令
            args: [                  # 执行的Python脚本:打印时间、任务ID并模拟耗时
              "import os, time, datetime; 
               now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S');
               print(f'[{now}] 定时任务执行 - 任务ID: {os.environ.get(\"POD_NAME\")}');
               time.sleep(10); 
               print(f'[{now}] 定时任务完成')"
            ]
            env:                               # 环境变量配置
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name     # 注入Pod名称作为任务ID
            resources:                         # 资源限制配置
              requests:                        # 最小资源需求(调度依据)
                cpu: "50m"                     # 50毫核(1核=1000m)
                memory: "32Mi"                 # 32兆内存
              limits:                          # 最大资源限制(超限时可能被终止)
                cpu: "100m"
                memory: "64Mi"
            volumeMounts:                      # 容器内挂载配置
            - name: cron-temp                  # 卷名称(与下方volumes对应)
              mountPath: /tmp/cron             # 容器内挂载路径
          volumes:                             # 卷定义
          - name: cron-temp
            emptyDir: {}                       # 临时存储(随Pod生命周期存在)
          restartPolicy: OnFailure             # 重启策略:仅容器失败时重启
          nodeSelector:            # 节点选择:仅在带"workload=cron"标签的节点运行
            workload: cron
  • ConfigMap.yaml

apiVersion: v1                   # API版本,ConfigMap属于核心v1组
kind: ConfigMap                  # 资源类型,声明为ConfigMap
metadata:
  name: app-config               # ConfigMap的名称(在命名空间内唯一)
  namespace: default             # 所属命名空间(默认default,可自定义)
  labels:                        # 标签,用于筛选和关联相关资源
    app: my-app
    environment: production
data:
  # 1. 简单键值对配置(常用于作为环境变量注入Pod)
  app_mode: "production"         # 应用运行模式(生产/测试)
  log_level: "info"              # 日志输出级别(debug/info/warn/error)
  max_connections: "100"         # 最大连接数限制(注意:值始终为字符串类型)
  timeout_seconds: "30"          # 超时时间(秒)

  # 2. 完整配置文件内容(可挂载为Pod内的文件)
  app.conf: |                    # | 符号表示保留换行符的多行字符串
    # 应用主配置文件
    server:
      port: 8080                 # 服务监听端口
      worker_count: 4            # 工作进程数量
      idle_timeout: 60s          # 连接空闲超时时间
    database:
      host: db-service           # 数据库服务名(K8s内部服务发现)
      port: 3306                 # 数据库端口
      connection_pool: 20        # 连接池大小

  # 3. 短配置项(可作为独立文件挂载)
  cache_ttl: "3600s"             # 缓存过期时间(秒)
  enable_feature_x: "true"       # 功能开关(字符串形式的布尔值)

immutable: false                 # 是否不可变(true=创建后禁止修改,增强安全性)
  • Secret.yaml

apiVersion: v1                   # API版本,Secret属于核心v1组
kind: Secret                     # 资源类型,声明为Secret
metadata:
  name: app-secrets              # Secret的名称(在命名空间内唯一)
  namespace: default             # 所属命名空间
  labels:
    app: my-app
type: Opaque                     # 类型:通用密钥(适用于键值对,其他类型如tls/ssh-auth)

data:                            # 敏感数据(必须是Base64编码后的字符串)
  # 编码方法:echo -n "明文" | base64 (禁止直接填写明文!)
  db_password: "MTIzNDU2"        # 明文:123456(示例密码,生产环境需用强密码)
  api_token: "dGhpc2lzbXlzZWNyZXR0b2tlbg=="  # 明文:thisismysecrettoken
  
  # 存储证书类文件(如TLS证书、私钥)
  tls.crt: |                     # 多行Base64编码的证书内容
    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCRENDQVpPZ0F3SUJBZ0lKQU5CZ2txaGtpRzl3MEJBUUVG
    QUFPQ0FROEFNSUlCQ2dLQ0FRRUF3eE1hV0ErT...  # 省略部分内容
  tls.key: |                     # 多行Base64编码的私钥内容
    LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dn
    U2pBZ0JHQ0NBU0l3RFFZSktvWklodmNOQVFFTE...  # 省略部分内容

stringData:                      # 可选:直接填写明文(K8s会自动Base64编码)
  # 注意:仅用于临时测试,生产环境禁止使用!且键不能与data字段重复
  temp_credential: "temporary-access-key"  # 临时凭证(自动编码为Base64)
  • 基础版 Deployment(无状态 Nginx 应用)

# 示例1:基础版 Deployment(无状态 Nginx 应用)
apiVersion: apps/v1               # API版本(Deployment属于apps/v1组,K8s 1.9+推荐)
kind: Deployment                  # 资源类型:Deployment(无状态应用控制器)
metadata:
  name: nginx-deploy              # Deployment名称(命名空间内唯一)
  namespace: default              # 所属命名空间(默认default,可自定义)
  labels:                         # Deployment自身的标签(用于筛选/管理)
    app: nginx
    tier: frontend
spec:
  replicas: 2                     # 期望的Pod副本数(实现负载均衡和高可用)
  selector:                       # 标签选择器:匹配要管理的Pod(必须与Pod模板labels一致)
    matchLabels:
      app: nginx
      tier: frontend
  template:                       # Pod模板:定义每个Pod的配置(核心部分)
    metadata:
      labels:                     # Pod的标签(需与spec.selector.matchLabels完全匹配)
        app: nginx
        tier: frontend
    spec:
      containers:                 # 容器列表(一个Pod可包含多个容器,此处为单容器)
      - name: nginx-container     # 容器名称(Pod内唯一)
        image: nginx:1.25-alpine  # 容器镜像(指定版本,避免使用latest,确保环境一致)
        ports:                    # 容器端口声明(仅用于文档说明,不实际暴露端口)
        - containerPort: 80       # 容器内监听的端口(Nginx默认80端口)
          protocol: TCP           # 协议(TCP/UDP,默认TCP)
        volumeMounts:             # 容器内的卷挂载(可选,此处挂载配置文件)
        - name: nginx-conf        # 卷名称(需与spec.volumes.name对应)
          mountPath: /etc/nginx/conf.d/  # 容器内的挂载路径
          readOnly: true          # 只读挂载(避免配置文件被容器意外修改)
      volumes:                    # Pod的卷配置(供容器挂载使用)
      - name: nginx-conf          # 卷名称(与volumeMounts.name对应)
        configMap:                # 卷类型:引用ConfigMap(存储Nginx配置)
          name: nginx-config      # 引用的ConfigMap名称(需提前创建)
  • 生产级 Deployment(带健康检查/资源限制)

# 示例2:生产级 Deployment(带健康检查/资源限制)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deploy
  namespace: app-prod            # 生产环境命名空间(区分环境)
  labels:
    app: wordpress
    env: production
  annotations:                   # 注解:存储附加信息(如部署说明、监控配置)
    deployment.kubernetes.io/revision: "1"  # 部署版本(自动更新)
    description: "Production WordPress deployment with health checks"
spec:
  replicas: 3                    # 3个副本(高可用,避免单点故障)
  selector:
    matchLabels:
      app: wordpress
      env: production
  strategy:                      # 部署策略(滚动更新配置)
    type: RollingUpdate          # 滚动更新(默认,平滑替换旧Pod)
    rollingUpdate:
      maxSurge: 1                # 最大超出副本数(更新时最多多1个Pod)
      maxUnavailable: 0          # 最大不可用副本数(更新时不允许Pod不可用,确保服务连续)
  minReadySeconds: 10            # 新Pod就绪后,等待10秒再继续更新(确认Pod稳定)
  template:
    metadata:
      labels:
        app: wordpress
        env: production
    spec:
      containers:
      - name: wordpress
        image: wordpress:php8.1-fpm-alpine  # 精简镜像(减少攻击面)
        imagePullPolicy: IfNotPresent       # 镜像拉取策略:本地有则不拉取(节省资源)
        ports:
        - containerPort: 9000               # PHP-FPM默认端口
        env:                                # 环境变量(引用Secret/ConfigMap)
        - name: WORDPRESS_DB_HOST           # 数据库地址(引用Secret)
          valueFrom:
            secretKeyRef:
              name: mysql-secrets           # 引用的Secret名称
              key: db_host                  # Secret中的键
        - name: WORDPRESS_DB_USER           # 数据库用户(引用ConfigMap)
          valueFrom:
            configMapKeyRef:
              name: wordpress-config        # 引用的ConfigMap名称
              key: db_user
        resources:                          # 资源限制(避免资源抢占)
          requests:                         # 最小资源需求(调度时参考)
            cpu: "100m"                     # 100毫核(0.1CPU)
            memory: "128Mi"                 # 128MB内存
          limits:                           # 最大资源限制(超出会被限流/杀死)
            cpu: "500m"                     # 最大500毫核
            memory: "512Mi"                 # 最大512MB内存
        livenessProbe:                      # 存活探针(检测容器是否存活,失败则重启)
          exec:                             # 执行命令检查(PHP-FPM进程是否存在)
            command: ["pgrep", "php-fpm"]
          initialDelaySeconds: 30           # 容器启动30秒后再开始检查(避免启动中误判)
          periodSeconds: 10                 # 每10秒检查一次
          timeoutSeconds: 5                 # 检查超时时间(5秒没响应算失败)
          failureThreshold: 3               # 连续3次失败则判定容器死亡,触发重启
        readinessProbe:                     # 就绪探针(检测容器是否可用,失败则移除服务转发)
          tcpSocket:                        # 端口检查(PHP-FPM端口是否通)
            port: 9000
          initialDelaySeconds: 20
          periodSeconds: 5
        volumeMounts:
        - name: wp-data                     # 挂载WordPress数据卷
          mountPath: /var/www/html
          subPath: html                     # 子路径(避免覆盖卷内其他目录)
        - name: php-conf                    # 挂载PHP配置
          mountPath: /usr/local/etc/php/conf.d/custom.ini
          subPath: custom.ini               # 单个文件挂载(避免覆盖整个目录)
          readOnly: true
      volumes:
      - name: wp-data                       # 数据卷:使用PVC(持久化存储)
        persistentVolumeClaim:
          claimName: wp-pvc                 # 引用的PVC名称(需提前创建)
      - name: php-conf                      # 配置卷:引用ConfigMap
        configMap:
          name: php-config
          items:                            # 只挂载指定文件(避免冗余)
          - key: custom.ini
            path: custom.ini
      imagePullSecrets:                     # 私有镜像仓库拉取凭证(可选)
      - name: registry-cred                 # 引用存储仓库凭证的Secret名称

Namespec (命名空间)
  • 命名空间用于在集群中创建逻辑隔离,将资源划分到不同的虚拟集群中。

apiVersion: v1                  # API 版本,命名空间资源使用 v1 版本
kind: Namespace                 # 资源类型,此处指定为 Namespace
metadata:                       # 元数据部分,包含资源的基本信息
  name: my-app-namespace        # 命名空间的名称,在集群中必须唯一
  labels:                       # 标签,用于对资源进行分类和筛选
    environment: production     # 环境标签,标识此命名空间用于生产环境
    project: my-app             # 项目标签,标识此命名空间属于哪个项目
  annotations:                  # 注解,用于存储资源的额外说明信息
    # 描述信息,通常用于说明命名空间的用途
    description: "Namespace for my application components including frontend, backend and database"
ConfigMap(配置映射)
  • ConfigMap 用于存储非敏感的配置信息,供 Pod 中的容器使用。

apiVersion: v1                  # API 版本,ConfigMap 资源使用 v1 版本
kind: ConfigMap                 # 资源类型,此处指定为 ConfigMap
metadata:                       # 元数据部分,包含资源的基本信息
  name: app-config              # ConfigMap 的名称,在命名空间内唯一
  namespace: my-app-namespace   # 所属命名空间,指定此资源属于哪个命名空间
  labels:                       # 标签,用于对资源进行分类和筛选
    app: my-app                 # 应用标签,标识此配置属于哪个应用
data:                           # 配置数据部分,存储键值对形式的配置信息
  # 键值对形式的简单配置项
  app.environment: "production" # 应用运行环境配置,此处为生产环境
  log.level: "info"             # 日志级别配置,此处为 info 级别
  
  # 完整配置文件内容,使用 | 保留换行符
  app.properties: |             # 应用主配置文件内容
    server.port=8080            # 应用服务端口
    database.host=db-service    # 数据库服务地址(对应Service名称)
    database.port=5432          # 数据库服务端口
    cache.enabled=true          # 是否启用缓存
    timeout.seconds=30          # 超时设置,单位为秒
Secret(密钥)
  • Secret 用于存储敏感信息,如密码、令牌或密钥,与 ConfigMap 类似但用于敏感数据。

apiVersion: v1                  # API 版本,Secret 资源使用 v1 版本
kind: Secret                    # 资源类型,此处指定为 Secret
metadata:                       # 元数据部分,包含资源的基本信息
  name: app-secrets             # Secret 的名称,在命名空间内唯一
  namespace: my-app-namespace   # 所属命名空间,指定此资源属于哪个命名空间
  labels:                       # 标签,用于对资源进行分类和筛选
    app: my-app                 # 应用标签,标识此密钥属于哪个应用
type: Opaque                    # Secret 类型,Opaque 表示存储任意字符串
data:                           # 数据部分,所有值必须是 base64 编码的字符串
  # 注意:实际使用时需要将明文转换为 base64 编码
  db.username: YWRtaW4=         # 数据库用户名,base64 编码的 "admin"
  db.password: cGFzc3dvcmQxMjM= # 数据库密码,base64 编码的 "password123"
stringData:                     # 字符串数据,会自动被编码为 base64
  # 无需手动进行base64编码,Kubernetes会自动处理
  api.token: "my-super-secret-token"  # API 访问令牌,敏感信息
  ssh.private-key: |            # SSH私钥,多行文本
    -----BEGIN RSA PRIVATE KEY-----
    MIIEpAIBAAKCAQEAv6...
    -----END RSA PRIVATE KEY-----
Pod(容器组)
  • Pod 是 Kubernetes 最小的部署单元,包含一个或多个容器。

apiVersion: v1                  # API 版本,Pod 资源使用 v1 版本
kind: Pod                       # 资源类型,此处指定为 Pod
metadata:                       # 元数据部分,包含资源的基本信息
  name: my-app-pod              # Pod 的名称,在命名空间内必须唯一
  namespace: my-app-namespace   # 所属命名空间,指定此资源属于哪个命名空间
  labels:                       # 标签,用于对资源进行分类和筛选
    app: my-app                 # 应用标签,标识此Pod属于哪个应用
    tier: frontend              # 层级标签,表示这是前端服务
spec:                           # 规格部分,定义 Pod 的运行规格和行为
  containers:                   # 容器列表,一个Pod可以包含多个容器
  - name: app-container         # 容器名称,在Pod内必须唯一
    image: my-app-image:1.0.0   # 容器使用的镜像及版本标签
    imagePullPolicy: IfNotPresent  # 镜像拉取策略:本地不存在时拉取
    ports:                      # 容器端口配置,声明容器监听的端口
    - containerPort: 8080       # 容器内应用实际监听的端口号
      name: http                # 端口名称,便于识别和引用
      protocol: TCP             # 协议类型,TCP或UDP
    resources:                  # 资源需求和限制配置
      requests:                 # 资源请求,调度时用于节点选择
        cpu: "100m"             # CPU 请求,100m 即 0.1 核
        memory: "128Mi"         # 内存请求,128兆字节
      limits:                   # 资源限制,防止容器过度使用资源
        cpu: "500m"             # CPU 上限,0.5核
        memory: "256Mi"         # 内存上限,256兆字节
    env:                        # 环境变量配置,注入到容器中
    - name: APP_ENV             # 环境变量名称
      valueFrom:                # 从其他资源获取环境变量值
        configMapKeyRef:        # 从 ConfigMap 获取值
          name: app-config      # 引用的 ConfigMap 名称
          key: app.environment # 引用的 ConfigMap 中的键
    - name: DB_USERNAME         # 数据库用户名环境变量
      valueFrom:
        secretKeyRef:           # 从 Secret 获取值
          name: app-secrets     # 引用的 Secret 名称
          key: db.username      # 引用的 Secret 中的键
    volumeMounts:               # 卷挂载配置,将卷挂载到容器内路径
    - name: config-volume       # 卷名称,需与下面的 volumes 配置对应
      mountPath: /app/config    # 容器内的挂载路径
      readOnly: true            # 只读权限,防止容器修改配置
    livenessProbe:              # 存活探针,用于检测容器是否正常运行
      httpGet:                  # 使用 HTTP 请求进行健康检查
        path: /health           # 健康检查的HTTP路径
        port: 8080              # 健康检查的端口
      initialDelaySeconds: 30   # 容器启动后延迟多久开始第一次检查
      periodSeconds: 10         # 检查间隔时间,单位秒
    readinessProbe:             # 就绪探针,检查容器是否可以接收请求
      httpGet:
        path: /ready            # 就绪检查的HTTP路径
        port: 8080              # 就绪检查的端口
      initialDelaySeconds: 5    # 启动后延迟5秒开始检查
      periodSeconds: 5          # 检查间隔时间,单位秒
  volumes:                      # 卷定义,供容器挂载使用
  - name: config-volume         # 卷名称,与上面的 volumeMounts 对应
    configMap:                  # 使用 ConfigMap 作为卷的数据源
      name: app-config          # 引用的 ConfigMap 名称
  restartPolicy: Always         # 重启策略:总是重启容器
Deployment(部署)
  • Deployment 用于管理 Pod 和 ReplicaSet,提供声明式更新能力。

apiVersion: apps/v1             # API 版本,Deployment 资源使用 apps/v1 版本
kind: Deployment                # 资源类型,此处指定为 Deployment
metadata:                       # 元数据部分,包含资源的基本信息
  name: my-app-deployment       # Deployment 的名称,在命名空间内必须唯一
  namespace: my-app-namespace   # 所属命名空间,指定此资源属于哪个命名空间
  labels:                       # 标签,用于对资源进行分类和筛选
    app: my-app                 # 应用标签,标识此Deployment属于哪个应用
spec:                           # 规格部分,定义 Deployment 的运行规格
  replicas: 3                   # 期望的 Pod 副本数,指定运行多少个相同的Pod
  selector:                     # 选择器,用于确定 Deployment 管理哪些 Pod
    matchLabels:                # 通过标签匹配 Pod
      app: my-app               # 匹配具有 app=my-app 标签的 Pod
      tier: frontend            # 匹配具有 tier=frontend 标签的 Pod
  strategy:                     # 更新策略,定义如何更新Pod
    type: RollingUpdate         # 滚动更新策略:逐步替换旧Pod
    rollingUpdate:              # 滚动更新的具体配置
      maxSurge: 1               # 最多可以超出期望副本数的数量
      maxUnavailable: 1         # 更新过程中最多不可用的副本数
  minReadySeconds: 5            # 新创建的 Pod 至少运行多久才被视为可用
  template:                     # Pod 模板,用于创建新的 Pod
    metadata:                   # Pod 的元数据
      labels:                   # Pod 的标签,需与上面的 selector 匹配
        app: my-app
        tier: frontend
    spec:                       # Pod 的规格
      containers:
      - name: app-container     # 容器名称,在Pod内必须唯一
        image: my-app-image:1.0.0  # 容器使用的镜像及版本标签
        imagePullPolicy: IfNotPresent  # 镜像拉取策略:本地不存在时拉取
        ports:                  # 容器端口配置
        - containerPort: 8080   # 容器内应用实际监听的端口号
          name: http            # 端口名称
          protocol: TCP         # 协议类型
        resources:              # 资源需求和限制配置
          requests:             # 资源请求
            cpu: "100m"         # CPU 请求,100m 即 0.1 核
            memory: "128Mi"     # 内存请求
          limits:               # 资源限制
            cpu: "500m"         # CPU 上限
            memory: "256Mi"     # 内存上限
        env:                    # 环境变量配置
        - name: APP_ENV         # 环境变量名称
          valueFrom:            # 从其他资源获取值
            configMapKeyRef:    # 从 ConfigMap 获取
              name: app-config  # 引用的 ConfigMap 名称
              key: app.environment # 引用的键
        - name: DB_USERNAME     # 数据库用户名环境变量
          valueFrom:
            secretKeyRef:       # 从 Secret 获取
              name: app-secrets # 引用的 Secret 名称
              key: db.username  # 引用的键
        volumeMounts:           # 卷挂载配置
        - name: config-volume   # 卷名称,与下面的 volumes 对应
          mountPath: /app/config  # 容器内的挂载路径
          readOnly: true        # 只读权限
        livenessProbe:          # 存活探针
          httpGet:              # 使用 HTTP 请求检查
            path: /health       # 健康检查路径
            port: 8080          # 健康检查端口
          initialDelaySeconds: 30  # 启动后延迟检查时间
          periodSeconds: 10     # 检查间隔时间
        readinessProbe:         # 就绪探针
          httpGet:
            path: /ready        # 就绪检查路径
            port: 8080          # 就绪检查端口
          initialDelaySeconds: 5  # 启动后延迟检查时间
          periodSeconds: 5      # 检查间隔时间
      volumes:                  # 卷定义
      - name: config-volume     # 卷名称,与上面的 volumeMounts 对应
        configMap:              # 使用 ConfigMap 作为卷
          name: app-config      # 引用的 ConfigMap 名称
Service(服务)
  • Service 为 Pod 提供稳定的网络访问点,即使 Pod 发生变化也能保持访问的一致性。

apiVersion: v1                  # API 版本,Service 资源使用 v1 版本
kind: Service                   # 资源类型,此处指定为 Service
metadata:                       # 元数据部分,包含资源的基本信息
  name: my-app-service          # Service 的名称,在命名空间内必须唯一
  namespace: my-app-namespace   # 所属命名空间,指定此资源属于哪个命名空间
  labels:                       # 标签,用于对资源进行分类和筛选
    app: my-app                 # 应用标签,标识此Service属于哪个应用
spec:                           # 规格部分,定义 Service 的运行规格
  selector:                     # 选择器,用于匹配要暴露的 Pod
    app: my-app                 # 匹配具有此标签的 Pod
    tier: frontend              # 匹配具有此标签的 Pod
  ports:                        # 端口配置,定义服务的端口映射
  - name: http                  # 端口名称,便于识别
    port: 80                    # Service 暴露的端口,集群内可访问
    targetPort: 8080            # 目标 Pod 上的端口,与容器监听端口一致
    protocol: TCP               # 协议类型,TCP或UDP
  type: ClusterIP               # Service 类型:仅集群内部可访问
Ingress(入口)
  • Ingress 管理外部访问到集群服务的规则,通常用于 HTTP/HTTPS 流量路由。

apiVersion: networking.k8s.io/v1  # API 版本,Ingress 使用 networking.k8s.io/v1
kind: Ingress                     # 资源类型,此处指定为 Ingress
metadata:                         # 元数据部分,包含资源的基本信息
  name: my-app-ingress            # Ingress 名称,在命名空间内必须唯一
  namespace: my-app-namespace     # 所属命名空间,指定此资源属于哪个命名空间
  labels:                         # 标签,用于对资源进行分类和筛选
    app: my-app                   # 应用标签,标识此Ingress属于哪个应用
  annotations:                    # 注解,用于配置 Ingress Controller
    nginx.ingress.kubernetes.io/rewrite-target: /  # 重写目标路径
    nginx.ingress.kubernetes.io/ssl-redirect: "true"  # 强制HTTPS重定向
spec:                             # 规格部分,定义 Ingress 的规则
  ingressClassName: nginx         # Ingress 类,指定使用的控制器类型
  rules:                          # 路由规则列表
  - host: example.com             # 主机名,匹配此域名的请求
    http:                         # HTTP 规则配置
      paths:                      # 路径规则列表
      - path: /                   # 匹配的URL路径
        pathType: Prefix          # 路径匹配类型:前缀匹配
        backend:                  # 后端服务配置
          service:                # 服务配置
            name: my-app-service  # 关联的 Service 名称
            port:                 # 服务端口配置
              number: 80          # 端口号,与Service中定义的port一致
  - host: api.example.com         # 另一个主机名的路由规则
    http:
      paths:
      - path: /api                # 匹配以/api开头的路径
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80
  tls:                            # TLS 配置,用于HTTPS
  - hosts:                        # 适用的主机名列表
    - example.com
    - api.example.com
    secretName: app-tls-secret    # 存储TLS证书和私钥的Secret名称
Job(任务)
  • Job 用于管理一次性任务,确保指定数量的 Pod 成功完成任务后终止。

apiVersion: batch/v1            # API 版本,Job 使用 batch/v1 版本
kind: Job                        # 资源类型,此处指定为 Job
metadata:                        # 元数据部分,包含资源的基本信息
  name: data-processing-job      # Job 名称,在命名空间内必须唯一
  namespace: my-app-namespace    # 所属命名空间,指定此资源属于哪个命名空间
  labels:                        # 标签,用于对资源进行分类和筛选
    app: data-processor          # 应用标签,标识此Job属于哪个应用
    type: batch                  # 类型标签,表示这是批处理任务
spec:                            # 规格部分,定义 Job 的运行规格
  completions: 1                 # 需要成功完成的 Pod 数量
  parallelism: 1                 # 并行运行的 Pod 数量
  backoffLimit: 4                # 重试次数上限,超过则视为任务失败
  activeDeadlineSeconds: 3600    # 任务超时时间(秒),超过则终止所有相关Pod
  template:                      # Pod 模板,定义要运行的Pod
    metadata:
      labels:
        app: data-processor
        type: batch
    spec:
      containers:
      - name: data-processor     # 容器名称
        image: data-processor:1.0 # 处理数据的镜像
        command: ["/app/process", "--input", "data.csv", "--output", "result.csv"]  # 执行命令
        resources:
          requests:
            cpu: "200m"          # CPU 请求,200m 即 0.2 核
            memory: "256Mi"      # 内存请求,256兆字节
          limits:
            cpu: "500m"          # CPU 上限,0.5核
            memory: "512Mi"      # 内存上限,512兆字节
        volumeMounts:
        - name: data-volume      # 挂载数据卷的名称
          mountPath: /data       # 容器内的挂载路径
      volumes:
      - name: data-volume        # 卷名称,与上面的 volumeMounts 对应
        persistentVolumeClaim:
          claimName: data-pvc    # 引用PVC获取存储
      restartPolicy: Never       # 重启策略:不重启(失败后Job重建新Pod)
CronJob(定时任务)
  • CronJob 基于时间调度创建 Job,类似 Linux 的 crontab,用于周期性执行任务。

apiVersion: batch/v1            # API 版本,CronJob 使用 batch/v1 版本
kind: CronJob                    # 资源类型,此处指定为 CronJob
metadata:                        # 元数据部分,包含资源的基本信息
  name: backup-cronjob           # CronJob 名称,在命名空间内必须唯一
  namespace: my-app-namespace    # 所属命名空间,指定此资源属于哪个命名空间
  labels:                        # 标签,用于对资源进行分类和筛选
    app: backup-service          # 应用标签,标识此CronJob属于哪个应用
    type: scheduled              # 类型标签,表示这是定时任务
spec:                            # 规格部分,定义 CronJob 的运行规格
  schedule: "0 3 * * *"          # 调度时间,UTC时区,格式与crontab相同,此处表示每天凌晨3点
  timeZone: "UTC"                # 时区设置,默认为UTC
  concurrencyPolicy: Forbid      # 并发策略:禁止并发运行
  startingDeadlineSeconds: 180   # 启动截止时间,超过则视为本次执行失败
  suspend: false                 # 是否暂停任务,true表示暂停所有后续执行
  successfulJobsHistoryLimit: 3  # 保留成功任务历史记录的数量
  failedJobsHistoryLimit: 1      # 保留失败任务历史记录的数量
  jobTemplate:                   # Job 模板,定义要创建的 Job
    spec:
      completions: 1             # 需要成功完成的Pod数量
      parallelism: 1             # 并行运行的Pod数量
      backoffLimit: 2            # 重试次数上限
      template:
        spec:
          containers:
          - name: backup-container  # 容器名称
            image: backup-tool:2.1  # 备份工具镜像
            command: ["/scripts/backup.sh", "--target", "db"]  # 备份命令
            env:
            - name: BACKUP_DIR      # 备份目录环境变量
              value: "/backups"     # 备份目录值
            volumeMounts:
            - name: backup-storage  # 卷名称
              mountPath: /backups   # 容器内挂载路径
          volumes:
          - name: backup-storage    # 卷名称,与上面的 volumeMounts 对应
            persistentVolumeClaim:
              claimName: backup-pvc # 引用的PVC名称
          restartPolicy: OnFailure  # 重启策略:失败时重启容器
DaemonSet(守护进程集)
  • DaemonSet 确保所有(或指定)节点上都运行一个相同的 Pod 副本,常用于日志收集、监控代理等。

apiVersion: apps/v1             # API 版本,DaemonSet 使用 apps/v1 版本
kind: DaemonSet                  # 资源类型,此处指定为 DaemonSet
metadata:                        # 元数据部分,包含资源的基本信息
  name: log-collector-daemonset  # DaemonSet 名称,在命名空间内必须唯一
  namespace: my-app-namespace    # 所属命名空间,指定此资源属于哪个命名空间
  labels:                        # 标签,用于对资源进行分类和筛选
    app: log-collector           # 应用标签,标识此DaemonSet属于哪个应用
    component: monitoring        # 组件标签,表示这是监控组件
spec:                            # 规格部分,定义 DaemonSet 的运行规格
  selector:                      # 选择器,匹配要管理的 Pod
    matchLabels:
      app: log-collector
  updateStrategy:                # 更新策略,定义如何更新DaemonSet
    type: RollingUpdate          # 滚动更新
    rollingUpdate:
      maxUnavailable: 1          # 更新过程中最多不可用的Pod数量
  template:                      # Pod 模板,定义要在每个节点上运行的Pod
    metadata:
      labels:
        app: log-collector
        component: monitoring
    spec:
      hostNetwork: false         # 是否使用主机网络命名空间
      hostPID: false             # 是否共享主机的PID命名空间
      tolerations:               # 容忍度,允许在有污点的节点上运行
      - key: node-role.kubernetes.io/master
        effect: NoSchedule       # 容忍主节点的NoSchedule污点
      containers:
      - name: log-collector      # 容器名称
        image: log-collector:1.5.2  # 日志收集器镜像
        resources:
          requests:
            cpu: "50m"           # CPU 请求,50m 即 0.05 核
            memory: "64Mi"       # 内存请求,64兆字节
          limits:
            cpu: "100m"          # CPU 上限,0.1核
            memory: "128Mi"      # 内存上限,128兆字节
        volumeMounts:
        - name: varlog           # 卷名称,挂载主机日志目录
          mountPath: /var/log    # 容器内挂载路径
          readOnly: true         # 只读模式,防止修改主机日志
        - name: podlogs          # 卷名称,挂载Pod日志目录
          mountPath: /var/log/pods  # 容器内挂载路径
          readOnly: true         # 只读模式
      volumes:
      - name: varlog             # 卷名称,与上面的 volumeMounts 对应
        hostPath:                # 主机路径卷,访问节点文件系统
          path: /var/log         # 主机上的路径
      - name: podlogs            # 卷名称,与上面的 volumeMounts 对应
        hostPath:                # 主机路径卷
          path: /var/log/pods    # 主机上的路径
PersistentVolume(持久卷)
  • PersistentVolume (PV) 是集群级别的存储资源,由管理员配置,与 Namespace 无关。

apiVersion: v1                  # API 版本,PV 使用 v1 版本
kind: PersistentVolume           # 资源类型,此处指定为 PersistentVolume
metadata:                        # 元数据部分,包含资源的基本信息
  name: app-data-pv              # PV 名称,在集群中必须唯一
  labels:                        # 标签,用于对资源进行分类和筛选
    type: local                  # 类型标签,表示本地存储
    storage: ssd                 # 存储类型标签,标识为SSD存储
spec:                            # 规格部分,定义 PV 的存储规格
  capacity:                      # 存储容量配置
    storage: 10Gi                # 10GB 存储空间
  accessModes:                   # 访问模式,定义PV可以被如何访问
  - ReadWriteOnce                # 只能被单个节点以读写方式挂载
  # ReadWriteOnceMany			 # 读写多次,可以被多个Pod挂载使用,进行读写操作
  # ReadOnlyMany				 # 只读
  persistentVolumeReclaimPolicy: Retain  # 回收策略:保留数据(手动处理)
  storageClassName: standard     # 存储类名称,用于匹配PVC
  local:                         # 本地存储配置,支持local、hoatPath、nfs、iscsi
    path: /data/k8s/pv1          # 节点上的本地路径
  nodeAffinity:                  # 节点亲和性,指定哪些节点可以使用此PV
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname  # 匹配节点主机名
          operator: In                 # 操作符:在列表中
          values:
          - worker-node-1              # 允许在worker-node-1上使用
          - worker-node-2              # 允许在worker-node-2上使用
PersistentVolumeClaim(持久卷声明)
  • PersistentVolumeClaim (PVC) 是用户对存储资源的请求,用于获取 PV 提供的存储。

apiVersion: v1                  # API 版本,PVC 使用 v1 版本
kind: PersistentVolumeClaim      # 资源类型,此处指定为 PersistentVolumeClaim
metadata:                        # 元数据部分,包含资源的基本信息
  name: app-data-pvc             # PVC 名称,在命名空间内必须唯一
  namespace: my-app-namespace    # 所属命名空间,指定此资源属于哪个命名空间
  labels:                        # 标签,用于对资源进行分类和筛选
    app: my-app                  # 应用标签,标识此PVC属于哪个应用
spec:                            # 规格部分,定义 PVC 的存储请求
  accessModes:                   # 访问模式,需与PV匹配才能绑定
  - ReadWriteOnce                # 与PV的访问模式一致
  resources:                     # 资源请求配置
    requests:
      storage: 5Gi               # 请求5GB存储空间(不能超过PV的容量)
  storageClassName: standard     # 存储类,需与PV的storageClassName匹配
  selector:                      # 选择器,用于匹配特定的PV
    matchLabels:
      storage: ssd               # 匹配具有此标签的PV
  # 当storageClassName为""时,会绑定到没有存储类的PV
  # 当设置storageClassName,会绑定到相同存储类的PV
StatefulSet(有状态集)
  • StatefulSet 用于管理有状态应用,为 Pod 提供稳定的名称、网络标识和持久存储。

apiVersion: apps/v1             # API版本,StatefulSet使用apps/v1
kind: StatefulSet                # 资源类型:StatefulSet(有状态应用管理)
metadata:                        # 元数据,包含资源标识信息
  name: database-statefulset     # 名称,命名空间内唯一
  namespace: my-app-namespace    # 所属命名空间,实现资源隔离
  labels:                        # 标签,用于分类和关联
    app: database                # 应用标签:数据库
    tier: backend                # 层级标签:后端服务
spec:                            # 规格,定义期望运行状态
  serviceName: "db-service"      # 关联的Headless Service,提供固定网络标识
  replicas: 3                    # 期望副本数:3个(适合主从/集群)
  selector:                      # 选择器,确定管理的Pod范围
    matchLabels:                 # 通过标签匹配Pod
      app: database              # 匹配app=database的Pod
  updateStrategy:                # 更新策略配置
    type: RollingUpdate          # 更新类型:滚动更新(平滑替换)
    rollingUpdate:               # 滚动更新参数
      partition: 0               # 分区阈值:0表示更新所有副本
  template:                      # Pod模板,定义Pod创建标准
    metadata:                    # Pod的元数据
      labels:                    # Pod标签(需与selector匹配)
        app: database            # 匹配StatefulSet选择器的标签
        tier: backend            # 层级标签:后端服务
    spec:                        # Pod规格,定义容器运行规则
      containers:                # 容器列表
      - name: database           # 容器名称,Pod内唯一
        image: postgres:14       # 使用的镜像:PostgreSQL 14
        ports:                   # 容器端口配置
        - containerPort: 5432    # 容器监听端口(PostgreSQL默认)
          name: db-port          # 端口名称,便于引用
          protocol: TCP          # 协议类型:TCP
        env:                     # 环境变量配置
        - name: POSTGRES_DB      # 环境变量名:数据库名称
          valueFrom:             # 从其他资源取值
            configMapKeyRef:     # 引用ConfigMap(非敏感配置)
              name: db-config    # 目标ConfigMap名称
              key: db.name       # 目标键
        - name: POSTGRES_USER    # 环境变量名:数据库用户名
          valueFrom:             # 从其他资源取值
            secretKeyRef:        # 引用Secret(敏感配置)
              name: db-secrets   # 目标Secret名称
              key: username      # 目标键
        - name: POSTGRES_PASSWORD  # 环境变量名:数据库密码
          valueFrom:             # 从其他资源取值
            secretKeyRef:        # 引用Secret
              name: db-secrets   # 目标Secret名称
              key: password      # 目标键
        volumeMounts:            # 卷挂载配置
        - name: data-volume      # 卷名称(与PVC模板对应)
          mountPath: /var/lib/postgresql/data  # 容器内挂载路径(数据存储目录)
          subPath: postgres      # 子路径,避免覆盖容器默认文件
        livenessProbe:           # 存活探针(检测容器是否正常运行)
          exec:                  # 探针类型:执行命令检查
            command: ["pg_isready", "-U", "postgres"]  # 检查命令
          initialDelaySeconds: 30  # 启动后延迟检查时间(秒)
          periodSeconds: 10     # 检查间隔时间(秒)
        readinessProbe:          # 就绪探针(检测是否可接收请求)
          exec:                  # 探针类型:执行命令检查
            command: ["pg_isready", "-U", "postgres"]  # 检查命令
          initialDelaySeconds: 5  # 启动后延迟检查时间(秒)
          periodSeconds: 5      # 检查间隔时间(秒)
      affinity:                  # 亲和性配置(控制Pod调度)
        podAntiAffinity:         # Pod反亲和性(避免同应用共节点)
          preferredDuringSchedulingIgnoredDuringExecution:  # 优先调度策略
          - weight: 100          # 调度权重(0-100,越高优先级越高)
            podAffinityTerm:     # 反亲和性匹配条件
              labelSelector:     # 筛选需规避的Pod标签
                matchExpressions:  # 标签匹配规则
                - key: app       # 匹配的标签键
                  operator: In   # 匹配操作符:在列表中
                  values: [database]  # 规避app=database的Pod
              topologyKey: "kubernetes.io/hostname"  # 按节点主机名区分
  volumeClaimTemplates:          # PVC模板,为每个Pod创建独立存储
  - metadata:
      name: data-volume          # PVC名称(与volumeMounts对应)
    spec:
      accessModes: [ "ReadWriteOnce" ]  # 访问模式:单节点读写
      storageClassName: "standard"      # 存储类,匹配集群存储
      resources:                 # 声明资源需求的总配置项
        requests:                # 声明最小需要的存储资源量
          storage: 10Gi          # 每个Pod请求10GB存储
  podManagementPolicy: OrderedReady  # Pod管理策略:有序创建/更新(默认)
  # podManagementPolicy: Parallel  # 可选:并行创建/更新所有Pod