如何借助极狐GitLab 和Terraform以代码形式构建基础设施?
点击蓝字 关注我们
当多个团队使用一个Git仓库作为所有基础设施和应用部署代码的单一事实来源时,他们正在遵循一个良好的流程规范。基础设施团队可以使用Terraform进行自动化协作,并将代码部署到多个云服务中。本文展示了团队如何在极狐GitLab内与队友协作来创建一个Kubernetes集群。
第一步
首先登录到该项目在极狐GitLab中所在的组。下一步是打开 README.md 文件,其中显示了 gitops-demo 组的基本结构。这里有几个单独的项目和两个子组:基础设施和应用。
基础设施分组内部
在这个文件夹下,每个云都有一个单独的资源库(如图中所示Azure、GCP、AWS),此外,还有一个模板库。
类似的文件可以在所有三个对应的“云”代码仓库中找到所有的文件都是用Terraform编写的,以实现部署过程的自动化,同时在存储库中还存储了一个极狐GitLab-ci.yml文件,为自动化提供指示。
后台文件
使用HashiCorp的Terraform云服务在远程存储状态文件,可以保证状态文件的安全,并且在一个中心位置,便于任何作业的访问。使用Terraform Cloud的一个好处是,它有能力锁定状态,以确保每次只有一个工作可以运行,防止多个工作做出冲突的改变。代码将状态文件存储在Terraform云的一个名为gitops-demo的组织中,工作空间名为aws。这样运行状态就会保存在云供应商中,任何团队成员都可以随时访问。
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "gitops-demo"
workspaces {
name = "aws"
}
}
}
EKS.tf文件
EKS是另一个Terraform文件,它利用了Terraform集群的EKS模块。团队可以在EKS Terraform文件中定义参数,如子网的类型和节点的数量。
module "eks" {
source = "terraform-aws-modules/eks/aws"
cluster_name = "gitops-demo-eks"
subnets = "${module.vpc.public_subnets}"
write_kubeconfig = "false"
tags = {
Terraform = "true"
Environment = "dev"
}
vpc_id = "${module.vpc.vpc_id}"
worker_groups = [
{
instance_type = "m4.large"
asg_max_size = 5
tags = [{
key = "Terraform"
value = "true"
propagate_at_launch = true
}]
}
]
}
定义极狐GitLab管理员
利用 Kubernetes Provider 创建一个极狐GitLab管理用户,并自动设置为代码,由Terraform管理。
在极狐GitLab上注册集群
现在,一个Kubernetes集群已经创建。接下来我们开始在极狐GitLab上进行注册,以便将来在集群上部署更多代码。第一步是使用极狐GitLab Provider创建一个名为AWS cluster的群集。
data "gitlab_group" "gitops-demo-apps" {
full_path = "gitops-demo/apps"
}
provider "gitlab" {
alias = "use-pre-release-plugin"
version = "v2.99.0"
}
resource "gitlab_group_cluster" "aws_cluster" {
provider = "gitlab.use-pre-release-plugin"
group = "${data.gitlab_group.gitops-demo-apps.id}"
name = "${module.eks.cluster_id}"
domain = "eks.gitops-demo.com"
environment_scope = "eks/*"
kubernetes_api_url = "${module.eks.cluster_endpoint}"
kubernetes_token = "${data.kubernetes_secret.gitlab-admin-token.data.token}"
kubernetes_ca_cert = "${trimspace(base64decode(module.eks.cluster_certificate_authority_data))}"
}
该代码包含域名、环境范围和Kubernetes凭证。
运行该程序后,集群将在AWS中创建,并自动注册到gitops-demo/apps组。
使用极狐GitLab CI部署代码
Terraform模板
返回到基础设施组,打开Templates文件夹。在查看terraform.GitLab-ci.yml文件时,可以看到CI是如何使用Terraform将基础设施代码部署到云中的。
在CI文件里面,团队可以看到几个不同的阶段:验证、计划、应用和销毁。使用Hashicorp的Terraform基础镜像,用户可以运行不同的任务。
第一步是初始化Terraform。
before_script:
- terraform --version
- terraform init
- apk add --update curl
- curl -o kubectl
https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/kubectl
- install kubectl /usr/local/bin/ && rm kubectl
- curl -o aws-iam-authenticator
https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/aws-iam-authenticator
- install aws-iam-authenticator /usr/local/bin/ && rm
aws-iam-authenticator
下一步是验证一切是否正确。
validate:
stage: validate
script:
- terraform validate
- terraform fmt -check=true
only:
- branches
重要的是要记住,好的GitOps工作流程包括为变化创建一个合并请求。
merge review:
stage: plan
script:
- terraform plan -out=$PLAN
- echo \`\`\`diff > plan.txt
- terraform show -no-color ${PLAN} | tee -a plan.txt
- echo \`\`\` >> plan.txt
- sed -i -e 's/ +/+/g' plan.txt
- sed -i -e 's/ ~/~/g' plan.txt
- sed -i -e 's/ -/-/g' plan.txt
- MESSAGE=$(cat plan.txt)
- >-
curl -X POST -g -H "PRIVATE-TOKEN: ${GITLAB_TOKEN}"
--data-urlencode "body=${MESSAGE}"
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/discussions"
artifacts:
name: plan
paths:
- $PLAN
only:
- merge_requests
合并请求
合并请求(MR)是GitOps中最重要的步骤。这是一个审查所有修改并能监视这些变化带来影响的过程。合并请求也是一个协作工具,团队成员可以在这里讨论修改,可以在最后合并到主分支之前批准修改。
合并请求定义了基础设施作为代码运行时将会发生什么。MR创建后,Terraform计划被上传到MR。在所有的修改都被审查和批准后,代码可以被合并到主分支上。一旦代码变化被合并,所有的变化将被部署到生产中。
推荐阅读
GitOps系列 | 什么是GitOps?
GitOps系列 | 为什么协作技术对GitOps至关重要?
关于极狐(GitLab)
极狐(GitLab)公司面向中国市场,提供全球知名开源代码托管和项目管理平台GitLab的本地化DevOps产品——极狐GitLab。极狐GitLab是一个覆盖DevOps完整生命周期的开放式一体化平台,为整个DevOps生命周期提供了单一的数据存储、用户界面和权限模型,实现产品、开发、QA、安全和运维团队间的高效协同,显著加快软件创新生命周期。极狐GitLab由极狐信息技术(湖北)有限公司在国内独立运营,提供中国本地化功能和技术支持服务。基于“核心开放”原则,极狐(GitLab)公司广泛参与开源社区合作,持续交付DevOps创新。公司投资方包括GitLab Inc.、红杉宽带跨境数字产业基金,以及高成资本。