搭建好集群后,下一步就是部署应用。本文用 Nginx 作为示例,系统讲解 Deployment 和 Service 的核心概念与配置方法。

1. 核心概念

1.1 Pod

Pod 是 K8s 最小的调度单元,一个 Pod 可以包含一个或多个容器。实际使用中通常一个 Pod 只运行一个主容器。

1.2 Deployment

Deployment 是管理 Pod 副本的控制器。它确保指定数量的 Pod 副本始终运行,并支持滚动更新和回滚。

1.3 Service

Service 为一组 Pod 提供稳定的网络端点(ClusterIP),即使 Pod 重启 IP 变了,Service IP 也不会变。

2. 部署第一个应用

2.1 使用 kubectl 快速部署

kubectl create deployment nginx --image=nginx:1.25 --replicas=3

验证部署结果:

kubectl get deployments
kubectl get pods -o wide

2.2 使用 YAML 文件部署(推荐)

生产环境推荐使用 YAML 声明式配置,便于版本控制和复用。

创建 nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

应用配置:

kubectl apply -f nginx-deployment.yaml

3. Service — 暴露应用

3.1 ClusterIP(默认,集群内部访问)

创建 nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
kubectl apply -f nginx-service-service.yaml

# 验证:在集群内部 curl 访问
kubectl run curl-test --image=curlimages/curl -it --rm -- \
  curl http://nginx-service

3.2 NodePort(节点端口暴露)

将服务暴露到节点 IP 的端口上,外部可通过 http://<节点IP>:<端口> 访问:

spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080    # 范围 30000-32767

3.3 四种 Service 类型对比

类型说明适用场景
ClusterIP默认类型,分配集群内部 IP服务间内部通信
NodePort所有节点上开放固定端口测试、小规模对外暴露
LoadBalancer对接云厂商负载均衡器云服务器上对外服务
ExternalNameDNS CNAME 映射引用外部服务

4. 滚动更新与回滚

4.1 更新镜像版本

# 更新镜像并记录发布历史
kubectl set image deployment/nginx-deployment nginx=nginx:1.26 --record

# 查看滚动更新进度
kubectl rollout status deployment/nginx-deployment

# 查看发布历史
kubectl rollout history deployment/nginx-deployment

4.2 回滚到上一个版本

# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
滚动更新的精髓在于逐个替换 Pod,期间保证可用副本数不低于设定值,因此服务不会中断。

5. 标签与选择器

标签(Label)是 K8s 中最重要的组织机制。Service 通过 selector 匹配 Pod 的 labels 来确定流量转发目标。

# 查看 Pod 的标签
kubectl get pods --show-labels

# 按标签筛选
kubectl get pods -l app=nginx

# 动态修改标签
kubectl label pod  env=production

6. 健康检查探针

探针类型作用失败后果
livenessProbe检测容器是否存活重启容器
readinessProbe检测容器是否就绪接收流量从 Service 摘除
startupProbe检测容器是否启动完成(适用于慢启动应用)暂不执行 liveness/readiness

7. 完整部署流程总结

# 1. 创建 Deployment
kubectl apply -f nginx-deployment.yaml

# 2. 创建 Service
kubectl apply -f nginx-service.yaml

# 3. 验证
kubectl get deployments
kubectl get pods
kubectl get svc

# 4. 查看 Pod 日志
kubectl logs -f deployment/nginx-deployment

# 5. 进入 Pod 调试
kubectl exec -it  -- /bin/bash