# 容器管理
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 <插件名> # 卸载插件
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名称
命名空间用于在集群中创建逻辑隔离,将资源划分到不同的虚拟集群中。
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 用于存储非敏感的配置信息,供 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 用于存储敏感信息,如密码、令牌或密钥,与 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 是 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 用于管理 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 为 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 管理外部访问到集群服务的规则,通常用于 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 用于管理一次性任务,确保指定数量的 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 基于时间调度创建 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 确保所有(或指定)节点上都运行一个相同的 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 (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 (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 用于管理有状态应用,为 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