插件窝 干货文章 如何在Linux上部署高可用的容器化应用

如何在Linux上部署高可用的容器化应用

myapp deployment Kubernetes yaml 434    来源:    2025-04-16

在Linux上部署高可用的容器化应用指南

一、高可用容器化架构核心组件

  1. 容器编排平台:Kubernetes (推荐) 或 Docker Swarm
  2. 负载均衡器:Nginx, HAProxy 或云服务商的LB
  3. 服务发现:etcd, Consul 或 Zookeeper
  4. 存储解决方案:Ceph, GlusterFS 或云存储
  5. 监控系统:Prometheus + Grafana
  6. 日志系统:EFK (Elasticsearch + Fluentd + Kibana)

二、使用Kubernetes部署高可用方案

1. 集群搭建

# 使用kubeadm初始化主节点
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16

# 添加工作节点
kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>

2. 部署高可用应用

# deployment.yaml 示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:latest
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

3. 创建服务暴露应用

# service.yaml 示例
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

三、高可用性保障措施

  1. 多节点部署:确保应用副本分布在不同的物理节点上

    kubectl get pods -o wide
    
  2. 自动扩缩容

    kubectl autoscale deployment myapp-deployment --min=3 --max=10 --cpu-percent=80
    
  3. 节点亲和性/反亲和性

    affinity:
     podAntiAffinity:
       requiredDuringSchedulingIgnoredDuringExecution:
       - labelSelector:
           matchExpressions:
           - key: app
             operator: In
             values:
             - myapp
         topologyKey: "kubernetes.io/hostname"
    
  4. 持久化存储

    volumes:
    - name: data
     persistentVolumeClaim:
       claimName: myapp-pvc
    

四、监控与日志

  1. 安装Prometheus Operator

    helm install prometheus stable/prometheus-operator
    
  2. 设置告警规则

    groups:
    - name: example
     rules:
     - alert: HighPodMemory
       expr: sum(container_memory_usage_bytes{container_name!="POD"}) by (pod_name) / 1024 / 1024 > 100
       for: 5m
       labels:
         severity: warning
       annotations:
         summary: High memory usage in pod {{ $labels.pod_name }}
    
  3. 日志收集(EFK)

    kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch.yaml
    

五、灾备与恢复策略

  1. 定期备份

    # 备份etcd
    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/server.crt \
    --key=/etc/kubernetes/pki/etcd/server.key \
    snapshot save snapshot.db
    
  2. 跨区域部署

    topologySpreadConstraints:
    - maxSkew: 1
     topologyKey: topology.kubernetes.io/zone
     whenUnsatisfiable: DoNotSchedule
     labelSelector:
       matchLabels:
         app: myapp
    
  3. 蓝绿部署/金丝雀发布

    kubectl apply -f new-deployment.yaml
    kubectl rollout status deployment/myapp-deployment
    kubectl set image deployment/myapp-deployment myapp=myapp:v2
    

六、安全最佳实践

  1. 网络策略

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
     name: default-deny
    spec:
     podSelector: {}
     policyTypes:
     - Ingress
     - Egress
    
  2. RBAC配置

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
     namespace: default
     name: pod-reader
    rules:
    - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get", "watch", "list"]
    
  3. 镜像扫描

    # 使用Trivy扫描镜像
    trivy image myapp:latest
    

通过以上方案,您可以在Linux上构建一个高可用的容器化应用环境,确保应用在节点故障、网络问题等情况下仍能保持服务可用性。