创建第一个集群
学习目标
- 使用 Minikube 创建第一个 Kubernetes 集群
- 部署第一个应用到集群
- 理解集群的基本操作流程
核心概念
集群创建流程
整体流程:
┌─────────────────────────────────────┐
│ 1. 启动 Minikube 集群 │
│ 2. 验证集群状态 │
│ 3. 创建 Deployment │
│ 4. 创建 Service │
│ 5. 访问应用 │
│ 6. 扩缩容 │
│ 7. 更新应用 │
│ 8. 清理资源 │
└─────────────────────────────────────┘
应用部署流程
YAML 配置文件
↓
kubectl apply
↓
API Server 验证
↓
存储到 etcd
↓
Scheduler 调度
↓
kubelet 创建 Pod
↓
应用运行
↓
Service 暴露
实践练习
练习 1:启动集群
# 启动 Minikube
minikube start --driver=docker
# 查看集群状态
minikube status
# 验证 kubectl 连接
kubectl cluster-info
kubectl get nodes
# 预期输出:
# NAME STATUS ROLES AGE VERSION
# minikube Ready control-plane 2m v1.28.0
练习 2:部署第一个应用
# 创建 Deployment
kubectl create deployment nginx --image=nginx:latest
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
# 查看详细信息
kubectl describe deployment nginx
# 预期输出:
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx 1/1 1 1 30s
练习 3:暴露服务
# 创建 Service
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 Service
kubectl get services
# 获取访问 URL
minikube service nginx --url
# 访问应用
curl $(minikube service nginx --url)
# 预期输出:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# nginx NodePort 10.96.100.100 <none> 80:31234/TCP 10s
练习 4:查看应用状态
# 查看所有资源
kubectl get all
# 查看 Pod 详情
kubectl describe pod <pod-name>
# 查看 Pod 日志
kubectl logs <pod-name>
# 查看 Service 详情
kubectl describe service nginx
# 查看事件
kubectl get events
练习 5:扩缩容
# 扩容到 3 个副本
kubectl scale deployment nginx --replicas=3
# 查看 Pod
kubectl get pods
# 查看 Deployment
kubectl get deployments
# 预期输出:
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx 3/3 3 3 5m
# 缩容到 1 个副本
kubectl scale deployment nginx --replicas=1
练习 6:更新应用
# 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.24
# 查看更新状态
kubectl rollout status deployment/nginx
# 查看更新历史
kubectl rollout history deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1
练习 7:使用 YAML 文件
创建 nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
创建 nginx-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
# 应用配置
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
# 查看资源
kubectl get deployments
kubectl get services
kubectl get pods
# 访问应用
minikube service nginx-service --url
练习 8:调试应用
# 查看 Pod 状态
kubectl get pods
# 查看 Pod 详情
kubectl describe pod <pod-name>
# 查看 Pod 日志
kubectl logs <pod-name>
# 进入 Pod
kubectl exec -it <pod-name> -- /bin/bash
# 在 Pod 内执行命令
kubectl exec <pod-name> -- curl localhost:80
# 端口转发到本地
kubectl port-forward pod/<pod-name> 8080:80
# 访问 http://localhost:8080
练习 9:清理资源
# 删除 Service
kubectl delete service nginx-service
# 删除 Deployment
kubectl delete deployment nginx-deployment
# 或者删除所有资源
kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml
# 验证清理
kubectl get all
# 停止 Minikube
minikube stop
# 删除 Minikube 集群 (可选)
minikube delete
练习 10:完整示例
创建一个完整的 Web 应用:
web-app.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx:1.24
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
initContainers:
- name: init-html
image: busybox
command: ['sh', '-c', 'echo "<h1>Hello from Kubernetes!</h1>" > /html/index.html']
volumeMounts:
- name: html
mountPath: /html
volumes:
- name: html
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
type: LoadBalancer
# 部署应用
kubectl apply -f web-app.yaml
# 查看状态
kubectl get all
# 访问应用
minikube tunnel
# 在另一个终端
curl http://$(kubectl get svc web-app-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
常见问题
1. Pod 无法启动
问题:Pod 状态为 Pending 或 CrashLoopBackOff
解决:
• 查看 Pod 详情: kubectl describe pod <pod-name>
• 查看日志: kubectl logs <pod-name>
• 检查镜像是否存在
• 检查资源配额
2. Service 无法访问
问题:无法通过 Service 访问应用
解决:
• 检查 Service 选择器是否匹配 Pod 标签
• 检查端口配置
• 使用 minikube service 命令访问
• 检查网络策略
3. 镜像拉取失败
问题:ImagePullBackOff
解决:
• 检查镜像名称是否正确
• 检查网络连接
• 使用本地镜像: eval $(minikube docker-env)
• 配置镜像加速器
小结
| 要点 | 说明 |
|---|---|
| 启动集群 | minikube start |
| 部署应用 | kubectl create deployment |
| 暴露服务 | kubectl expose deployment |
| 扩缩容 | kubectl scale deployment |
| 更新应用 | kubectl set image |
| 回滚版本 | kubectl rollout undo |
| 配置管理 | YAML 文件 + kubectl apply |
| 调试工具 | describe, logs, exec, port-forward |
练习编辑器
bash
Loading...