
目录Helm —— K8s 包管理器RBAC 权限控制GitOps / ArgoCD 持续交付可观测性监控 日志 链路追踪NetworkPolicy 网络隔离Operator 模式多集群与多租户性能调优与资源管理生产安全加固学习资源与路线图一、Helm —— K8s 包管理器1.1 为什么需要 Helm部署一个生产级应用往往需要十几个 YAML 文件Deployment、Service、Ingress、ConfigMap、Secret、HPA……Helm 将这些打包为一个Chart一条命令完成部署。Helm 是 K8s 的apt/npm用 Chart 打包一套完整应用的所有 K8s 资源架构流程 Chart Repo ──helm pull──→ Helm CLI ←── values.yaml自定义参数 │ 渲染模板Go Template │ ┌─────────┴──────────┐ ↓ ↓ K8s 资源清单 Release 记录 (Deployment/Service/ 版本历史 Ingress/ConfigMap…) 支持回滚 │ kubectl apply │ K8s 集群1.2 核心概念概念说明Chart应用的打包单元包含模板 默认值ReleaseChart 在集群中的一次部署实例Repository存储 Chart 的仓库values.yaml默认配置值可在安装时覆盖1.3 Chart 目录结构mychart/ ├── Chart.yaml # Chart 元数据名称、版本、描述 ├── values.yaml # 默认参数值 ├── templates/ # K8s 资源模板Go Template 语法 │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ ├── configmap.yaml │ └── _helpers.tpl # 模板辅助函数 └── charts/ # 子 Chart依赖1.4 常用命令# 添加仓库helm repoaddbitnami https://charts.bitnami.com/bitnami helm repo update# 搜索 Charthelm search repo mysql helm search hub nginx# 搜索 ArtifactHub# 安装首次部署helminstallmy-mysql bitnami/mysql\--namespacedatabase\--create-namespace\--setauth.rootPasswordsecret\--setprimary.persistence.size20Gi# 用自定义 values 文件安装helminstallmy-app ./mychart-fvalues.prod.yaml# 查看已安装的 Releasehelm list-A# 所有 Namespace# 升级更新配置或版本helm upgrade my-mysql bitnami/mysql--setauth.rootPasswordnewpass# 查看升级历史helmhistorymy-mysql# 回滚到上一版本helm rollback my-mysql1# 1 revision 编号# 卸载helm uninstall my-mysql-ndatabase# 渲染模板不实际部署调试用helm template my-app ./mychart-fvalues.yaml1.5 编写自己的 Chart# templates/deployment.yamlGo Template 语法apiVersion:apps/v1kind:Deploymentmetadata:name:{{.Release.Name}}-weblabels:app:{{.Chart.Name}}spec:replicas:{{.Values.replicaCount}}template:spec:containers:-name:webimage:{{ .Values.image.repository }}:{{ .Values.image.tag }}resources:{{-toYaml .Values.resources|nindent 12}}# values.yamlreplicaCount:3image:repository:myapptag:1.0.0resources:limits:cpu:500mmemory:512Mi二、RBAC 权限控制K8s 的权限体系谁Subject能对什么资源Resource做什么操作Verb2.1 核心概念RBACRole-Based Access Control通过谁能对什么资源做什么操作来控制权限。Subject谁 绑定关系 权限定义 ────────────── ────────────────── ────────────────────────── User ──→ RoleBinding ──→ RoleNamespace 级别 ServiceAccount──→ ClusterRoleBinding ──→ ClusterRole集群级别 Group四种资源资源作用范围说明Role单个 Namespace定义该 Namespace 内的权限ClusterRole全集群定义集群级资源或跨 Namespace 权限RoleBinding单个 Namespace将 Subject 绑定到 RoleClusterRoleBinding全集群将 Subject 绑定到 ClusterRole2.2 YAML 示例# 1. 创建 ServiceAccountapiVersion:v1kind:ServiceAccountmetadata:name:deploy-botnamespace:production---# 2. 定义 Role只允许查看和更新 DeploymentapiVersion:rbac.authorization.k8s.io/v1kind:Rolemetadata:name:deployment-managernamespace:productionrules:-apiGroups:[apps]resources:[deployments]verbs:[get,list,watch,update,patch]-apiGroups:[]resources:[pods]verbs:[get,list,watch]---# 3. 绑定 ServiceAccount 与 RoleapiVersion:rbac.authorization.k8s.io/v1kind:RoleBindingmetadata:name:deploy-bot-bindingnamespace:productionsubjects:-kind:ServiceAccountname:deploy-botnamespace:productionroleRef:kind:Rolename:deployment-managerapiGroup:rbac.authorization.k8s.io2.3 常用 verbsget 查看单个资源 list 列出资源列表 watch 监听资源变化 create 创建资源 update 全量更新 patch 部分更新 delete 删除资源 exec 进入容器pods/exec2.4 调试与排查# 检查某个 ServiceAccount 是否有权限kubectl auth can-i get pods\--assystem:serviceaccount:production:deploy-bot\-nproduction# 查看某个用户的所有权限kubectl auth can-i--list--asjane-nproduction# 查看 RoleBindingkubectl get rolebindings-nproduction kubectl describe rolebinding deploy-bot-binding-nproduction最小权限原则生产环境中每个服务只授予其运行所需的最小权限定期审计 ClusterRoleBinding。三、GitOps / ArgoCD 持续交付声明式 GitOpsGit 仓库是唯一事实来源ArgoCD 自动同步集群状态3.1 GitOps 核心理念传统 CI/CD 代码变更 → CI 构建 → 直接 kubectl apply 到集群 问题谁在什么时候改了什么集群状态无法追溯 GitOps 代码变更 → CI 构建镜像 → 更新 Git 配置仓库 → ArgoCD 自动同步到集群 优势Git 是唯一事实来源所有变更可审计可回滚完整流程开发者 push 代码 │ ↓ CI PipelineGitHub Actions 等 ├── 运行测试 ├── docker build push镜像 tag git commit hash └── 更新 Git 配置仓库中的 image tag │ ↓ Git 配置仓库存放 K8s YAML / Helm Chart │ ↓ ArgoCD 每隔 3 分钟 Poll或 Webhook 触发 ↓ ArgoCD 对比期望状态Gitvs 实际状态集群 ├── 一致 → 无操作Synced └── 不一致 → 自动同步kubectl apply │ ↓ K8s 集群更新完成3.2 ArgoCD 安装与配置# 安装 ArgoCDkubectl create namespace argocd kubectl apply-nargocd\-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml# 获取初始密码kubectl-nargocd get secret argocd-initial-admin-secret\-ojsonpath{.data.password}|base64-d# 端口转发访问 UIkubectl port-forward svc/argocd-server-nargocd8080:4433.3 Application 资源apiVersion:argoproj.io/v1alpha1kind:Applicationmetadata:name:my-appnamespace:argocdspec:project:defaultsource:repoURL:https://github.com/myorg/k8s-configtargetRevision:mainpath:apps/production# 配置文件所在目录destination:server:https://kubernetes.default.svcnamespace:productionsyncPolicy:automated:prune:true# 自动删除 Git 中已移除的资源selfHeal:true# 漂移时自动修复syncOptions:-CreateNamespacetrue3.4 多环境管理Kustomizek8s-config/ ├── base/ # 基础配置所有环境共用 │ ├── deployment.yaml │ ├── service.yaml │ └── kustomization.yaml ├── overlays/ │ ├── staging/ # 测试环境覆盖 │ │ ├── kustomization.yaml │ │ └── patch-replicas.yaml │ └── production/ # 生产环境覆盖 │ ├── kustomization.yaml │ └── patch-resources.yaml# overlays/production/kustomization.yamlbases:-../../basepatches:-patch-resources.yamlimages:-name:myappnewTag:v1.3.0# CI 自动更新此处四、可观测性监控 日志 链路追踪4.1 三大支柱可观测性三支柱 Metrics指标 Logs日志 Traces链路追踪 ──────────────── ──────────── ────────────────── 数字化的时序数据 文本事件记录 请求跨服务的完整路径 CPU 使用率 80% Error: DB timeout 请求在哪个服务耗时最长 Prometheus Grafana Loki / EFK Jaeger / Tempo 适合告警和趋势分析 适合定位具体错误 适合微服务问题排查4.2 Prometheus Grafana 监控栈kube-prometheus-stack 一键安装推荐helm repoaddprometheus-community\https://prometheus-community.github.io/helm-charts helm repo update helminstallkube-prom prometheus-community/kube-prometheus-stack\--namespacemonitoring\--create-namespace\--setgrafana.adminPasswordadmin123安装后自动包含Prometheus、Grafana、Alertmanager、Node Exporter、kube-state-metrics。在应用中暴露自定义指标# 在 Pod 上加注解告诉 Prometheus 来抓取annotations:prometheus.io/scrape:trueprometheus.io/port:3000prometheus.io/path:/metrics常用 PromQL 查询# 容器 CPU 使用率% rate(container_cpu_usage_seconds_total[5m]) * 100 # 容器内存使用MB container_memory_usage_bytes / 1024 / 1024 # Pod 重启次数 kube_pod_container_status_restarts_total # HTTP 请求错误率 rate(http_requests_total{status~5..}[5m]) / rate(http_requests_total[5m])4.3 日志方案Loki Promtail# 安装 Loki Stackhelm repoaddgrafana https://grafana.github.io/helm-charts helminstallloki grafana/loki-stack\--namespacemonitoring\--setgrafana.enabledfalse\# 复用已有 Grafana--setpromtail.enabledtrue# 自动采集所有 Pod 日志应用日志最佳实践// 输出结构化 JSON 日志便于 Loki 查询{level:error,timestamp:2026-03-16T10:30:00Z,service:payment-api,trace_id:abc123,message:payment failed,user_id:u_456,error:timeout after 5s}4.4 告警规则示例# PrometheusRuleapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:app-alertsspec:groups:-name:apprules:-alert:HighErrorRateexpr:|rate(http_requests_total{status~5..}[5m]) / rate(http_requests_total[5m]) 0.05for:2mlabels:severity:criticalannotations:summary:错误率超过 5%当前{{ $value | humanizePercentage }}-alert:PodCrashLoopingexpr:rate(kube_pod_container_status_restarts_total[15m])0for:5mlabels:severity:warningannotations:summary:Pod {{ $labels.pod }} 频繁重启五、NetworkPolicy 网络隔离5.1 为什么需要 NetworkPolicy默认情况下 K8s 集群内所有 Pod 可以互相访问存在安全风险。NetworkPolicy 提供精细化的网络访问控制。无 NetworkPolicy默认 有 NetworkPolicy精细隔离 web → db ✓ 允许 web → db ✓ 允许 web → cache ✓ 允许 web → cache ✓ 允许 其他Pod→db ✓ 允许 其他Pod→db ✗ 禁止 其他Pod→cache ✓ 允许 其他Pod→cache ✗ 禁止5.2 常用策略示例默认拒绝所有入流量零信任基线apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:default-deny-ingressnamespace:productionspec:podSelector:{}# 匹配所有 PodpolicyTypes:-Ingress# 拒绝所有入流量只允许 web 访问 dbapiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:allow-web-to-dbnamespace:productionspec:podSelector:matchLabels:app:db# 保护 db PodpolicyTypes:-Ingressingress:-from:-podSelector:matchLabels:app:web# 只允许 web Pod 访问ports:-protocol:TCPport:3306限制出流量只允许访问特定外部地址spec:podSelector:matchLabels:app:webpolicyTypes:-Egressegress:-to:-podSelector:matchLabels:app:db-ports:# 允许 DNS 解析-port:53protocol:UDP注意NetworkPolicy 需要 CNI 插件支持如 Calico、Cilium、Weave。Flannel 默认不支持。六、Operator 模式6.1 什么是 OperatorOperator CRD自定义资源 Controller控制器用于自动化有状态应用的运维逻辑。K8s 内置资源 Operator 扩展资源 Deployment MySQLCluster自定义 Service →→→ RedisCluster自定义 ConfigMap KafkaTopic自定义 …… 内置控制器管理内置资源 自定义控制器管理自定义资源 知道如何备份、扩容、故障恢复Operator 能做什么人工运维 MySQL MySQL Operator ① 安装 MySQL ① 声明 MySQLCluster CR ② 配置主从复制 ② Operator 自动完成所有步骤 ③ 设置备份策略 └── 安装、配置复制、备份 ④ 监控并处理故障 ③ 主节点故障 → 自动故障转移 ⑤ 版本升级 ④ 声明升级版本 → 自动滚动升级 ……需要专业 DBA…… ……Operator 封装了 DBA 的知识……6.2 常用 OperatorOperator用途postgres-operatorZalandoPostgreSQL 高可用集群mysql-operatorOracleMySQL InnoDB 集群strimzi-kafka-operatorKafka 集群管理elasticsearch-operatorECKElasticsearch 集群cert-managerTLS 证书自动申请与续签prometheus-operatorPrometheus 实例管理6.3 自定义 CRD 示例# 定义自定义资源类型apiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:name:mysqlclusters.db.example.comspec:group:db.example.comnames:kind:MySQLClusterplural:mysqlclustersscope:Namespacedversions:-name:v1served:truestorage:trueschema:openAPIV3Schema:type:objectproperties:spec:type:objectproperties:replicas:type:integerversion:type:string---# 使用自定义资源apiVersion:db.example.com/v1kind:MySQLClustermetadata:name:prod-mysqlspec:replicas:3version:8.0.32backup:schedule:0 2 * * *storage:s3://my-bucket/mysql-backup七、多集群与多租户7.1 Namespace 隔离软隔离Namespace 提供资源逻辑隔离配合 RBAC NetworkPolicy ResourceQuota 实现多租户# 为每个团队创建独立 Namespacekubectl create namespace team-a kubectl create namespace team-b# 资源配额限制每个 Namespace 的资源用量kubectl apply-f-EOF apiVersion: v1 kind: ResourceQuota metadata: name: team-a-quota namespace: team-a spec: hard: requests.cpu: 10 requests.memory: 20Gi limits.cpu: 20 limits.memory: 40Gi pods: 50 persistentvolumeclaims: 10 EOF7.2 LimitRangePod 默认资源限制# 为 Namespace 内未设置资源限制的 Pod 自动注入默认值apiVersion:v1kind:LimitRangemetadata:name:default-limitsnamespace:team-aspec:limits:-type:Containerdefault:cpu:500mmemory:256MidefaultRequest:cpu:100mmemory:128Mimax:cpu:2memory:2Gi7.3 多集群管理单集群适合中小规模 多集群适合大规模/多地域 一个 K8s 集群管理所有应用 每个环境/地域独立集群 工具选型 Cluster API → 集群生命周期管理创建/升级/删除集群 Karmada → 跨集群应用分发和调度 ArgoCD → 多集群 GitOps 部署一个 ArgoCD 管理多个集群 Istio → 跨集群服务网格八、性能调优与资源管理8.1 资源 requests / limits 最佳实践resources:requests:# 调度依据Scheduler 按此分配节点cpu:100m# 100 毫核 0.1 个 CPUmemory:128Milimits:# 上限超出 CPU 被限速超出内存被 OOM Killcpu:500mmemory:512Mi常见误区❌ requests limits会导致节点资源浪费无法超售 ❌ 不设 limits一个 Pod 可能吃掉全部资源 ❌ limits.cpu 设置过低导致应用被 throttle响应变慢 ✅ requests 设为 P50 用量limits 设为 P99 用量 ✅ 用 VPA垂直 Pod 自动扩缩容分析历史用量后再设置8.2 VPA垂直 Pod 自动扩缩容# VPA 自动推荐和调整资源配置apiVersion:autoscaling.k8s.io/v1kind:VerticalPodAutoscalermetadata:name:web-vpaspec:targetRef:apiVersion:apps/v1kind:Deploymentname:webupdatePolicy:updateMode:Auto# Off只推荐Initial只在新建时设置Auto自动调整8.3 节点亲和性与反亲和性spec:affinity:# Pod 反亲和同一应用的 Pod 分散到不同节点高可用podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:100podAffinityTerm:labelSelector:matchLabels:app:webtopologyKey:kubernetes.io/hostname# 节点亲和调度到 SSD 节点nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:disk-typeoperator:Invalues:[ssd]8.4 PodDisruptionBudget中断预算# 保证滚动更新或节点维护时最少有 2 个 Pod 在运行apiVersion:policy/v1kind:PodDisruptionBudgetmetadata:name:web-pdbspec:minAvailable:2# 或用 maxUnavailable: 1selector:matchLabels:app:web九、生产安全加固9.1 Pod Security Standards# 在 Namespace 上强制执行安全标准apiVersion:v1kind:Namespacemetadata:name:productionlabels:pod-security.kubernetes.io/enforce:restricted# 强制执行pod-security.kubernetes.io/warn:restricted# 仅警告三个安全级别级别说明privileged无限制仅系统组件使用baseline防止常见特权提升适合通用工作负载restricted最严格要求非 root、只读文件系统等9.2 容器安全上下文spec:securityContext:runAsNonRoot:true# 禁止以 root 运行runAsUser:1000fsGroup:2000seccompProfile:type:RuntimeDefault# 启用 seccomp 过滤系统调用containers:-name:websecurityContext:allowPrivilegeEscalation:false# 禁止提权readOnlyRootFilesystem:true# 只读文件系统capabilities:drop:[ALL]# 删除所有 Linux capabilitiesadd:[NET_BIND_SERVICE]# 只添加必要的9.3 镜像安全# 1. 使用 Trivy 扫描镜像漏洞trivy image--severityHIGH,CRITICAL myapp:v1.0# 2. 配置 ImagePolicyWebhook禁止未经扫描的镜像部署# 3. 只允许从私有仓库拉取镜像配置 imagePullPolicy imagePullSecrets# 4. 使用镜像摘要而非 tagtag 可以被覆盖digest 不可变image: myappsha256:abc123def456...9.4 Secrets 加密# K8s Secret 默认只做 base64 编码不加密# 开启静态加密At-rest encryption# /etc/kubernetes/encryption-config.yaml# 推荐使用外部密钥管理系统# Sealed SecretsBitnami加密后可以提交到 Gitkubeseal--formatyamlsecret.yamlsealed-secret.yaml# External Secrets Operator从 AWS/GCP/Vault 自动同步密钥十、学习资源与路线图10.1 进阶学习路线阶段目标关键工具进阶 1包管理与多环境Helm、Kustomize进阶 2权限与安全RBAC、NetworkPolicy、Pod Security进阶 3持续交付ArgoCD、GitOps、Kustomize进阶 4可观测性Prometheus、Grafana、Loki、Jaeger进阶 5有状态应用Operator、StatefulSet 深入进阶 6性能与大规模VPA、Cluster Autoscaler、多集群10.2 推荐资源官方文档K8s 官方kubernetes.io/docsHelm 官方helm.sh/docsArgoCD 官方argo-cd.readthedocs.io实战练习killercoda.com — 免费在线 K8s 环境大量实验场景killer.sh — CKA/CKAD 模拟考试环境工具推荐k9s# 终端 UI极大提升日常操作效率kubectx# 快速切换集群上下文kubens# 快速切换 Namespacestern# 多 Pod 日志聚合查看kubectl-neat# 清理 kubectl get -o yaml 的噪音字段kube-score# YAML 最佳实践检查popeye# 集群健康检查