前言

前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的包管理工具 Helm 里也讲述了如何用Terraform 安装 Helm Charts,但我们都是在local 执行Terrafrom的,那么有什么办法自动化整个流程呢?并且让这些基础设施的代码也需要走Pull Request Review 评审。

这时候推荐一款利器:开源工具 Atlantis,在代码提交时自动运行terraform plan命令,并将 plan命令的输出添加到pull request的注释中,经过团队伙伴Approve之后,才能执行terraform apply 变更资源,资源apply 成功之后,代码合并到master分支,整个流程遵循GitOps的最佳实践。换句话说就是我们使用了 Atlantis 为 Terraform 实现 GitOps。

Atlantis 在国内的文章很少,本篇文章就给大家详细的介绍下如何使用这款利器。

关键词:Terraform自动化,Atlantis入门,Atlantis示例,Terraform Pull Request Automation, Terraform基础设施自动化

安装

前提条件

* Kubernetes 我用的GKE 1.22

* 准备一个common github user, 也可以用自己的账号

* 准备 Personal Access Token

* 随机生成一个 Webhook Secret

* kubectl 建一个 generic secret 供Atlantis使用

echo -n "xxx" > ghUser
echo -n "xxx" > ghToken
echo -n "xxx" > ghWebhookSecret kubectl create secret generic atlantis --from-file=ghUser --from-file=ghToken --from-file=ghWebhookSecret

安装

有多种方式,这里使用Kustomize 作为例子,k8s manifests 参考 my repo

修改 statefulset-patch.yaml 环境变量为自己的。

kustomize build sre-mgmt-dev > deploy.yaml  

kubectl apply -f deploy.yaml 

配置网关

需要一个Gateway,配置一个 URL 指向 atlantis ClusterIP svc ,我的 Ingress-nginx 配置参考。(Optional) Ingress-Nginx入门参考我下一篇文章 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

也可以把atlantis 置成 LB类型或者NodePort本地测试。

配置Github webhook

很简单,参考文档 https://www.runatlantis.io/docs/configuring-webhooks.html#github-github-enterprise

使用

权限

确保Running 在 Kubernetes 的 Atlantis service account 对所操作的资源有权限,能Terraform init/plan/apply 云端资源。

我这里是GCP Project作为例子。

* GKE default service account use node service account.
* (Optional) for GKE Workload Identity: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
 

配置 Atlantis.yaml

简单例子如下

假设Terraform 代码结构如下

Terraform
├── quick_demo1
│ ├── xxx.tf
│ └── xxx.tf
├── quick_demo2
├── xxx.tf
└── xxx.tf

Atlantis yaml 配置

---
version: 3
automerge: true
delete_source_branch_on_merge: true projects:
- name: project-1
dir: Terraform/quick_demo1
terraform_version: 1.2.9
autoplan:
when_modified:
- '**/*.tf' - name: project-2
dir: Terraform/quick_demo2
terraform_version: 1.2.9
autoplan:
when_modified:
- '**/*.tf'

当你修改TF文件 提交PR的时候,Atlantis 会自动使用default workflow 执行 Terraform Plan, plan result 会 comment到 PR里面。

注意: 需要配置 Github -> Settings -> Branches-> Branch protection rule -> Protect matching branches 需要Approve才能merge。

然后有队友Approve了PR, 你才可以执行 Atlantis Apply, 最终资源会被Terraform apply,PR 自动 merged to master。

Workflow breakdown

  • Step 1: Open a Pull Request
  • Step 2: Atlantis automatically run `terraform plan` and comments back on PR
  • Step 3: Someone reviews and approves PR
  • Step 4: Comment `atlantis apply`
  • Step 5: Atlantis run `terraform apply` and comments back on PR about result
  • Step 6: PR merged automatically.

自定义 Workflow

加个Terraform format check, 代码如下:

workflows:
test:
plan:
steps:
- env:
name: ENV_NAME
command: 'echo "dynamic-value-$(date)"'
- run: terraform${ATLANTIS_TERRAFORM_VERSION} fmt -check=true -write=false -diff=true
- init
- plan
apply:
steps:
- apply

需显示申明使用此workflow 如 "workflow: test", 完整 Atlantis yaml 参考

---
version: 3
automerge: true
delete_source_branch_on_merge: true projects:
- name: project-demo
dir: Terraform/quick_demo
terraform_version: 1.2.9
autoplan:
when_modified:
- '**/*.tf' - name: project-module-demo
dir: Terraform/module_demo/project_1
terraform_version: 1.2.9
workflow: test
autoplan:
when_modified:
- '**/*.tf' # (Optional) custom workflows
workflows:
test:
plan:
steps:
- env:
name: ENV_NAME
command: 'echo "dynamic-value-$(date)"'
- run: terraform${ATLANTIS_TERRAFORM_VERSION} fmt -check=true -write=false -diff=true
- init
- plan
apply:
steps:
- apply

atlantis.yaml

测试

总结

我们的Terraform 代码结构是按环境分成不同的folder,这样做的好处是可以通过github CODEOWNERS文件来针对不同的文件夹(环境)给不同的组权限。比如以下例子给予group-dev权限审批这个folder project-xx/dev下面的Terraform代码变化。

* @sre
Terraform/project-xx/dev/** @group-dev
Terraform/project-xx/prod/** @sre

我们也试过同一套代码利用Terraform的工作区workspace 来区分环境,实践下来不如上面的结构灵活,维护性差。

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。

云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis的更多相关文章

  1. 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

    前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...

  2. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  3. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes

    前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...

  4. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  5. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  6. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents

    前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...

  7. 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes

    前言 上一篇文章我们已经简单的入门Terraform, 本篇介绍如何使用Terraform在GCP和AWS 创建Kubernetes 资源. Kubernetes 在云原生时代的重要性不言而喻,等于这 ...

  8. Longhorn 企业级云原生容器存储解决方案-部署篇

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 安装 Longhorn 可以通过多种方式安装 ...

  9. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

随机推荐

  1. KingbaseES R3 集群删除test库导致主备无法切换问题

    案例说明: 在KingbaseES R3集群中,kingbasecluster进程会通过test库访问,连接后台数据库服务测试:如果删除test数据库,导致后台数据库服务访问失败,在集群主备切换时,无 ...

  2. [CG] 顶点动画贴图 (Vertex Animation Texture, VAT)

    什么是顶点动画? 简单来说,通过改变网格顶点的位置,使网格变形从而做成的动画.顶点动画的灵活度要远远高于骨骼动画.骨骼动画是靠骨骼(一堆有层级结构的节点,数量应该是远远小于网格顶点的数量的)的变化来驱 ...

  3. HBase原理深入

    HBase 读写数据流程 Hbase 读数据流程 首先从 zk 找到 meta 表的 region 位置,然后读取 meta 表中的数据,meta 表中存储了用户表的 region 信息 根据要查询的 ...

  4. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(20)-Fiddler精选插件扩展安装,让你的Fiddler开挂到你怀疑人生

    1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发.测试和管理项目上的任务.Fiddler已有的功能已经 ...

  5. 2020年12月-第01阶段-前端基础-HTML CSS 项目阶段(二)

    品优购项目(二) 1. 品优购首页布局 命名集合: 名称 说明 快捷导航栏 shortcut 头部 header 标志 logo 购物车 shopcar 搜索 search 热点词 hotwrods ...

  6. 【学习笔记】GBDT算法和XGBoost

    前言 这一篇内容我学了足足有五个小时,不仅仅是因为内容难以理解, 更是因为前面CART和提升树的概念和算法本质没有深刻理解,基本功不够就总是导致自己的理解会相互在脑子里打架,现在再回过头来,打算好好总 ...

  7. 使用 Elastic 技术栈构建 K8S 全栈监控 -3: 使用 Filebeat 采集 Kubernetes 集群日志

    文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-3/ 操作步骤 filebeat连接es使用上一步创建的secret: ...

  8. docker bridge 到 k8s pod 跨节点网络通信机制演进

  9. K8S容器HeadlessService间动态IP通信

    文件网址:https://www.kubebiz.com/KubeBiz/MongoDB?k8sv=v1.20 使用文件网址中提供的yaml文件安装三节点的mongodb集群,其service是hea ...

  10. .Net 7内容汇总(3)--反射优化

    反射这玩意,一直以来都是慢的代名词.一说XXX系统大量的反射,好多人第一印象就是会慢. 但是呢,我们又不得不使用反射来做一些事情,毕竟这玩意可以说啥都能干了对吧. It's immensely pow ...