如何使用Ansible和Helm在Azure Kubernetes中部署微服务到多环境?
多环境微服务部署Ansible+Helm配置方案
1. 目录结构规范
先做全局目录拆分,变量按环境隔离,避免不同环境配置混淆,参考结构如下:
. ├── ansible │ ├── inventories/ # 不同环境的Ansible inventory │ │ ├── dev/ │ │ │ ├── hosts # dev环境集群接入信息 │ │ │ └── group_vars/ │ │ │ └── all.yml # dev环境全局变量 │ │ └── qa/ │ │ ├── hosts # QA环境集群接入信息 │ │ └── group_vars/ │ │ └── all.yml # QA环境全局变量 │ ├── playbooks/ # 部署playbook │ └── roles/ # 通用部署角色 └── helm ├── base/ # 微服务通用Helm模板,不绑定环境 │ ├── payment/ │ └── order/ └── overrides/ # 各环境的差异化配置 ├── dev/ │ ├── payment.yaml │ └── order.yaml └── qa/ ├── payment.yaml └── order.yaml
2. Helm 部分配置
- 通用模板(base目录下的各微服务Chart)只写所有环境通用的配置,比如Deployment的结构、Service的端口定义、HPA的基础规则,所有差异化字段用
.Values变量占位,比如环境域名、副本数、资源配额、数据库地址、镜像标签等。 - 各环境的overrides文件只填差异化值,比如dev环境的payment服务配置可以写:
# helm/overrides/dev/payment.yaml replicaCount: 1 resources: limits: cpu: 500m memory: 512Mi env: DB_HOST: dev-db.internal DOMAIN: dev.example.com image: tag: latest
QA环境对应的配置直接替换为实际的环境值即可,不需要重复编写通用配置。
3. Ansible 部分配置
3.1 环境inventory配置
每个环境的hosts文件里配置对应K8s集群的接入信息,比如dev环境的hosts:
[dev] localhost ansible_connection=local [k8s_cluster:children] dev [k8s_cluster:vars] k8s_context=dev-cluster-context env=dev
3.2 部署Playbook编写
直接调用Ansible的helm模块完成部署,示例playbook(ansible/playbooks/deploy_service.yaml)如下:
--- - name: 部署微服务到指定K8s集群 hosts: k8s_cluster gather_facts: no vars: service_name: "{{ service | default('payment') }}" tasks: - name: 检查对应环境的Helm覆盖配置是否存在 stat: path: "../helm/overrides/{{ env }}/{{ service_name }}.yaml" register: override_file failed_when: not override_file.stat.exists - name: 使用Helm部署微服务 community.kubernetes.helm: name: "{{ service_name }}" chart_ref: "../helm/base/{{ service_name }}" release_namespace: "{{ service_name }}-ns" create_namespace: true kube_context: "{{ k8s_context }}" values_files: - "{{ override_file.stat.path }}" state: present
3.3 部署命令
部署时只需要指定环境和服务名即可,比如部署dev环境的payment服务:
ansible-playbook -i inventories/dev playbooks/deploy_service.yaml -e "service=payment"
部署QA环境的order服务:
ansible-playbook -i inventories/qa playbooks/deploy_service.yaml -e "service=order"
4. 注意事项
- 所有敏感配置(比如数据库密码、API密钥)不要明文写在变量文件里,可以用Ansible Vault加密存储,部署时传入解密密码即可。
- 每次部署前可以加
helm diff的前置校验步骤,对比当前集群运行配置和待部署配置的差异,避免误操作。 - K8s的context可以提前在执行部署的机器上通过
kubectl config get-contexts确认正确性,避免串到其他环境。
内容的提问来源于stack exchange,提问作者Debugger
相关产品推荐
相关产品推荐

