跳转至

3. 工作负载部署

集群搭建完成后,最重要的任务就是运行应用。本章将介绍 Kubernetes 的核心工作负载(Workloads)概念,并演示如何在 K3s 中部署它们。

3.1 核心概念图解

  • Pod: 最小调度单元,一个 Pod 包含一个或多个容器(Container)。
  • Deployment: 管理 Pod 的副本数、版本更新和回滚(无状态应用首选)。
  • Service: 为一组 Pod 提供稳定的访问入口(IP 和端口)。

3.2 部署第一个 Pod

我们从一个简单的 Nginx Pod 开始。

3.2.1 编写配置文件

创建 manifests/03-workloads/nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80

3.2.2 应用配置

kubectl apply -f manifests/03-workloads/nginx-pod.yaml

3.2.3 验证

kubectl get pods
# 预期输出:nginx-demo   1/1     Running   0          10s

# 端口转发测试(临时访问)
kubectl port-forward nginx-demo 8080:80
# 此时访问 http://localhost:8080 即可看到 Nginx 欢迎页

3.3 使用 Deployment 管理应用

在生产环境中,我们很少直接创建 Pod,而是使用 Deployment。

3.3.1 编写 Deployment

创建 manifests/03-workloads/nginx-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3 # 副本数
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

3.3.2 扩缩容与更新

# 部署
kubectl apply -f manifests/03-workloads/nginx-deploy.yaml

# 查看 3 个副本
kubectl get pods -l app=nginx-app

# 扩容到 5 个
kubectl scale deployment nginx-deployment --replicas=5

# 更新镜像版本(滚动更新)
kubectl set image deployment/nginx-deployment nginx=nginx:1.23-alpine

3.4 Service 服务暴露

Pod 的 IP 是临时的,重启会变。Service 提供了一个固定的 VIP(虚拟 IP)。

3.4.1 ClusterIP (集群内访问)

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

3.4.2 NodePort (外部访问)

如果你想通过 http://<节点IP>:30080 访问:

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  selector:
    app: nginx-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080 # 范围 30000-32767
  type: NodePort

3.4.3 LoadBalancer (K3s 特性)

K3s 内置了一个名为 ServiceLB (基于 Klipper) 的简易负载均衡器。当你创建一个 LoadBalancer 类型的 Service 时,K3s 会利用节点的 80/443 等端口将流量转发给 Service。

apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
spec:
  selector:
    app: nginx-app
  ports:
    - port: 80
      targetPort: 80
  type: LoadBalancer

应用后查看 External-IP:

kubectl get svc nginx-lb
# NAME       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)
# nginx-lb   LoadBalancer   10.43.x.x       192.168.1.100   80:32001/TCP
此时直接访问 http://192.168.1.100 (节点IP) 即可。

3.5 实战练习

  1. 部署一个包含 2 个副本的 Redis Deployment。
  2. 创建一个 Service 暴露该 Redis。
  3. 在 Nginx Pod 中尝试连接 Redis Service (DNS 解析名即为 Service 名称)。
# 验证 DNS
kubectl exec -it nginx-demo -- nslookup nginx-service