虚拟机配置

实验 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
目的:控制更新过程,实现金丝雀发布。
