📅 第三阶段:进阶概念与生产实践 – 每日学习计划 (14天)
🎯 阶段目标
深入理解 Kubernetes 安全与权限控制(RBAC)
掌握应用可观测性方案(监控、日志)
学习高级调度策略与集群运维
了解生态工具(Helm, Operator)和 GitOps 实践
具备设计和管理生产级应用的能力
深入理解 Kubernetes 安全与权限控制(RBAC)
掌握应用可观测性方案(监控、日志)
学习高级调度策略与集群运维
了解生态工具(Helm, Operator)和 GitOps 实践
具备设计和管理生产级应用的能力
📚 每日学习安排
Day 1:ServiceAccount 与 RBAC 基础
理论学习:
ServiceAccount 的作用:为 Pod 中的进程提供身份标识
RBAC 核心概念:Role
/ClusterRole
(定义权限),RoleBinding
/ClusterRoleBinding
(绑定权限)
Role
(命名空间内) vs ClusterRole
(集群范围)
动手实践:
# 1. 创建一个新的ServiceAccount
kubectl create serviceaccount my-sa
# 2. 创建一个Role,允许获取和列出Pod信息
kubectl create role pod-reader --verb=get,list,watch --resource=pods
# 3. 将Role绑定到ServiceAccount
kubectl create rolebinding my-sa-pod-reader --role=pod-reader --serviceaccount=default:my-sa
# 4. 验证权限 (应在default命名空间内)
kubectl auth can-i list pods --as=system:serviceaccount:default:my-sa
kubectl auth can-i create pods --as=system:serviceaccount:default:my-sa
理论学习:
ServiceAccount 的作用:为 Pod 中的进程提供身份标识
RBAC 核心概念:
Role
/ClusterRole
(定义权限),RoleBinding
/ClusterRoleBinding
(绑定权限)Role
(命名空间内) vsClusterRole
(集群范围)
动手实践:
# 1. 创建一个新的ServiceAccount
kubectl create serviceaccount my-sa
# 2. 创建一个Role,允许获取和列出Pod信息
kubectl create role pod-reader --verb=get,list,watch --resource=pods
# 3. 将Role绑定到ServiceAccount
kubectl create rolebinding my-sa-pod-reader --role=pod-reader --serviceaccount=default:my-sa
# 4. 验证权限 (应在default命名空间内)
kubectl auth can-i list pods --as=system:serviceaccount:default:my-sa
kubectl auth can-i create pods --as=system:serviceaccount:default:my-sa
Day 2:ClusterRole 与 Kubernetes 安全上下文
理论学习:
ClusterRoleBinding
的用法和影响范围
Pod 安全上下文(Security Context):限制容器权限(以非root用户运行等)
最小权限原则
动手实践:
# 1. 创建一个使用之前ServiceAccount并设置安全上下文的Pod:pod-with-sa.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-sa
spec:
serviceAccountName: my-sa # 指定SA
containers:
- name: busybox
image: busybox
command: ['sleep', '3600']
securityContext:
runAsNonRoot: true
runAsUser: 1000
allowPrivilegeEscalation: false
kubectl apply -f pod-with-sa.yaml
kubectl exec -it pod-with-sa -- sh
# 在容器内尝试访问K8s API(看看SA的权限)
apk add curl
curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default/api/v1/namespaces/default/pods --insecure
理论学习:
ClusterRoleBinding
的用法和影响范围Pod 安全上下文(Security Context):限制容器权限(以非root用户运行等)
最小权限原则
动手实践:
# 1. 创建一个使用之前ServiceAccount并设置安全上下文的Pod:pod-with-sa.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-sa
spec:
serviceAccountName: my-sa # 指定SA
containers:
- name: busybox
image: busybox
command: ['sleep', '3600']
securityContext:
runAsNonRoot: true
runAsUser: 1000
allowPrivilegeEscalation: false
kubectl apply -f pod-with-sa.yaml
kubectl exec -it pod-with-sa -- sh
# 在容器内尝试访问K8s API(看看SA的权限)
apk add curl
curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default/api/v1/namespaces/default/pods --insecure
Day 3:资源监控与 Metrics Server
理论学习:
资源请求(requests)和限制(limits)的重要性(CPU、内存)
Metrics Server:集群核心资源度量数据的聚合器
垂直Pod自动伸缩(VPA)与水平Pod自动伸缩(HPA)基础概念
动手实践:
# 1. 部署Metrics Server(如果尚未部署)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 2. 等待片刻,查看节点和Pod的资源使用情况
kubectl top nodes
kubectl top pods
# 3. 为一个Deployment配置资源限制和请求
# 修改你之前的web-frontend deployment,在container spec中添加:
# resources:
# requests:
# memory: "64Mi"
# cpu: "250m"
# limits:
# memory: "128Mi"
# cpu: "500m"
kubectl apply -f deployment-with-resources.yaml
kubectl describe pod <pod-name> # 查看资源限制是否生效
理论学习:
资源请求(requests)和限制(limits)的重要性(CPU、内存)
Metrics Server:集群核心资源度量数据的聚合器
垂直Pod自动伸缩(VPA)与水平Pod自动伸缩(HPA)基础概念
动手实践:
# 1. 部署Metrics Server(如果尚未部署)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 2. 等待片刻,查看节点和Pod的资源使用情况
kubectl top nodes
kubectl top pods
# 3. 为一个Deployment配置资源限制和请求
# 修改你之前的web-frontend deployment,在container spec中添加:
# resources:
# requests:
# memory: "64Mi"
# cpu: "250m"
# limits:
# memory: "128Mi"
# cpu: "500m"
kubectl apply -f deployment-with-resources.yaml
kubectl describe pod <pod-name> # 查看资源限制是否生效
Day 4:Prometheus 与 Grafana 入门
理论学习:
Prometheus:开源监控系统,拉取并存储时间序列数据
Grafana:开源的可视化平台,用于查询和展示监控数据
ServiceMonitor CRD:Prometheus Operator 用于发现监控目标的方式
动手实践:
# 1. 使用Helm添加Prometheus社区仓库并安装kube-prometheus-stack
# 该Chart包含了Prometheus, Grafana, 以及大量K8s监控看板
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install my-monitor prometheus-community/kube-prometheus-stack
# 2. 查看安装的Pod和服务
kubectl get pods -n default -l "release=my-monitor"
kubectl get svc -n default -l "release=my-monitor"
# 3. 端口转发访问Grafana UI
kubectl port-forward svc/my-monitor-grafana 3000:80
# 浏览器访问 http://localhost:3000
# 用户名: admin
# 密码: 获取命令 kubectl get secret my-monitor-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
理论学习:
Prometheus:开源监控系统,拉取并存储时间序列数据
Grafana:开源的可视化平台,用于查询和展示监控数据
ServiceMonitor CRD:Prometheus Operator 用于发现监控目标的方式
动手实践:
# 1. 使用Helm添加Prometheus社区仓库并安装kube-prometheus-stack
# 该Chart包含了Prometheus, Grafana, 以及大量K8s监控看板
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install my-monitor prometheus-community/kube-prometheus-stack
# 2. 查看安装的Pod和服务
kubectl get pods -n default -l "release=my-monitor"
kubectl get svc -n default -l "release=my-monitor"
# 3. 端口转发访问Grafana UI
kubectl port-forward svc/my-monitor-grafana 3000:80
# 浏览器访问 http://localhost:3000
# 用户名: admin
# 密码: 获取命令 kubectl get secret my-monitor-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Day 5:应用日志管理基础
理论学习:
容器日志的存储和查看方式 (kubectl logs
)
节点级日志代理:DaemonSet 模式的日志收集器(如 Fluent Bit)
集中式日志架构(EFK/ELK)
动手实践:
# 1. 查看指定Pod的日志
kubectl logs -f <your-pod-name> --tail=50
# 2. 查看包含多个容器的Pod的日志(指定容器名)
kubectl logs -f <pod-name> -c <container-name>
# 3. 部署一个简单的Fluent Bit DaemonSet进行日志收集(示例,可能需要根据环境调整)
# 这是一个简化示例,生产环境需要配置输出(如Elasticsearch)
kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-daemonset.yaml
# 4. 查看Fluent Bit Pod的运行状态
kubectl get pods -n logging # 或 default,取决于YAML中的命名空间
理论学习:
容器日志的存储和查看方式 (
kubectl logs
)节点级日志代理:DaemonSet 模式的日志收集器(如 Fluent Bit)
集中式日志架构(EFK/ELK)
动手实践:
# 1. 查看指定Pod的日志
kubectl logs -f <your-pod-name> --tail=50
# 2. 查看包含多个容器的Pod的日志(指定容器名)
kubectl logs -f <pod-name> -c <container-name>
# 3. 部署一个简单的Fluent Bit DaemonSet进行日志收集(示例,可能需要根据环境调整)
# 这是一个简化示例,生产环境需要配置输出(如Elasticsearch)
kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-daemonset.yaml
# 4. 查看Fluent Bit Pod的运行状态
kubectl get pods -n logging # 或 default,取决于YAML中的命名空间
Day 6:节点亲和性与污点/容忍度
理论学习:
节点亲和性(nodeAffinity):将 Pod 调度到具有特定标签的节点上
污点和容忍度(Taints and Tolerations):防止 Pod 被调度到特定节点,或优先驱逐
应用场景:专用硬件(GPU)、隔离工作负载
动手实践:
# 1. 查看节点的标签和污点
kubectl get nodes --show-labels
kubectl describe node <node-name> | grep Taint
# 2. 给一个节点打上污点(模拟Master节点或GPU节点)
kubectl taint nodes <node-name> special=true:NoSchedule
# 3. 创建一个Deployment,它无法调度到上述节点(观察Event)
kubectl create deployment test-taint --image=nginx
# 4. 创建一个带有容忍度的Pod:pod-with-toleration.yaml
# spec:
# tolerations:
# - key: "special"
# operator: "Equal"
# value: "true"
# effect: "NoSchedule"
kubectl apply -f pod-with-toleration.yaml
# 观察Pod是否被调度到该节点
理论学习:
节点亲和性(nodeAffinity):将 Pod 调度到具有特定标签的节点上
污点和容忍度(Taints and Tolerations):防止 Pod 被调度到特定节点,或优先驱逐
应用场景:专用硬件(GPU)、隔离工作负载
动手实践:
# 1. 查看节点的标签和污点
kubectl get nodes --show-labels
kubectl describe node <node-name> | grep Taint
# 2. 给一个节点打上污点(模拟Master节点或GPU节点)
kubectl taint nodes <node-name> special=true:NoSchedule
# 3. 创建一个Deployment,它无法调度到上述节点(观察Event)
kubectl create deployment test-taint --image=nginx
# 4. 创建一个带有容忍度的Pod:pod-with-toleration.yaml
# spec:
# tolerations:
# - key: "special"
# operator: "Equal"
# value: "true"
# effect: "NoSchedule"
kubectl apply -f pod-with-toleration.yaml
# 观察Pod是否被调度到该节点
Day 7:Pod 亲和性与反亲和性
理论学习:
Pod 亲和性(podAffinity):将 Pod 调度到已有同类 Pod 的节点(提高密度)
Pod 反亲和性(podAntiAffinity):将 Pod 分散到不同节点/域(提高可用性)
topologyKey
的概念(例如 kubernetes.io/hostname
, failure-domain.beta.kubernetes.io/zone
)
动手实践:
# 1. 创建一个使用反亲和性的Deployment:deployment-anti-affinity.yaml
# 目标:确保同一应用的Pod不会调度到同一个节点上
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-ha
spec:
replicas: 3
selector:
matchLabels:
app: web-ha
template:
metadata:
labels:
app: web-ha
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 软策略
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-ha
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
kubectl apply -f deployment-anti-affinity.yaml
kubectl get pods -o wide # 观察Pod是否分布在不同节点
理论学习:
Pod 亲和性(podAffinity):将 Pod 调度到已有同类 Pod 的节点(提高密度)
Pod 反亲和性(podAntiAffinity):将 Pod 分散到不同节点/域(提高可用性)
topologyKey
的概念(例如kubernetes.io/hostname
,failure-domain.beta.kubernetes.io/zone
)
动手实践:
# 1. 创建一个使用反亲和性的Deployment:deployment-anti-affinity.yaml
# 目标:确保同一应用的Pod不会调度到同一个节点上
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-ha
spec:
replicas: 3
selector:
matchLabels:
app: web-ha
template:
metadata:
labels:
app: web-ha
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 软策略
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-ha
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
kubectl apply -f deployment-anti-affinity.yaml
kubectl get pods -o wide # 观察Pod是否分布在不同节点
Day 8:包管理工具 Helm (一)
理论学习:
Helm 是什么:Kubernetes 的包管理器
核心概念:Chart(软件包)、Release(Chart的运行实例)、Repository(Chart仓库)
Helm V3 架构(无需 Tiller)
动手实践:
# 1. 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
# 2. 搜索和安装一个公开的Chart(例如安装Nginx)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo nginx
helm install my-webserver bitnami/nginx
# 3. 查看安装的Release和对应的K8s资源
helm list
kubectl get all -l app.kubernetes.io/instance=my-webserver
理论学习:
Helm 是什么:Kubernetes 的包管理器
核心概念:Chart(软件包)、Release(Chart的运行实例)、Repository(Chart仓库)
Helm V3 架构(无需 Tiller)
动手实践:
# 1. 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
# 2. 搜索和安装一个公开的Chart(例如安装Nginx)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo nginx
helm install my-webserver bitnami/nginx
# 3. 查看安装的Release和对应的K8s资源
helm list
kubectl get all -l app.kubernetes.io/instance=my-webserver
Day 9:包管理工具 Helm (二)
理论学习:
Chart 结构:Chart.yaml
, values.yaml
, templates/
目录
模板语法:{{ .Values.xxx }}
, {{ .Release.Name }}
使用 helm install/upgrade --set
覆盖 values
动手实践:
# 1. 创建一个你自己的Chart骨架
helm create my-first-chart
tree my-first-chart
# 2. 探索Chart结构,编辑 values.yaml 文件(例如修改replicaCount, image等)
cat my-first-chart/values.yaml
# 3. 调试和安装你的Chart
helm install --dry-run --debug my-release ./my-first-chart # 模拟安装,渲染模板
helm install my-release ./my-first-chart
# 4. 使用自定义值升级Release
helm upgrade my-release ./my-first-chart --set replicaCount=2
理论学习:
Chart 结构:
Chart.yaml
,values.yaml
,templates/
目录模板语法:
{{ .Values.xxx }}
,{{ .Release.Name }}
使用
helm install/upgrade --set
覆盖 values
动手实践:
# 1. 创建一个你自己的Chart骨架
helm create my-first-chart
tree my-first-chart
# 2. 探索Chart结构,编辑 values.yaml 文件(例如修改replicaCount, image等)
cat my-first-chart/values.yaml
# 3. 调试和安装你的Chart
helm install --dry-run --debug my-release ./my-first-chart # 模拟安装,渲染模板
helm install my-release ./my-first-chart
# 4. 使用自定义值升级Release
helm upgrade my-release ./my-first-chart --set replicaCount=2
Day 10:自定义资源定义 (CRD) 与 Operator 模式
理论学习:
CRD(Custom Resource Definition):扩展 K8s API
自定义资源(CR):CRD 的实例
Operator 模式:通过控制器自动管理CR背后的复杂应用(如数据库、监控系统)
动手实践:
# 1. 查看集群中已有的CRD
kubectl get crd
# 2. 尝试安装一个简单的Operator来体验(例如Cert-Manager,用于自动化TLS证书)
# 参考官方文档:https://cert-manager.io/docs/installation/
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.13.0/cert-manager.yaml
# 3. 查看Cert-Manager创建的CRD和Pod
kubectl get crd | grep cert-manager
kubectl get pods -n cert-manager
理论学习:
CRD(Custom Resource Definition):扩展 K8s API
自定义资源(CR):CRD 的实例
Operator 模式:通过控制器自动管理CR背后的复杂应用(如数据库、监控系统)
动手实践:
# 1. 查看集群中已有的CRD
kubectl get crd
# 2. 尝试安装一个简单的Operator来体验(例如Cert-Manager,用于自动化TLS证书)
# 参考官方文档:https://cert-manager.io/docs/installation/
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.13.0/cert-manager.yaml
# 3. 查看Cert-Manager创建的CRD和Pod
kubectl get crd | grep cert-manager
kubectl get pods -n cert-manager
Day 11:GitOps 实践 – Argo CD 入门 (一)
理论学习:
GitOps 核心思想:声明式配置+版本控制+自动化同步
Argo CD:流行的GitOps持续交付工具
应用(Application)CRD:定义源代码仓库和目标集群的映射关系
动手实践:
# 1. 在集群上安装Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 2. 获取Argo CD admin用户的初始密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
# 3. 端口转发访问Argo CD Server UI
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 浏览器访问 https://localhost:8080 (用户名admin, 密码为上一步获取的)
理论学习:
GitOps 核心思想:声明式配置+版本控制+自动化同步
Argo CD:流行的GitOps持续交付工具
应用(Application)CRD:定义源代码仓库和目标集群的映射关系
动手实践:
# 1. 在集群上安装Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 2. 获取Argo CD admin用户的初始密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
# 3. 端口转发访问Argo CD Server UI
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 浏览器访问 https://localhost:8080 (用户名admin, 密码为上一步获取的)
Day 12:GitOps 实践 – Argo CD 入门 (二)
理论学习:
Argo CD 的同步策略:自动(Auto-Sync)和手动(Manual)
健康状态评估与状态可视化
回滚机制
动手实践:
# 1. 使用CLI登录Argo CD(可选)
argocd login localhost:8080 --username admin --password <password> --insecure
# 2. 通过CLI或UI创建一个Application,指向一个包含K8s YAML的公开Git仓库
# 例如:https://github.com/argoproj/argocd-example-apps
# UI: 点击"+CREATE APPLICATION",填写Repository URL和Path,目标集群和命名空间
# CLI:
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
# 3. 查看应用状态并同步(如果设置为手动同步)
argocd app get guestbook
argocd app sync guestbook
# 在UI上观察应用状态变化
理论学习:
Argo CD 的同步策略:自动(Auto-Sync)和手动(Manual)
健康状态评估与状态可视化
回滚机制
动手实践:
# 1. 使用CLI登录Argo CD(可选)
argocd login localhost:8080 --username admin --password <password> --insecure
# 2. 通过CLI或UI创建一个Application,指向一个包含K8s YAML的公开Git仓库
# 例如:https://github.com/argoproj/argocd-example-apps
# UI: 点击"+CREATE APPLICATION",填写Repository URL和Path,目标集群和命名空间
# CLI:
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
# 3. 查看应用状态并同步(如果设置为手动同步)
argocd app get guestbook
argocd app sync guestbook
# 在UI上观察应用状态变化
Day 13:配置与密钥管理进阶 (Secrets Store CSI)
理论学习:
将敏感信息(数据库密码、API密钥)与镜像和部署流程分离
Secrets Store CSI Driver:从外部秘密仓库(如AWS Secrets Manager, HashiCorp Vault)动态注入秘密
相比原生Secret对象的优势(加密、审计、轮换)
动手实践:
# 1. 查看/安装Secrets Store CSI Driver(安装较复杂,本日以了解概念和查阅官方文档为主)
# 官方文档:https://secrets-store-csi-driver.sigs.k8s.io/
kubectl get pods -n kube-system -l app=secrets-store-csi-driver
# 2. 思考如何将之前手工创建的Secret(如db-creds)改为从外部Vault中获取
# 这是一个重要的生产实践理念,具体实现取决于你的秘密管理基础设施。
理论学习:
将敏感信息(数据库密码、API密钥)与镜像和部署流程分离
Secrets Store CSI Driver:从外部秘密仓库(如AWS Secrets Manager, HashiCorp Vault)动态注入秘密
相比原生Secret对象的优势(加密、审计、轮换)
动手实践:
# 1. 查看/安装Secrets Store CSI Driver(安装较复杂,本日以了解概念和查阅官方文档为主)
# 官方文档:https://secrets-store-csi-driver.sigs.k8s.io/
kubectl get pods -n kube-system -l app=secrets-store-csi-driver
# 2. 思考如何将之前手工创建的Secret(如db-creds)改为从外部Vault中获取
# 这是一个重要的生产实践理念,具体实现取决于你的秘密管理基础设施。
Day 14:阶段复习与综合挑战
任务:
目标:将第二阶段部署的“三层应用”(前端+后端+数据库)进行改造升级。
要求:
Helm化:将整个应用栈编写成一个Helm Chart。
安全化:为数据库组件创建独立的ServiceAccount。
资源化:为所有Pod配置合理的Resources Requests和Limits。
可观测:为前端和后端添加Prometheus注解,使其能被自动抓取(可选)。
调度优化:为数据库StatefulSet添加Pod反亲和性(preferredDuringSchedulingIgnoredDuringExecution
),尝试分散Pod。
GitOps化:将Chart放入Git仓库,在Argo CD中创建Application指向该仓库。
验证:
helm install --dry-run --debug
检查模板渲染是否正确。
helm install
部署后,验证所有Pod是否正常运行。
在Argo CD UI中查看应用状态是否为“Healthy”和“Synced”。
任务: 目标:将第二阶段部署的“三层应用”(前端+后端+数据库)进行改造升级。 要求:
Helm化:将整个应用栈编写成一个Helm Chart。
安全化:为数据库组件创建独立的ServiceAccount。
资源化:为所有Pod配置合理的Resources Requests和Limits。
可观测:为前端和后端添加Prometheus注解,使其能被自动抓取(可选)。
调度优化:为数据库StatefulSet添加Pod反亲和性(
preferredDuringSchedulingIgnoredDuringExecution
),尝试分散Pod。GitOps化:将Chart放入Git仓库,在Argo CD中创建Application指向该仓库。
验证:
helm install --dry-run --debug
检查模板渲染是否正确。helm install
部署后,验证所有Pod是否正常运行。在Argo CD UI中查看应用状态是否为“Healthy”和“Synced”。