K8s 部署一个完整应用
从 Deployment、Service、Ingress 到 ConfigMap、Secret,部署一个完整的 Web 应用到 K8s
你将学到
- 创建 Deployment 管理 Pod
- 使用 Service 暴露应用
- 配置 ConfigMap 和 Secret
- 使用 Ingress 配置域名访问
前置知识
架构设计
Internet
│
▼
┌─────────┐
│ Ingress │ example.com
└────┬────┘
│
▼
┌─────────┐
│ Service │ ClusterIP
└────┬────┘
│
▼
┌─────────┐
│ Pod │ Flask App
└─────────┘
实现步骤
第一步:ConfigMap 和 Secret
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "production"
APP_DEBUG: "false"
DB_HOST: "postgres-service"
DB_PORT: "5432"
DB_NAME: "myapp"
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_USER: dXNlcg== # base64 encoded "user"
DB_PASSWORD: cGFzc3dvcmQ= # base64 encoded "password"
SECRET_KEY: c2VjcmV0a2V5 # base64 encoded "secretkey"
第二步:Deployment
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
labels:
app: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: username/webapp:latest
ports:
- containerPort: 8000
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
第三步:Service
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: ClusterIP
第四步:Ingress
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp-service
port:
number: 80
第五步:部署应用
# 创建 ConfigMap 和 Secret
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml
# 部署应用
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
# 查看状态
kubectl get pods
kubectl get services
kubectl get ingress
# 查看日志
kubectl logs -f deployment/webapp
# 扩缩容
kubectl scale deployment webapp --replicas=5
完整项目结构
k8s-app/
├── k8s/
│ ├── configmap.yaml # 配置
│ ├── secret.yaml # 密钥
│ ├── deployment.yaml # 部署
│ ├── service.yaml # 服务
│ └── ingress.yaml # 入口
├── Dockerfile
└── app/
最佳实践
- 使用 ConfigMap:管理非敏感配置
- 使用 Secret:管理敏感信息(密码、密钥)
- 资源限制:设置 CPU 和内存限制
- 健康检查:配置 liveness 和 readiness 探针
- 滚动更新:默认支持零停机部署
常见问题
Q: 如何查看 Pod 日志?
A: kubectl logs -f <pod-name>
Q: 如何进入 Pod 调试?
A: kubectl exec -it <pod-name> -- /bin/sh
Q: 如何回滚部署?
A: kubectl rollout undo deployment/webapp
扩展挑战
- 添加 HPA 自动扩缩容
- 配置 NetworkPolicy 网络策略
- 实现蓝绿部署
相关课程
| 课程 | 相关章节 |
|---|---|
| K8s | Kubernetes 是什么 |
| K8s | Pod 基础 |
| K8s | Deployment |
| K8s | Service |