8·基础入门入门

创建第一个集群

kubernetesclusterhands-on

创建第一个集群

学习目标

  1. 使用 Minikube 创建第一个 Kubernetes 集群
  2. 部署第一个应用到集群
  3. 理解集群的基本操作流程

核心概念

集群创建流程

整体流程:
┌─────────────────────────────────────┐
│  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...

继续学习

完成本课后,建议继续学习下一课「Kubernetes Dashboard」 以巩固所学知识。