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

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

相关推荐
老当益壮梁奶奶26 分钟前
Linux软件编程学习笔记(七):线程分离与线程间通信详解
linux·c语言·c++·笔记·学习
Awh-26 分钟前
Linux软件应用编程 第一章中:Linux文件操作
linux·运维·服务器
adinnet20261 小时前
财务报销自动化:用智能体辅助处理繁琐报销任务
运维·自动化
μθημα1 小时前
Kubernetes 集群部署实操:从 Harbor 私有仓库到三节点集群搭建
云原生·容器·kubernetes
zhendianluli2 小时前
VS Code Remote-SSH 连接故障排查手册(精详版)
运维·ssh
Tim风声(网络工程师)2 小时前
Kail下载
linux·运维·服务器
JXJD20043 小时前
光模块自动化组装设备 工艺体系与选型指南
运维·自动化
AOwhisky3 小时前
Linux 网络服务架设学习笔记(第五期)——Web 服务(上篇):Apache HTTP Server——从静态到动态
linux·运维·服务器·笔记·学习·云计算·apache
zbyyd3 小时前
Linux 多线程:互斥锁 &amp; 信号量
linux·c语言·开发语言·网络