Kubernetes 实战:生产级集群管理与监控 Kubernetes 核心概念回顾 集群架构 Master 节点:API Server、Scheduler、Controller Manager、etcd Worker 节点:Kubelet、Kube-proxy、Container Runtime 核心资源 Pod:最小部署单元 Deployment:无状态应用管理 StatefulSet:有状态应用管理 Service:服务发现和负载均衡 Ingress:HTTP(S) 路由 生产级部署 高可用 Master 网络插件选择 CNI 插件对比 插件 | 性能 | 功能 | 复杂度 Calico | ⭐⭐⭐⭐⭐ | 网络策略 | 中 Flannel | ⭐⭐⭐⭐ | 简单 | 低
# kubeadm 配置示例 apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.29.0 controlPlaneEndpoint: "lb.k8s.local:6443" etcd: external: endpoints: - https://etcd1.k8s.local:2379 - https://etcd2.k8s.local:2379 - https://etcd3.k8s.local:2379
| 插件 | 性能 | 功能 | 复杂度 |
|---|---|---|---|
| Calico | ⭐⭐⭐⭐⭐ | 网络策略 | 中 |
| Flannel | ⭐⭐⭐⭐ | 简单 | 低 |
| Cilium | ⭐⭐⭐⭐⭐ | 可观测性 | 高 |
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-ssd provisioner: kubernetes.io/aws-ebs parameters: type: gp3 iops: "3000" throughput: "125" allowVolumeExpansion: true reclaimPolicy: Delete
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-pvc spec: accessModes: - ReadWriteOnce storageClassName: fast-ssd resources: requests: storage: 100Gi
apiVersion: v1 kind: ResourceQuota metadata: name: compute-quota spec: hard: requests.cpu: "100" requests.memory: 200Gi limits.cpu: "200" limits.memory: 400Gi persistentvolumeclaims: "10"
apiVersion: v1 kind: LimitRange metadata: name: resource-limits spec: limits: - default: cpu: "1" memory: 512Mi defaultRequest: cpu: "0.5" memory: 256Mi type: Container
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
apiVersion: v1 kind: Pod metadata: name: secure-pod spec: securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 3000 seccompProfile: type: RuntimeDefault containers: - name: app securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: true
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all spec: podSelector: {} policyTypes: - Ingress - Egress --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-web spec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: nginx ports: - protocol: TCP port: 80
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config data: prometheus.yml: | global: scrape_interval: 15s scrape_configs: - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https
核心指标:
apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config data: fluent.conf: | <source> @type tail path /var/log/containers/*.log pos_file /var/log/fluentd-containers.log.pos tag kubernetes.* read_from_head true <parse> @type json </parse> </source>
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: web-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: web-vpa spec: targetRef: apiVersion: apps/v1 kind: Deployment name: web-deployment updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: "*" maxAllowed: cpu: "2" memory: 4Gi minAllowed: cpu: "100m" memory: 128Mi
kubectl autoscale node --max-nodes=10 --min-nodes=2 --nodes=1:10
# 查看 Pod 状态 kubectl get pods -n <namespace> # 查看 Pod 详情 kubectl describe pod <pod-name> -n <namespace> # 查看 Pod 日志 kubectl logs <pod-name> -n <namespace> # 进入 Pod kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
# 检查 Service kubectl get endpoints <service-name> -n <namespace> # 测试服务连通性 kubectl run -it --rm debug --image=busybox --restart=Never -- wget -O- <service-name>
# 检查网络策略 kubectl get networkpolicies -n <namespace> # 使用 Netshoot 调试 kubectl run netshoot --image=nicolaka/netshoot -it --rm -- bash
# 备份 ETCDCTL_API=3 etcdctl snapshot save snapshot.db \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key # 恢复 ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
# 安装 Velero velero install --provider aws \ --plugins velero/velero-plugin-for-aws:v1.8.0 \ --bucket velero \ --secret-file ./credentials-velero \ --use-volume-snapshots=true # 备份 velero backup create my-backup --include-namespaces my-app # 恢复 velero restore create --from-backup my-backup
# 调整 kubelet 参数 cat > /etc/kubernetes/kubelet-config.yaml <<EOF apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 250 podPidsLimit: 2048 containerLogMaxSize: 100Mi containerLogMaxFiles: 5 EOF
apiVersion: v1 kind: Namespace metadata: name: production labels: env: production team: platform
metadata: labels: app: myapp version: v1.0.0 environment: production team: backend
# ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: app-config data: config.yaml: | database: host: postgres port: 5432 --- # Secret apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: password: cGFzc3dvcmQxMjM=
Kubernetes 是云原生的核心,掌握它需要时间和实践。建议: