随着企业数字化转型的加速,容器化技术在生产环境中的应用越来越广泛。Kubernetes(简称K8s)作为容器编排的事实标准,已经成为企业构建和运维云原生应用的核心平台。然而,对于许多刚接触K8s的企业和个人来说,如何高效地从零开始搭建和运维一个K8s集群,仍然是一个不小的挑战。
本文将从零开始,深入解析K8s集群的运维流程,涵盖集群搭建、核心组件配置、日常运维、优化进阶以及安全性和高可用性等关键环节,帮助读者快速掌握K8s集群运维的核心技能。
Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它通过抽象容器运行时(如Docker)和资源管理(如计算、存储和网络)的复杂性,提供了一个统一的平台,使得开发者和运维人员能够更高效地管理云原生应用。
在K8s集群中,以下是最关键的核心组件:
K8s集群由一个主控节点(Master)和多个工作节点(Worker)组成。主控节点负责集群的调度和管理,而工作节点负责运行实际的应用容器。
在搭建K8s集群之前,需要确保以下环境准备到位:
kubeadm是Kubernetes官方提供的集群搭建工具,适合快速部署测试环境。以下是部署步骤:
安装必要依赖:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl添加Kubernetes GPG密钥:
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor > /usr/share/keyrings/kubernetes-archive-keyring.gpg添加Kubernetes源:
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list安装kubeadm、kubelet和kubernetes-cni:
sudo apt-get update && sudo apt-get install -y kubeadm kubelet kubernetes-cni初始化集群:
sudo kubeadm init --control-plane-endpoint="apiserver.example.com" --token abcdef.123456.newpassw0rd加入工作节点:在每台工作节点上执行初始化命令输出的kubeadm join命令。
部署完成后,可以通过以下命令验证集群状态:
kubectl get pods -n kube-system正常情况下,你应该看到所有系统 pods 都处于 Running 状态。
网络插件选择:K8s默认支持多种网络插件(如Flannel、Calico、Weave)。建议根据实际需求选择合适的插件。
# 以Flannel为例kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlCNI配置:确保所有节点的CNI插件配置一致,并正确挂载到容器运行时。
持久化存储:K8s支持多种存储后端(如LocalStorage、NFS、GlusterFS)。以下是LocalStorage的配置示例:
kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: local-storageprovisioner: kubernetes.io/local-storage动态 provisioning:通过StorageClass实现存储资源的动态分配。
ELK日志栈:集成Elasticsearch、Logstash和Kibana,实现集群日志的集中化管理。
# 部署Elasticsearchkubectl apply -f https://raw.githubusercontent.com/elastic/elasticsearch-kubernetes/7.10/deploy/kubernetes/manifests/elasticsearch-logging.yml日志收集:使用Fluentd或Promtail收集容器日志,并传输到Elasticsearch。
Prometheus监控:部署Prometheus和Grafana,实现集群的全面监控。
# 部署Prometheuskubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/prometheus/manifests/告警系统:集成Alertmanager,实现告警的通知和路由。
部署应用:使用Kubernetes Deployment控制器部署应用。
apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:latest ports: - containerPort: 80扩缩容:通过调整Deployment的replicas字段实现自动扩缩容。
kubectl scale deployment my-app --replicas=5资源配额:使用ResourceQuota和LimitRange限制资源使用。
apiVersion: resource.k8s.io/v1alpha1kind: ResourceQuotametadata: name: limit-quotaspec: hard: pods: "10" requests.cpu: "500m" requests.memory: "512Mi"节点亲和性:通过NodeAffinity和PodAffinity优化资源分配。
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: my-app-hpaspec: scaleRef: kind: Deployment name: my-app apiVersion: apps/v1 minReplicas: 2 maxReplicas: 10 targetMetricName: cpu utilization targetAverageValue: 50滚动更新:通过Deployment的滚动策略实现无中断更新。
kubectl rollout update deployment/my-app --image=my-app:new-version自愈机制:通过Liveness和Readiness探针确保Pod自动重启。
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all-ingressspec: podSelector: matchLabels: {} ingress: - from: - podSelector: {}apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: admin-rolerules:- apiGroups: ["*"] resources: ["*"] verbs: ["*"]kubectl create secret generic db-creds --from-literal=username=root --from-literal=password=mysqlkubectl enable auditing数据备份:定期备份Etcd和持久化存储。
kubectl get pods -n kube-system -l component=etcd | awk '{print $1}' | xargs -I {} kubectl cp {}:/var/lib/etcd/ etcd-backup/灾难恢复:制定完善的灾难恢复计划,确保集群快速恢复。
部署Grafana:
kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-workflows/stable/manifests/install.yaml配置监控:通过Prometheus和Grafana实现集群的全面监控。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yamlK8s集群的运维是一个复杂而重要的任务,需要运维人员具备扎实的技术功底和丰富的实战经验。从集群搭建到日常运维,从优化进阶到安全性保障,每一个环节都需要精心设计和运维。通过本文的深入解析,相信读者能够快速掌握K8s集群运维的核心技能,并在实际工作中灵活应用。