高级3-4 小时·集群运维

K8s 部署一个完整应用

从 Deployment、Service、Ingress 到 ConfigMap、Secret,部署一个完整的 Web 应用到 K8s

K8sdeploymentserviceingressconfigmap

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/

最佳实践

  1. 使用 ConfigMap:管理非敏感配置
  2. 使用 Secret:管理敏感信息(密码、密钥)
  3. 资源限制:设置 CPU 和内存限制
  4. 健康检查:配置 liveness 和 readiness 探针
  5. 滚动更新:默认支持零停机部署

常见问题

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

扩展挑战

  1. 添加 HPA 自动扩缩容
  2. 配置 NetworkPolicy 网络策略
  3. 实现蓝绿部署

相关课程

课程相关章节
K8sKubernetes 是什么
K8sPod 基础
K8sDeployment
K8sService