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 应用配置
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 实战练习
- 部署一个包含 2 个副本的 Redis Deployment。
- 创建一个 Service 暴露该 Redis。
- 在 Nginx Pod 中尝试连接 Redis Service (DNS 解析名即为 Service 名称)。