Kubernetes集群管理与运维:构建可靠的生产环境
2025/8/31大约 7 分钟
在生产环境中,Kubernetes集群的管理和运维是确保系统稳定性和可靠性的关键。随着集群规模的增长和应用复杂性的提升,有效的集群管理策略和自动化运维流程变得至关重要。本章将深入探讨使用Helm管理应用部署、集群自动化运维配置、Kubeadm集群生命周期管理以及集群配置和配置管理工具的使用,帮助读者构建可靠的生产环境。
使用 Helm 管理应用部署
Helm 简介
Helm是Kubernetes的包管理器,被称为Kubernetes的"apt"或"yum"。它通过Chart(包)的形式简化了复杂应用的部署和管理。
Helm 核心概念
- Chart:包含Kubernetes应用所需资源定义的包
- Repository:存储和分享Chart的地方
- Release:Chart在Kubernetes集群中的运行实例
- Config:用于覆盖Chart默认配置的自定义配置
Helm 安装与配置
安装 Helm
# 使用脚本安装
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 或者使用包管理器安装
# macOS
brew install helm
# Windows (Chocolatey)
choco install kubernetes-helm添加 Helm Repository
# 添加官方仓库
helm repo add stable https://charts.helm.sh/stable
# 添加Bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 更新仓库
helm repo update创建和管理 Chart
创建 Chart
# 创建新的Chart
helm create my-app
# Chart目录结构
my-app/
├── Chart.yaml
├── values.yaml
├── charts/
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
└── _helpers.tplChart.yaml 配置
apiVersion: v2
name: my-app
description: A Helm chart for my application
version: 0.1.0
appVersion: "1.0"
kubeVersion: ">=1.19.0-0"
home: https://example.com
sources:
- https://github.com/mycompany/my-app
maintainers:
- name: John Doe
email: john.doe@example.com模板化资源配置
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
resources:
{{- toYaml .Values.resources | nindent 12 }}Helm 部署与管理
部署应用
# 安装Chart
helm install my-release ./my-app
# 安装并指定配置
helm install my-release ./my-app -f values-production.yaml
# 安装远程Chart
helm install my-nginx bitnami/nginx管理 Release
# 查看已安装的Release
helm list
# 查看Release状态
helm status my-release
# 升级Release
helm upgrade my-release ./my-app
# 回滚Release
helm rollback my-release 1
# 删除Release
helm uninstall my-releaseHelm 最佳实践
版本管理
# 打包Chart
helm package my-app
# 部署特定版本
helm install my-release ./my-app --version 1.2.3依赖管理
# Chart.yaml中的依赖
dependencies:
- name: mysql
version: "1.6.5"
repository: "https://charts.helm.sh/stable"
- name: redis
version: "16.1.0"
repository: "https://charts.bitnami.com/bitnami"# 更新依赖
helm dependency update配置集群的自动化运维(如升级与备份)
集群备份策略
使用 Velero 进行备份
# 安装Velero CLI
curl -u <token>: https://get.helm.sh/helm-v3.9.0-linux-amd64.tar.gz | tar xz
mv linux-amd64/helm /usr/local/bin/helm
# 添加Velero Helm仓库
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
# 安装Velero
helm install velero vmware-tanzu/velero \
--namespace velero \
--create-namespace \
--set-file credentials.secretContents.cloud=credentials-velero \
--set configuration.provider=aws \
--set configuration.backupStorageLocation.name=aws \
--set configuration.backupStorageLocation.bucket=velero-backup-bucket \
--set configuration.backupStorageLocation.config.region=us-west-2 \
--set configuration.volumeSnapshotLocation.name=aws \
--set configuration.volumeSnapshotLocation.config.region=us-west-2创建备份策略
# 创建一次性备份
velero backup create my-backup
# 创建定期备份
velero schedule create daily-backup --schedule="0 1 * * *"
# 创建带标签的备份
velero backup create tagged-backup --labels environment=production,team=backend恢复备份
# 恢复完整备份
velero restore create --from-backup my-backup
# 恢复特定资源
velero restore create --from-backup my-backup --include-resources persistentvolumes,persistentvolumeclaims
# 恢复到不同命名空间
velero restore create --from-backup my-backup --namespace-mappings production:staging集群监控与告警
部署 Prometheus Operator
# 添加Prometheus Operator Helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 安装Prometheus Operator
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace配置告警规则
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: cluster-alerts
namespace: monitoring
spec:
groups:
- name: cluster.rules
rules:
- alert: ClusterDown
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Cluster is down"
description: "Cluster has been down for more than 5 minutes."自动化运维脚本
集群健康检查脚本
#!/bin/bash
# cluster-health-check.sh
echo "Checking cluster health..."
# 检查节点状态
echo "Node status:"
kubectl get nodes
# 检查系统Pod状态
echo "System pod status:"
kubectl get pods -n kube-system
# 检查组件状态
echo "Component status:"
kubectl get componentstatuses
# 检查集群事件
echo "Recent events:"
kubectl get events --sort-by=.metadata.creationTimestamp | tail -10定期维护脚本
#!/bin/bash
# cluster-maintenance.sh
echo "Performing cluster maintenance..."
# 清理已完成的Jobs
kubectl delete jobs --field-selector status.successful=1 --all-namespaces
# 清理失败的Pods
kubectl delete pods --field-selector status.phase=Failed --all-namespaces
# 清理未使用的PV
kubectl delete pv --field-selector status.phase=Released
# 清理过期的Events
kubectl delete events --field-selector involvedObject.kind!=Node --all-namespaces使用 Kubeadm 管理集群生命周期
Kubeadm 简介
Kubeadm是Kubernetes官方提供的集群部署和管理工具,旨在简化集群的创建、升级和维护。
Kubeadm 工作流程
- 初始化:创建控制平面节点
- 加入:将工作节点加入集群
- 升级:升级集群版本
- 维护:执行集群维护操作
集群初始化
配置文件初始化
# kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.24.0
controlPlaneEndpoint: "k8s-api.example.com:6443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: "unix:///var/run/containerd/containerd.sock"# 使用配置文件初始化集群
kubeadm init --config kubeadm-config.yaml手动初始化
# 初始化控制平面
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=k8s-api.example.com:6443 \
--upload-certs节点管理
添加工作节点
# 在工作节点上执行
kubeadm join k8s-api.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>添加控制平面节点
# 在新的控制平面节点上执行
kubeadm join k8s-api.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <certificate-key>删除节点
# 从集群中删除节点
kubectl delete node <node-name>
# 在节点上重置kubeadm状态
kubeadm reset集群升级
升级控制平面
# 升级kubeadm
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.25.0-00 && \
apt-mark hold kubeadm
# 查看升级计划
kubeadm upgrade plan
# 执行升级
kubeadm upgrade apply v1.25.0升级节点组件
# 升级kubelet和kubectl
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.25.0-00 kubectl=1.25.0-00 && \
apt-mark hold kubelet kubectl
# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet管理集群配置与配置管理工具
Kubernetes 配置管理
kubeconfig 文件
# ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <ca-data>
server: https://k8s-api.example.com:6443
name: production
contexts:
- context:
cluster: production
user: admin
name: production-admin
current-context: production-admin
kind: Config
preferences: {}
users:
- name: admin
user:
client-certificate-data: <cert-data>
client-key-data: <key-data>多集群配置管理
# 设置不同集群的上下文
kubectl config set-context production --cluster=production --user=admin
kubectl config set-context staging --cluster=staging --user=admin
# 切换上下文
kubectl config use-context production
# 查看当前上下文
kubectl config current-context配置管理工具
Kustomize
# 安装Kustomize
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
# 创建kustomization.yaml
cat <<EOF > kustomization.yaml
resources:
- deployment.yaml
- service.yaml
configMapGenerator:
- name: app-config
literals:
- DATABASE_HOST=localhost
- DATABASE_PORT=5432
secretGenerator:
- name: app-secret
literals:
- DATABASE_PASSWORD=secretpassword
EOF
# 应用配置
kubectl apply -k .Helm vs Kustomize
| 特性 | Helm | Kustomize |
|---|---|---|
| 包管理 | 支持 | 不支持 |
| 模板化 | 支持 | 通过patch支持 |
| 版本管理 | 支持 | 不支持 |
| 学习曲线 | 较陡峭 | 相对简单 |
| 适用场景 | 复杂应用部署 | 配置定制 |
GitOps 实践
使用 Argo CD
# 安装Argo CD CLI
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
# 部署Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 创建应用
argocd app create guestbook \
--repo https://github.com/argoproj/argocd-example-apps.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace default使用 Flux
# 安装Flux CLI
curl -s https://fluxcd.io/install.sh | sudo bash
# 引导Flux
flux bootstrap github \
--owner=myorg \
--repository=my-cluster-config \
--branch=main \
--path=./clusters/my-cluster \
--personal配置安全最佳实践
敏感信息管理
# 使用SealedSecrets保护敏感信息
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: my-secret
namespace: default
spec:
encryptedData:
username: <encrypted-username>
password: <encrypted-password>配置审计
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["configmaps", "secrets"]
verbs: ["create", "update", "delete", "patch"]通过本章的学习,读者应该能够深入理解使用Helm管理应用部署的方法,掌握集群自动化运维的策略和工具,熟练使用Kubeadm管理集群生命周期,以及有效管理集群配置和配置管理工具。这些知识对于构建和维护可靠的生产环境至关重要。
