K8S-pod管理与控制器管理

虚拟机配置

实验 1:加载并推送实验镜像到 Harbor 仓库

目的:将本地实验镜像 myapp:v1 和 myapp:v2 上传到私有 Harbor 仓库的 library 项目,供集群拉取。

复制代码
docker load -i myapp.tar.gz                     # 加载本地镜像包
docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1   # 打标签
docker push reg.timinglee.org/library/myapp:v1  # 推送到 Harbor
docker tag timinglee/myapp:v2 reg.timinglee.org/library/myapp:v2
docker push reg.timinglee.org/library/myapp:v2

实验 2:创建 Deployment(命令式)

目的:使用命令式方式创建 Deployment 控制器,管理 2 个 Pod 副本

复制代码
kubectl create deployment webcluster --replicas 2 --image myapp:v1
kubectl get deployments.apps   # 查看 Deployment 状态
kubectl get pods -o wide       # 查看 Pod 详情

实验 3:暴露 Service(ClusterIP 类型)

目的:为 Deployment 创建内部 ClusterIP Service,供集群内其他服务访问。

复制代码
kubectl expose deployment webcluster --port 80 --target-port 80
kubectl get service webcluster
kubectl describe svc webcluster   # 查看 Endpoints
curl <ClusterIP>/hostname.html    # 测试访问

实验 4:扩缩容(scale)

目的:动态调整 Deployment 的 Pod 副本数。

复制代码
kubectl scale deployment webcluster --replicas 3
kubectl get pods   # 观察新增 Pod

实验 5:进入容器执行命令(exec)

bash 复制代码
kubectl exec -it <pod-name> -- /bin/sh
ps   # 查看容器内进程
exit

目的:进入容器内部进行调试或查看进程。

实验 6:查看 Pod 日志(logs)

bash 复制代码
​
kubectl logs deployment/webcluster   # 自动选择第一个 Pod
kubectl logs <pod-name>              # 指定 Pod

​

目的:查看 Deployment 下 Pod 的日志输出。

实验 7:添加标签(label)

bash 复制代码
kubectl label pods <pod-name> version=v1
kubectl get pods --show-labels   # 查看标签

目的:为 Pod 添加自定义标签,用于筛选或识别。

实验 8:更新镜像版本(set image)

bash 复制代码
kubectl set image deployment webcluster myapp=<new-image>
kubectl rollout status deployment webcluster   # 查看更新进度

目的:触发 Deployment 的滚动更新,将镜像从 v1 升级到 v2。

实验 9:查看 rollout 历史

bash 复制代码
kubectl rollout history deployment webcluster
kubectl rollout history deployment webcluster --revision=1   # 查看特定版本详情

目的:查看 Deployment 的历史版本记录(revision)

实验 10:版本回滚(rollout undo)

bash 复制代码
kubectl rollout undo deployment webcluster --to-revision=1
kubectl rollout status deployment webcluster
curl <NodeIP>:<NodePort>   # 验证版本回退

目的:将 Deployment 回滚到指定的历史版本(v1)

实验 11:创建 NodePort 类型 Service

bash 复制代码
kubectl delete service webcluster
kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort
kubectl get svc webcluster   # 查看分配的 NodePort
curl http://<NodeIP>:<NodePort>/hostname.html

目的:使应用能够从集群外部通过节点 IP 和端口访问。

实验 12:多容器 Pod(YAML 声明)

bash 复制代码
kubectl run testpod --image myapp:v1 --dry-run=client -o yaml > testpod.yaml
vim testpod.yaml   # 添加第二个容器 busybox,并设置 command: sleep 10000
kubectl apply -f testpod.yaml
kubectl exec -it testpod -c busybox -- /bin/sh   # 进入 busybox 容器
curl 127.0.0.1   # 访问 myapp1 的服务(共享 localhost)

目的:演示如何在 Pod 中运行多个容器,并共享网络命名空间。

实验 13:hostPort 端口映射

bash 复制代码
vim mysql.yml   # 在 ports 下添加 hostPort: 8080
kubectl apply -f mysql.yml
kubectl get pods -o wide   # 查看 Pod 所在节点
curl http://<NodeIP>:8080/hostname.html

目的:将容器端口映射到宿主机端口,使外部可直接通过宿主机 IP:port 访问。

实验 14:环境变量注入(env)

bash 复制代码
env:
- name: MYSQL_ROOT_PASSWORD
  value: lee
kubectl apply -f mysql.yml
kubectl exec -it mysql -c mysql8 -- env   # 查看环境变量

目的:通过环境变量向容器传递配置信息。

实验 15:节点选择器(nodeSelector)

bash 复制代码
nodeSelector:
  kubernetes.io/hostname: node1
kubectl get nodes --show-labels   # 查看节点标签
kubectl apply -f mysql.yml
kubectl get pods -o wide   # 确认 NODE 为 node1

目的:将 Pod 调度到指定标签的节点(如 node1)

实验 16:共享宿主机网络(hostNetwork)

bash 复制代码
hostNetwork: true
kubectl apply -f testpod.yaml
kubectl exec -it testpod -- ip addr   # 查看 IP 应为宿主机 IP

目的:使 Pod 直接使用宿主机网络栈,IP 与宿主机相同。

实验 17:资源优先级(QoS Class)

bash 复制代码
kubectl apply -f qos-best.yaml
kubectl describe pod qos-best | grep "QoS Class"   # 输出 BestEffort
kubectl apply -f qos-burst.yaml   # 设置 requests < limits
kubectl describe pod qos-burst | grep "QoS Class"   # 输出 Burstable
kubectl apply -f qos-guaranteed.yaml   # 设置 requests == limits
kubectl describe pod qos-guaranteed | grep "QoS Class"   # 输出 Guaranteed

目的:验证不同资源设置对应的 QoS 等级(BestEffort、Burstable、Guaranteed)

实验 18:容器重启规则(restartPolicy)

bash 复制代码
kubectl apply -f restart-always.yaml
kubectl get pods -w   # 观察容器退出后自动重启
kubectl apply -f restart-onfailure.yaml   # 非正常退出才重启
kubectl apply -f restart-never.yaml       # 退出后不重启

目的:验证不同 restartPolicy 下容器退出后的行为。

实验 19:Init 容器

bash 复制代码
kubectl apply -f init-example.yml
kubectl get pods -w   # 状态为 Init:0/1
kubectl exec -it webserver -c init-busybox -- /bin/sh
touch /testfile   # 创建文件触发 Init 容器完成
exit
# Pod 变为 Running

目的:演示 Init 容器在主容器启动前执行,必须成功完成主容器才启动。

实验 20:Liveness 探针

bash 复制代码
# 无探针
kubectl apply -f liveness-no-probe.yml
kubectl exec -it webserver -- /bin/sh -c "nginx -s stop"
kubectl describe pod webserver | grep "Restart Count"   # 0,Pod 仍 Running

# 有探针
kubectl apply -f liveness-with-probe.yml
kubectl exec -it webserver -- /bin/sh -c "nginx -s stop"
kubectl get pods   # 观察 Restarts 增加

目的:对比有无存活探针时容器异常后的恢复能力

实验 21:Readiness 探针

bash 复制代码
# 无探针:删除 index.html 后 Endpoints 仍然存在
kubectl describe svc webserver | grep Endpoints   # 有 IP

# 有探针:删除 index.html 后 Endpoints 变为空
kubectl describe svc webserver | grep Endpoints   # 空
# 恢复 index.html 后 Endpoints 重新出现

目的:对比有无就绪探针时 Service Endpoints 的变化。

实验 22:Deployment 滚动更新策略配置

bash 复制代码
strategy:
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0
kubectl apply -f dep.yml
kubectl describe deploy webcluster | grep -A5 "RollingUpdateStrategy"
# 输出:0 max unavailable, 1 max surge

目的:自定义滚动更新参数,实现零停机更新

实验 23:更新暂停与恢复(pause/resume)

bash 复制代码
kubectl rollout pause deployment webcluster   # 暂停更新
kubectl set image deployment webcluster myapp=myapp:v2   # 修改镜像(不触发更新)
kubectl rollout history deployment webcluster   # 没有新 revision
kubectl rollout resume deployment webcluster    # 恢复更新
kubectl rollout history deployment webcluster   # 出现新 revision

目的:控制更新过程,实现金丝雀发布。

相关推荐
bosins3 小时前
彻底解决 WSL 2.7+ 空闲自动关闭/内存回收导致 Docker 中断的问题
linux·docker·wsl·dashboard
LongRunning3 小时前
【Linux】H3网络(二)
linux
xx~t5 小时前
嵌入式学习——ARM1
linux·arm开发·嵌入式硬件·arm
xx~t5 小时前
嵌入式——ARM1(详细篇)
linux·arm开发·嵌入式硬件·arm
我要见SA姐15 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
Elastic 中国社区官方博客6 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
fengkai45457 小时前
八、Docker详解4-5
运维·docker
智恒百亿7 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090
DYWorker0018 小时前
Linux驱动子系统:DMA-Buf —— Consumer和Provider(008)
linux·驱动开发
雯宝9 小时前
Linux 内核函数集
linux