前言

今年我们的微服务架构从Docker Compose升级到Kubernetes,集群自动扩展能力让我们轻松应对10倍流量增长。

Kubernetes虽然复杂,但掌握它是现代DevOps工程师的必修课。这篇文章将帮你快速上手K8s核心概念和生产实践。


一、为什么需要Kubernetes?

1.1 Docker Compose的局限


单机部署:
✗ 服务器宕机?全部完蛋
✗ 流量突增?无法自动扩展
✗ 应用崩溃?需要手动重启
✗ 滚动更新?停机时间长
Kubernetes解决方案:
✓ 多机部署 - 高可用
✓ 自动扩缩容 - 应对流量变化
✓ 自愈机制 - 故障自动恢复
✓ 无损更新 - 用户无感知
✓ 负载均衡 - 流量智能分配

二、核心概念速览

2.1 五个基本对象


Pod:
最小部署单位,包含一个或多个容器
Service:
网络抽象,为Pod组提供稳定访问地址
Deployment:
管理Pod副本,支持滚动更新
ConfigMap:
存储非敏感配置数据
Secret:
存储敏感信息(密码、token等)

2.2 架构层级


集群 (Cluster)
  ├── 控制平面 (Master)
  │   ├── API Server
  │   ├── etcd(状态存储)
  │   ├── Scheduler(调度器)
  │   └── Controller Manager
  │
  └── 工作节点 (Node)
      ├── Node 1
      │   └── Pod 1, Pod 2
      ├── Node 2
      │   └── Pod 3, Pod 4
      └── Node 3
          └── Pod 5, Pod 6

三、快速安装与体验

3.1 本地开发环境


bash

# 安装minikube(本地单节点K8s)
curl -Lo minikube https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64chmod +x minikube && sudo mv minikube /usr/local/bin/
# 启动Kubernetes集群
minikube start --cpus=4 --memory=4096
# 安装kubectl(K8s命令行工具)curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 验证安装
kubectl version
kubectl cluster-info

3.2 第一个Pod


bash

# 运行Pod
kubectl run nginx-pod --image=nginx:latest
# 查看Pod
kubectl get pods
# 查看Pod详情
kubectl describe pod nginx-pod
# 查看日志
kubectl logs nginx-pod
# 进入Pod
kubectl exec -it nginx-pod -- bash
# 删除Pod
kubectl delete pod nginx-pod

四、Deployment声明式部署

4.1 创建Deployment

deployment.yaml:


yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # 3个副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

4.2 部署和管理


bash

# 部署应用
kubectl apply -f deployment.yaml
# 查看Deployment
kubectl get deployments
# 查看Pod(自动创建3个)
kubectl get pods
# 查看详情
kubectl describe deployment nginx-deployment
# 扩容
kubectl scale deployment nginx-deployment --replicas=5
# 更新镜像
kubectl set image deployment/nginx-deployment \
  nginx=nginx:1.22 --record
# 查看更新历史
kubectl rollout history deployment/nginx-deployment
# 回滚到上个版本
kubectl rollout undo deployment/nginx-deployment
# 删除Deployment
kubectl delete deployment nginx-deployment

五、Service网络暴露

5.1 Service类型

service.yaml:


yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer  # ClusterIP | NodePort | LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80  # Service端口
    targetPort: 80  # Pod端口

bash

# 部署Service
kubectl apply -f service.yaml
# 查看Service
kubectl get svc
# 获取外部IP(LoadBalancer)
kubectl get svc nginx-service -w
# 访问服务
curl http://EXTERNAL-IP
# 端口转发(本地访问)
kubectl port-forward svc/nginx-service 8080:80
# 访问:curl http://localhost:8080

5.2 三种Service类型对比


ClusterIP(默认):
- 仅在集群内部访问
- 适合微服务间通信
NodePort:
- 在每个Node暴露端口
- 外部可通过 
NodeIP:NodePort 访问
LoadBalancer:
- 云环境使用
- 自动分配外部负载均衡器
- 推荐生产环境使用

六、配置管理

6.1 ConfigMap和Secret

config.yaml:


yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_host: "postgres.default.svc.cluster.local"
  database_port: "5432"
  log_level: "info"
  
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:  
database_user: "admin"
  database_password: "secure-password"
  jwt_secret: "jwt-secret-key"

pod-with-config.yaml:


yaml

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:  containers:
  - name: app
    image: my-app:latest
    env:
    # 从ConfigMap注入
    - name: DB_HOST
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: database_host
    # 从Secret注入
    - name: DB_USER
      valueFrom:
        secretKeyRef:
          name: app-secret
          key: database_user
    # 挂载ConfigMap为文件
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config 
 volumes:
  - name: config-volume
    configMap:
      name: app-config

6.2 部署和验证


bash

# 创建ConfigMap和Secret
kubectl apply -f config.yaml
# 查看ConfigMap
kubectl get configmap
kubectl describe configmap app-config
# 查看Secret(内容被隐藏)
kubectl get secret
kubectl describe secret app-secret
# 获取Secret明文(谨慎使用)
kubectl get secret app-secret -o jsonpath='{.data.database_password}' | base64 -d

七、完整应用栈部署

mysql-deployment.yaml:


yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root_password
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
  name:
 mysqlspec:
  selector:
    app:
 mysql
  ports:
  - port: 3306
    targetPort: 3306
  clusterIP: None
  # Headless Service
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name:
 mysql-pvcspec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

app-deployment.yaml:


yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: my-web-app:1.0
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_URL
          value: "mysql://root@mysql:3306/myapp"
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: log_level
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: web-app
spec:
  type: LoadBalancer
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 8000

7.1 部署完整应用


bash

# 创建Secretkubectl
 create secret generic mysql-secret \
  --from-literal=root_password=your-password
# 部署应用
kubectl apply -f 
mysql-deployment.yaml
kubectl apply -f 
app-deployment.yaml
# 查看所有资源
kubectl get all
# 查看Pod状态
kubectl get pods -o wide
# 查看Service
kubectl get svc
# 查看PVCkubectl get pvc

八、自动扩缩容

8.1 HPA(Horizontal Pod Autoscaler)


yaml

apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:  name: web-app-hpaspec:  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: web-app  minReplicas: 2  maxReplicas: 10  metrics:  - type: Resource    resource:      name: cpu      target:        type: Utilization        averageUtilization: 70  - type: Resource    resource:      name: memory      target:        type: Utilization        averageUtilization: 80  behavior:    scaleDown:      stabilizationWindowSeconds: 300      policies:      - type: Percent        value: 50        periodSeconds: 15    scaleUp:      stabilizationWindowSeconds: 0      policies:      - type: Percent        value: 100        periodSeconds: 15

8.2 部署和监控


bash

# 部署HPAkubectl apply -f hpa.yaml# 查看HPA状态kubectl get hpa# 监听HPA自动扩缩kubectl get hpa web-app-hpa -w# 生成负载测试kubectl run -i --tty load-generator --rm --image=busybox /bin/sh# 在容器中运行:# while sleep 0.01; do wget -q -O- http://web-app; done

九、滚动更新与金丝雀发布

9.1 滚动更新


bash

# 更新镜像
kubectl set image deployment/web-app \
  web=my-web-app:2.0 --record
# 查看更新进度
kubectl rollout status deployment/web-app
# 查看历史版本
kubectl rollout history deployment/web-app
# 查看某个版本详情
kubectl rollout history deployment/web-app --revision=2
# 回滚到上个版本
kubectl rollout undo deployment/web-app
# 回滚到指定版本
kubectl rollout undo deployment/web-app --to-revision=1

9.2 金丝雀发布

canary-deployment.yaml:


yaml

apiVersion: apps/v1
kind: Deployment
metadata:  
name: web-app
-canaryspec:
  replicas: 1
  # 1个金丝雀副本
  selector:
    matchLabels:
      app: web
      version: canary
  template:
    metadata:
      labels:
        app: web
        version: canary
    spec:
      containers:
      - name: web 
       image: my-web-app:2.0
  # 新版本
        ports:
        - containerPort: 8000

bash

# 部署金丝雀
kubectl apply 
-f canary
-deployment.yaml
# 观察金丝雀运行情况
# 如果无问题,逐步增加金丝雀副本
kubectl scale deployment web-app-canary --replicas=2
# 最后删除旧版本
kubectl delete deployment web-app

十、团队协作

我们的Kubernetes集群由分布在北京、上海两地的DevOps团队共同维护。在进行集群升级和故障排查时,团队成员需要实时沟通,但由于语言背景不同,技术细节的表达常常产生理解偏差。我们通过同言翻译(Transync AI)进行实时翻译和会议记录,确保每位工程师都能准确理解集群配置和应急方案。


十一、生产常用命令


bash

# === 查看资源 ===
kubectl get nodes                    # 查看节点
kubectl get pods -A                  # 查看所有Pod
kubectl get svc -n kube-system       # 指定命名空间
kubectl get all -o wide              # 详细信息
# === 调试排查 ===
kubectl describe pod POD_NAME         # 查看Pod详情
kubectl logs POD_NAME                 # 查看日志
kubectl logs -f POD_NAME              # 持续查看日志
kubectl exec -it POD_NAME -- bash     # 进入容器
kubectl port-forward svc/SVC 8080:80  # 端口转发
# === 资源管理 ===
kubectl apply -f file.yaml            # 部署
kubectl delete -f file.yaml           # 删除
kubectl edit deployment NAME          # 编辑配置
kubectl patch deployment NAME ...     # 打补丁
kubectl rollout restart deployment    # 滚动重启
# === 集群管理 ===
kubectl cluster-info                  # 集群信息
kubectl top nodes                     # 节点资源使用
kubectl top pods                      # Pod资源使用
kubectl get events -A --sort-by=.metadata.creationTimestamp

十二、常见问题


Q1:Pod无法启动?
A:kubectl describe pod | kubectl logs
Q2:镜像拉取超时?
A:修改镜像源或增加超时时间
Q3:PVC一直Pending?
A:检查存储类和网络存储可用性
Q4:Service无法访问?
A:检查Endpoint和网络策略
Q5:如何限制资源?
A:使用resources字段配置requests和limits

十三、学习路线


第1步:基础概念
 └─ Pod、Deployment、Service
第2步:配置管理
 └─ ConfigMap、Secret、资源限制
第3步:存储和网络
 └─ PVC、Ingress、网络策略
第4步:高级特性
 └─ StatefulSet、DaemonSet、Job
第5步:生产实践
 └─ 监控告警、日志收集、备份恢复
第6步:进阶方案
 └─ Service Mesh、GitOps、多集群管理

总结

Kubernetes是容器编排的事实标准,虽然学习曲线陡峭,但掌握它能让你:

✅ 构建高可用分布式系统 ✅ 实现自动化运维 ✅ 快速扩展应用 ✅ 降低运维成本

核心要点:

  • Pod是最小单位
  • Deployment管理副本和更新
  • Service提供网络抽象
  • 声明式配置即基础设施

从今天开始,让Kubernetes成为你的超级武器!


推荐资源:

点赞、收藏、关注,欢迎在评论区分享K8s实践经验!💪

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐