十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Argo CD Helm 测试夹具解析:以 Redis Chart 文档为蓝本,读懂 helm template 背后的 values 机制

Argo CD Helm 测试夹具解析:以 Redis Chart 文档为蓝本,读懂 helm template 背后的 values 机制 Argo CD Helm 测试夹具解析以 Redis Chart 文档为蓝本读懂 helm template 背后的 values 机制【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd本文以 Argo CD 仓库中util/helm/testdata/redis/README.md这份 Redis Helm chart 文档为主体完整梳理该 chart 的安装、配置参数、网络策略、持久化与监控能力并结合 values.yaml、templates/_helpers.tpl 等模板源码与 util/helm/helm_test.go 测试用例说明这份 chart 在 Argo CD 的 Helm 集成helm template渲染、values 文件覆盖、参数提取中扮演的角色。读完后你能掌握该 chart 的完整参数体系、文档默认值与真实 values 默认值的差异点以及 Argo CD 是如何用这份 chart 验证本地路径 Helm 应用的。一、这份文档在 Argo CD 仓库中的定位util/helm/testdata/redis/README.md 并不是面向生产环境的部署手册而是 Argo CD Helm 集成模块util/helm/helm.go的一组测试夹具testdata文档Chart.yaml 声明这是一个apiVersion: v2、name: redis、version: 3.6.5、appVersion: 4.0.10的 chart基于 Bitnami Redis 镜像同目录下的 values.yaml 与 values-production.yaml 提供两套参数取值恰好覆盖 README 中测试配置 / 生产配置两种安装方式util/helm/helm_test.go 中多个用例直接以./testdata/redis为 chart 根路径验证 Argo CD 的NewHelmApp包装器对本地路径 chart 的模板渲染与参数提取能力。README 对 chart 的原始描述是该 chart 使用 Helm 包管理器在 Kubernetes 集群上引导部署一个 Redis 实例基于 Bitnami Redis 镜像。安装前提为Kubernetes 1.8底层基础设施支持 PV 动态供给PV provisioner。适用前提提示文档中的helm install stable/redis、helm delete等命令是 Helm v2 时代语法--name参数、stable仓库索引属于 chart 自身历史文档本文在讲解时以仓库内实际存在的文件与模板为准Helm v2/v3 的差异仅在命令层面不影响对 values 参数机制的理解。二、快速安装TL;DR 与安装/卸载流程2.1 两种典型安装方式README 给出的 TL;DR 区分了测试与生产两种配置# Testing configuration $ helm install stable/redis# Production configuration $ helm install stable/redis --values values-production.yaml两者的实质差异就是是否传入 values 覆盖文件。对照仓库中真实的 values 文件差异一目了然差异点values.yaml测试values-production.yaml生产cluster.slaveCount13metrics.enabledfalsetruenetworkPolicy.enabledfalsetrueimage.pullPolicyAlwaysIfNotPresent这正是 Argo CD 测试用例要验证的行为TestHelmTemplateValues以values-production.yaml渲染后断言 slave Deployment 的Replicas为 3而未带 values 文件时渲染对象数为 5无 metrics/NetworkPolicy 对象带 production values 后对象数变为 8——对象数量随 values 开关变化见 util/helm/helm_test.go。2.2 指定 release 名安装与卸载README 指定以my-release为 release 名安装$ helm install --name my-release stable/redis该命令以默认配置在集群中部署 Redis所有可在安装时配置的参数见下文配置一节。列出全部 release 可用helm list。release 名会直接影响渲染出的资源名。chart 的命名逻辑在 templates/_helpers.tpl 中定义若 release 名包含 chart 名redisfullname 取 release 名本身否则拼接为release-chart名并截断到 63 字符。TestHelmTemplateReleaseNameOverwrite用Name: my-release渲染后断言 StatefulSet 名为my-release-redis-master因 release 名不含 redis故为拼接结果见 util/helm/helm_test.go。卸载则使用$ helm delete my-release该命令删除与该 release 关联的全部 Kubernetes 组件并移除 release 记录。三、Configuration完整参数体系README 的 Configuration 一节列出了该 chart 全部可配置参数及默认值。由于 slave 侧参数未定义时继承 master 对应值values.yaml中 slave 段落注释也明确说明 The rest of the parameters, if undefined, will inherit those declared in Redis Master下表按 README 原始骨架完整给出并在模板实际默认列标注与 values.yaml 实际取值不一致的条目。3.1 镜像与集群拓扑参数ParameterDescription文档声明默认值模板实际默认values.yamlimage.registryRedis Image registrydocker.io一致image.repositoryRedis Image namebitnamilegacy/redis一致tag 为4.0.10-debian-9image.tagRedis Image tag{VERSION}4.0.10-debian-9image.pullPolicyImage pull policyAlways一致image.pullSecretsSpecify docker-registry secret names as an arraynil一致注释形式cluster.enabledUse master-slave topologytrue一致cluster.slaveCountNumber of slaves1一致production 为3镜像拼接由 _helpers.tpl 的redis.image定义 完成printf %s/%s:%s将 registry、repository、tag 合成完整镜像地址master StatefulSet 容器image字段即引用该模板redis-master-statefulset.yaml。3.2 认证参数ParameterDescription默认值existingSecretName of existing secret object (for password authentication)nilusePasswordUse passwordtruepasswordRedis password (ignored if existingSecret set)Randomly generated密码生成的真实实现见 templates/secrets.yaml当usePassword为真且未指定existingSecret时chart 会渲染一个 Opaque Secretredis-password键按以下优先级取值——passwordContent已编码内容→passwordb64enc后写入→randAlphaNum 10随机生成 10 位字母数字串。master 容器侧则通过REDIS_PASSWORD环境变量引用该 Secret 的redis-password键redis-master-statefulset.yaml关闭密码时改为注入ALLOW_EMPTY_PASSWORDyes。3.3 网络策略、ServiceAccount 与 RBACParameterDescription默认值networkPolicy.enabledEnable NetworkPolicyfalsenetworkPolicy.allowExternalDont require client label for connectionstrueserviceAccount.createSpecifies whether a ServiceAccount should be createdfalseserviceAccount.nameThe name of the ServiceAccount to createGenerated using the fullname templaterbac.createSpecifies whether RBAC resources should be createdfalserbac.role.rulesRules to create[]NetworkPolicy 模板见 templates/networkpolicy.yaml它选中appredis.name的 Pod放行 6379 端口入站流量仅当allowExternal为false时才附加from.podSelector要求对端携带fullname-client: true标签。apiVersion由 _helpers.tpl 的networkPolicy.apiVersion依据集群版本自适应选择K8s 1.4~1.6 用extensions/v1beta1否则networking.k8s.io/v1。ServiceAccount 名称的选取逻辑在redis.serviceAccountName模板中serviceAccount.create为真时用 fullname 或显式name否则回退到default。3.4 监控Metrics exporter参数ParameterDescription文档声明默认值模板实际默认metrics.enabledStart a side-car prometheus exporterfalse一致metrics.image.registryRedis exporter image registrydocker.io一致metrics.image.repositoryRedis exporter image namebitnamilegacy/redisoliver006/redis_exportermetrics.image.tagRedis exporter image tagv0.20.2一致metrics.image.pullPolicyImage pull policyIfNotPresent一致metrics.image.pullSecretsSpecify docker-registry secret names as an arraynil一致注释形式metrics.podLabelsAdditional labels for Metrics exporter pod{}一致metrics.podAnnotationsAdditional annotations for Metrics exporter pod{}一致master.service.typeKubernetes Service type (redis metrics)LoadBalancerClusterIPmetrics.service.annotationsAnnotations for the services to monitor{}一致metrics.service.loadBalancerIPloadBalancerIP if metrics service type isLoadBalancernil一致空值metrics.resourcesExporter resource requests/limitMemory:256Mi, CPU:100mvalues 中未显式设置勘误提示文档表格中metrics.image.repository与master.service.typemetrics 行的默认值与真实 values.yaml 不符——exporter 镜像仓库实际是oliver006/redis_exportermaster Service 类型实际为ClusterIP。这提示读者README 的默认值列可能滞后于 values 文件以 chart 内values.yaml为准这也正是 Argo CD 用该 chart 做helm template回归测试的价值——它检验的是模板的真实渲染结果而非文档描述。metrics 启用后chart 会额外渲染 exporter 相关对象metrics-deployment.yaml、metrics-svc.yaml这也是前文测试对象数从 5 增至 8 的组成部分之一。3.5 持久化与主节点master参数ParameterDescription文档声明默认值模板实际默认persistence.existingClaimProvide an existing PersistentVolumeClaimnil一致注释形式master.persistence.enabledUse a PVC to persist data (master node)true一致master.persistence.pathPath to mount the volume at/bitnami/bitnami/redis/datamaster.persistence.subPathSubdirectory of the volume to mount at一致master.persistence.storageClassStorage class of backing PVCgeneric未设置模板中-表示禁用动态供给master.persistence.accessModesPersistent Volume Access Modes[ReadWriteOnce]一致master.persistence.sizeSize of data volume8Gi一致master.statefulset.updateStrategyUpdate strategy for StatefulSetonDeleteOnDeletemaster.statefulset.rollingUpdatePartitionPartition update strategynil一致注释形式master.podLabels/master.podAnnotationsAdditional labels / annotations for master pod{}一致master.portRedis master port6379一致master.argsRedis master command-line args[]一致master.disableCommandsComma-separated list of Redis commands to disable (master)FLUSHDB,FLUSHALL一致master.extraFlagsRedis master additional command line flags[]一致master.nodeSelectorRedis master Node labels for pod assignment{kubernetes.io/arch: amd64}未设置注释形式master.tolerationsToleration labels for master pod assignment[]一致注释形式master.affinityAffinity settings for master pod assignment[]一致空 mapmaster.schedulerNameName of an alternate schedulernil一致注释形式master.service.typeKubernetes Service type (redis master)ClusterIP一致master.service.annotationsannotations for redis master service{}一致master.service.loadBalancerIPloadBalancerIP if master service type isLoadBalancernil一致空值master.securityContext.enabledEnable security context (master pod)true一致master.securityContext.fsGroupGroup ID for the container (master pod)1001一致master.securityContext.runAsUserUser ID for the container (master pod)1001一致master.resourcesRedis master CPU/Memory resource requests/limitsMemory:256Mi, CPU:100mvalues 中未显式设置master.livenessProbe.enabledTurn on and off liveness probetrue一致master.livenessProbe.initialDelaySecondsDelay before liveness probe is initiated30一致master.livenessProbe.periodSecondsHow often to perform the probe3010master.livenessProbe.timeoutSecondsWhen the probe times out5一致master.livenessProbe.successThresholdMinimum consecutive successes1一致master.livenessProbe.failureThresholdMinimum consecutive failures5一致master.readinessProbe.enabledTurn on and off readiness probetrue一致master.readinessProbe.initialDelaySecondsDelay before readiness probe is initiated5一致master.readinessProbe.periodSecondsHow often to perform the probe10一致master.readinessProbe.timeoutSecondsWhen the probe times out1一致master.readinessProbe.successThresholdMinimum consecutive successes1一致master.readinessProbe.failureThresholdMinimum consecutive failures5一致master 侧渲染的核心是 redis-master-statefulset.yaml几个参数到 YAML 字段的映射值得注意探针livenessProbe/readinessProbe五个时间参数逐一映射到对应字段探针命令固定为exec: redis-cli ping第 94-117 行持久化master.persistence.enabled为真时走volumeClaimTemplatesPVC 名redis-dataaccessModes、size分别来自参数storageClass设为-时渲染storageClassName: 以禁用动态供给设为假则退化为emptyDir第 120-160 行更新策略updateStrategy.type直接取master.statefulset.updateStrategyOnDelete可选注入rollingUpdate.partition第 161-166 行。3.6 从节点slave参数默认继承 masterREADME 表格中 slave 段落的核心机制是继承——每个 slave 参数的默认值都写作对应 master 参数ParameterDescription默认值slave.serviceTypeKubernetes Service type (redis slave)LoadBalancervalues 中slave.service.type实际为ClusterIPslave.service.annotationsannotations for redis slave service{}slave.service.loadBalancerIPLoadBalancerIP if Redis slave service type isLoadBalancernilslave.portRedis slave portmaster.portslave.argsRedis slave command-line argsmaster.argsslave.disableCommandsComma-separated list of Redis commands to disable (slave)master.disableCommandsslave.extraFlagsRedis slave additional command line flagsmaster.extraFlagsslave.livenessProbe.*liveness probe 各时间参数enabled/initialDelaySeconds/periodSeconds/timeoutSeconds/successThreshold/failureThreshold对应master.livenessProbe.*slave.readinessProbe.*readiness probe 各时间参数同上对应master.readinessProbe.*slave.podLabels/slave.podAnnotationsAdditional labels / annotations for slave podmaster.podLabels/master.podAnnotationsslave.schedulerNameName of an alternate schedulernilslave.securityContext.*enabled / fsGroup / runAsUser对应master.securityContext.*slave.resourcesRedis slave CPU/Memory resource requests/limitsmaster.resourcesslave.affinityEnable node/pod affinity for slaves{}这套未定义即继承的机制在模板层的落地方式是default过滤器。以 slave 探针为例templates/_helpers.tpl 中的redis.slave.livenessProbe先取.Values.slave.livenessProbe | default .Values.master.livenessProbe再对每个字段逐个default回 master 值redis.slave.securityContext同理第 110-119 行。README 还说明上述参数映射到 Bitnami Redis 镜像中定义的 env 变量。结合模板源码可印证——master 容器注入了REDIS_REPLICATION_MODEmaster、REDIS_PASSWORD来自 Secret、REDIS_DISABLE_COMMANDS取master.disableCommands、REDIS_EXTRA_FLAGS取master.extraFlags的join 结果见 redis-master-statefulset.yaml。3.7 参数传递的三种方式README 给出的三种传参方式在 Argo CD 测试中全部有对应验证--set keyvalue$ helm install --name my-release \ --set passwordsecretpassword \ stable/redis该命令将 Redis 服务器密码设为secretpassword。values 文件-f$ helm install --name my-release -f values.yaml stable/redis可直接使用 chart 自带的 values.yaml。Argo CD 对应路径是TemplateOpts.ValuesTestHelmTemplateValues先通过path.ResolveValueFilePathOrUrl解析values-production.yaml再交给helm template渲染断言 slave Deployment 副本数为 3见 util/helm/helm_test.go。参数提取不渲染Argo CD 的Helm接口暴露了GetParametersutil/helm/helm.go返回 chart 参数到当前取值的map[string]string。测试验证了三种情形不带 values 文件时cluster.slaveCount为1带values-production.yaml时为3同时传入不存在的文件与 production 文件时仍以 production 值3为准TestHelmGetParams 系列。四、NetworkPolicy 启用流程README 的 NetworkPolicy 一节要求先安装实现 Kubernetes NetworkPolicy 规范的网络插件如 Calico/Cilium将networkPolicy.enabled设为true生产 values 即如此。对 Kubernetes v1.5 与 v1.6还需通过 DefaultDeny 命名空间注解强制开启 NetworkPolicy注意这会对该命名空间内所有Pod 生效kubectl annotate namespace default net.beta.kubernetes.io/network-policy{\ingress\:{\isolation\:\DefaultDeny\}}启用后只有携带生成 client 标签的 Pod 才能连接 Redis该标签在安装成功后的 NOTES 输出中展示。对照 templates/networkpolicy.yaml当allowExternal为false时ingress 规则要求对端 Pod 携带fullname-client: true标签而 NOTES.txt 在生成客户端 Pod 运行命令时会按需附加该标签——两者配合构成默认拒绝外部、白名单放行客户端的闭环。五、Persistence持久化路径与已有 PVCBitnami Redis 镜像将数据与配置存放在容器内/bitnami路径chart 默认通过动态卷供给在此位置挂载 Persistent Volume若已存在 PVC可在安装时指定。values 中master.persistence.path实际为/bitnami/redis/data即只持久化数据目录与 README仅持久化 data 目录时应设置persistence.path/bitnami/redis/data与persistence.subPathredis/data的说明相呼应——仓库中的默认 values 已经采用了该推荐姿势。使用已有 PersistentVolumeClaim创建 PersistentVolume创建 PersistentVolumeClaim安装 chart$ helm install --set persistence.existingClaimPVC_NAME stable/redis模板侧的对应逻辑在 redis-master-statefulset.yaml设置了persistence.existingClaim时master 改用persistentVolumeClaim.claimName引用该 PVC而不再走volumeClaimTemplates。六、MetricsPrometheus 导出器接入方式chart 可选启动 Prometheus metrics exportermetrics 端点为9121 端口通过 metrics Service 暴露集群内抓取可参考 Prometheus 官方 Kubernetes 抓取配置Service 可加prometheus.io/scrape: true、prometheus.io/port: 9121注解values.yaml 中已保留示例注释集群外抓取可利用 Kubernetes API proxy 访问端点。NetworkPolicy 模板中也为 metrics 做了联动当metrics.enabled为真时额外放行 9121 端口入站networkpolicy.yaml保证 Prometheus 抓取流量与 Redis 业务流量同样受策略管控。七、连接验证NOTES.txt 给出的运维指引templates/NOTES.txt 在安装后输出可执行的连接指引与 README 各章节一一对应集群内访问cluster 拓扑下读写走fullname-master.ns.svc.cluster.local只读走fullname-slave.ns.svc.cluster.local端口为master.port密码获取kubectl get secret fullname -o jsonpath{.data.redis-password} | base64 --decode与 secrets.yaml 的生成逻辑闭环客户端 Podkubectl run ... --image redis.image -- bash若启用 NetworkPolicy 且allowExternalfalse命令自动追加--labelsfullname-clienttrue集群外访问按 Service 类型分支——NodePort 取节点 IP 与 nodePortLoadBalancer 等待 ingress IP 就绪后直连ClusterIP 则kubectl port-forward到 Pod 的 6379 端口。八、从 Argo CD 视角看这份 chart 的验证价值回到 Argo CD 侧。util/helm/helm.go 定义了Helm接口其核心是包装helm命令行工具Template(opts)执行helm template并返回渲染输出GetParameters提取 chart 参数DependencyBuild执行helm dependency build。Redis chart 作为本地路径 chartNewHelmApp的workDir指向./testdata/redis恰好覆盖了 Argo CD 本地 Helm 应用最常见的三个验证面模板渲染正确性TestHelmTemplateReleaseName/TestHelmTemplateReleaseNameOverwrite验证 release 名到 StatefulSet 名的映射test-redis-master/my-release-redis-mastervalues 文件覆盖TestHelmTemplateValues验证values-production.yaml生效slave 副本数 3、渲染对象数 8参数提取与缺失文件容错TestHelmGetParams系列验证参数默认值cluster.slaveCount1、覆盖值3以及传入不存在 values 文件时仍取有效文件结果。对使用 Argo CD 管理 Helm 应用的开发者而言这份 redis testdata 的价值在于README values templates 三者构成一个自洽的参数语义 → 默认值 → 渲染结果链条任何对util/helm渲染逻辑的改动都能借助它快速回归验证。九、小结该 chart 文档util/helm/testdata/redis/README.md完整定义了 Redis chart 的安装、约 90 项 values 参数、NetworkPolicy、持久化与 metrics 能力slave 参数遵循未定义即继承 master的机制模板层由default过滤器实现文档默认值列与 values.yaml 存在若干出入exporter 镜像仓库、master Service 类型、persistence.path、liveness 周期、storageClass 等实践时以 values 文件与模板渲染结果为准在 Argo CD 仓库中这份 chart 是 util/helm 模块的关键测试夹具通过 util/helm/helm_test.go 中的模板渲染、values 覆盖与参数提取用例持续保障 Argo CD 对本地路径 Helm chart 的处理正确性。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表