FCon7折倒计时最后一周:日程已上线70%!查看详情>>> 了解详情
写点什么

GitOPS 与 Anthos Config Management

  • 2020-05-25
  • 本文字数:4907 字

    阅读完需:约 16 分钟

GitOPS 与Anthos Config Management

什么是 GitOps

GitOps 是一种新的持续交付的模型,其基本理念在于使用 Git 仓库作为基础架构和应用程序的配置信息的存储设施,使用 git 的版本管理功能实现对基础架构和应用程序的配置信息的控制,并且,一旦 git 中存储的配置信息发生改变,这些改变就能被自动应用到相应的基础架构或应用程序上,实现基础架构或应用程序的配置变更。


在使用 GitOps 进行持续交付,需要具备以下几个要素:


1、Git 仓库


2、配置评审流程


3、适用于 GitOps 的基础架构

Git 仓库

Git 仓库是存放所有配置信息以及配置信息历史的地方,并且,在 GitOps 实践中,Git 仓库是这些配置信息的唯一可信来源。GitOps 并不排斥 Git 以外的其他版本管理系统,但是由于 Git 的普及性,使得 Git 仓库成为 GitOps 的标配。标准的 Git 即可满足 GitOps 的需要,但是如果 Git 仓库还能提供代码评审,秘密管理等功能,则可以帮助管理员们进一步提高效率。


Git 仓库还可以对接其他的自动化系统,如代码检查系统,策略检查系统,自动化测试等。

评审流程

在 GitOps 模型中,不再有具体某个管理员拥有超级用户权限,取而代之的是管理员将要发生的变更提交到 Git 仓库中,而其他的管理员对该变更进行同行审议,通过审议后的变更会被合并到特定的分支,而 GitOps 基础架构会提取该特定分支的配置信息并予以部署,实现配置变更的操作。整个过程中管理员不需要接触基础架构,也不需要在基础架构中手工执行任何命令。这样做的好处有:


  • 降低了手工操作带来的出错风险

  • 同行审议降低了系统性出错的风险,比如设计错误

  • 由于所有的操作都在 git 仓库的历史记录中,而审议结果同样会被记录,极大的方便了后期审计和故障分析的过程


从而降低操作员本身引起的错误的可能性,提高系统可靠性。

GitOps 基础架构

GitOps 模型通过存放在 Git 中的配置信息对基础设施和应用系统进行管理,这对相关的基础设施提出了以下要求:


1、提供自动化操作的接口


GitOps 要求相关的基础设置能提供接口实现自动化,如 API 或者命令行界面,能够通过程序或者脚本控制对基础设施进行控制。这个要求还是比较直观的,如果基础设施不能提供自动化接口,那也没法跟 GitOps 结合。


2、操作能收敛


在 GitOps 模型中,需要相关的基础设施能够在发生异常时进行自动重试,直到成功执行。从管理员来说,要么等操作执行成功,要么把 git 仓库回滚。


3、幂等性


幂等性是指,同一个操作,无论执行多少次,跟执行一次的效果一样。这是一个重要的特性,这个特性能帮助 GitOps 模型在各种异常发生的情况下都能正确的恢复。


4、确定性


确定性要求基础设施的状态与存在 Git 中的配置信息的状态(版本)一一对应。通俗的说就是配置信息是哪个版本,基础设施会一定会出于对应的状态。


而 Kubernetes 能非常好的符合上述要求,使得目前的 GitOps 实践都是围绕 Kubernates 来实现的。

为什么要用 GitOps

使用 GitOps 可以为运维工作带来以下好处


1、提高生产力


GitOps 的目标在于简化发布流程,优化部署流水线,而且使用了被广泛接受的 Git,降低了学习曲线,从而能大大提高生产力


2、行为可审计


使用 GitOps 工作流管理集群,所有的操作历史都存放在 Git 仓库中,便于实现审计


3、更高的可靠性


借助 Git 的版本管理功能,可以实现配置信息方便的重现和回滚。由于基础架构提供幂等性和确定性的特性,整个系统都可以随着版本的切换改变到任何一个确定的状态,提供很好的可靠性。


4、实现一致性和标准化


GitOps 中,使用 Git 作为配置信息的唯一可信来源,使用提供确定性和操作收敛性的基础设施,实现系统在多个环境和多种部署条件下的一致性和标准化


5、更好的安全保证


使用 GitOps 可以实现配置信息和基础设施之间的强解耦,方便进一步简化密码等敏感信息的管理,提升了系统的安全性

Anthos Config Management 与 GitOps

Anthos Config Management (简称 ACM) 是 Google Anthos 平台上实践 GitOps 模型,提供跨 K8S 集群的全局配置管理和同步的工具。除此之外,ACM 还提供一个全局策略引擎(Policy Controller),借助 GitOps 理念,提供跨 K8S 集群同步的策略强制。



通过下面的 Demo,我们可以体验到使用 ACM 进行跨集群统一应用发布的便利性。

准备工作

在工作机上先安装好 kubectl:


apt-get install kubectl -y
复制代码


然后我们需要为 Anthos 组件创建 Service Account,并设置好相应的权限:


 gcloud iam service-accounts create anthos-testgcloud projects add-iam-policy-binding your-project-id \  --member="serviceAccount:anthos-test@your-project-id.iam.gserviceaccount.com" \  --role=roles/editor \  --role=roles/container.admin \  --role=roles/resourcemanager.projectIamAdmin \  --role=roles/iam.serviceAccountAdmin \  --role=roles/iam.serviceAccountKeyAdmin \  --role="roles/gkehub.connect"
gcloud iam service-accounts keys create ./anthos-test.json \ --iam-account anthos-test@your-project-id.iam.gserviceaccount.com
复制代码


创建 GKE 集群,并把刚才创建的 ServiceAccount 赋给这个集群


gcloud beta container clusters create "mycluster" \  --zone "us-central1-c" --cluster-version "1.15" \  --machine-type "n1-standard-4" --image-type "COS" \  --service-account "anthos-test@your-project-id.iam.gserviceaccount.com" \  --num-nodes "3" --enable-ip-alias
复制代码


最后,为了让 ACM 正常工作,我们需要激活相关 API:


gcloud services enable \    cloudresourcemanager.googleapis.com \    container.googleapis.com \    gkeconnect.googleapis.com \    gkehub.googleapis.com \    serviceusage.googleapis.com \    sourcerepo.googleapis.com \    iamcredentials.googleapis.com \    contextgraph.googleapis.com \    stackdriver.googleapis.com
复制代码


把刚才创建 GKE 集群注册到 Anthos:


gcloud container hub memberships register mycluster \   --project=your-project-id \   --gke-cluster=us-central1-c/mycluster \   --service-account-key-file=./anthos-test.json
复制代码


注册成功后,我们可以在 Anthos 的控制台看到刚才创建的集群,如下图:


安装 ACM

向刚才创建的 GKE 集群中添加角色,这个角色会被 ACM 用来管理 k8s。


kubectl create clusterrolebinding cluster-admin-binding   \  --clusterrole cluster-admin   \  --user anthos@your-project-id.iam.gserviceaccount.com
复制代码


安装 ACM Operator;


安装 config-management-operator:


gsutil cp \ gs://config-management-release/released/latest/config-management-operator.yaml \ config-management-operator.yamlkubectl apply -f config-management-operator.yamlkubectl get deployment --all-namespaces|grep config-management-operator
复制代码


上面最后一条命令应该可以看到 config-management-operator 已经在运行:


config-management-operator                 1/1     1            1           2m27s
复制代码

创建 Git 仓库

我们需要一个 Git 仓库来放配置信息,我们可以用 github 来实现:



选择 Repository 相关参数:



我们拿到该仓库的的 ssh 链接:


git@github.com:xxxx/ACM.git
复制代码


通过 ssh 访问该仓库,我们还需要一个 SSH Key,


我们可以用以下命令创建这个 key:


ssh-keygen -t rsa -b 4096 \ -C "xxxx" -N ''
复制代码


我们把这个 key 的公钥作为该仓库的部署用密钥



我们把这个仓库克隆下来,并往里面加一个 Readme.md 文件:


git clone git@github.com:xxxx/ACM.gitcd ACM/git remote -vtouch Readme.mdecho 2020/05/14 > Readme.md  git add .git commit -m 'add readme'git push
复制代码


访问此仓库的 ssh 密钥需要以 secret 资源的形式保存在 k8s 集群中:


$kubectl create secret generic git-creds \--namespace=config-management-system \--from-file=ssh=/root/.ssh/id_rsa
$kubectl get secret git-creds -n config-management-systemNAME TYPE DATA AGEgit-creds Opaque 1 35s
复制代码

创建 Config-management

创建 config-management.yaml 文件:


cat <<EOF > config-management.yamlapiVersion: configmanagement.gke.io/v1kind: ConfigManagementmetadata:  name: config-managementspec:  # clusterName is required and must be unique among all managed clusters  clusterName: mycluster  git:    syncRepo: git@github.com:xxxx/ACM.git    syncBranch: master    secretType: ssh    policyDir: "policy"EOF
复制代码


同时我们需要在 Git 仓库里面创建 policy 目录和 repo.yaml 文件:


mkdir -p policy/systemcat <<EOF > policy/system/repo.yamlkind: RepoapiVersion: configmanagement.gke.io/v1metadata:  name: repospec:  version: "0.1.0"EOF
复制代码


我们把这些改动推到 Github 去:


git add .git commit -m 'add repo.yaml in policy/system dir'git push
复制代码


使用 kubcectl 部署 config-management.yaml


kubectl apply -f config-management.yaml
复制代码


查看日志


kubectl logs -n config-management-system  -l app=git-importer -c git-sync
复制代码


可以在 console 页面上看到 ACM 安装成功:


使用 ACM 部署应用

我们有一个样例应用,是一个 B2C 的电子商务网站,Online Boutique,我们使用 Gitops 的方法来部署它。


先看看我们刚才克隆下来的 git 仓库中的结构:


$ find policy/policy/policy/systempolicy/system/repo.yaml
复制代码


我们在 policy 目录中创建一个 namespaces 目录,并在其中创建 onlineboutique 目录,如以下命令:


mkdir -p policy/namespaces/onlineboutique
复制代码


并将以下内容放在 policy/namespaces/onlineboutique/namespace.yaml 中:


apiVersion: v1kind: Namespacemetadata:  name: onlineboutique  labels:    istio-injection: enabled
复制代码


这将在 GKE 集群中创建一个命名空间叫 onlineboutique。


接下来,我们希望在这个命名空间中部署 Online Boutique 应用。我们可以在该链接找到这个应用,在它的 release 目录下有一个


kubernetes-manifests.yaml
复制代码


我们把它下载下来,放到


policy/namespaces/onlineboutique/
复制代码


目录中:


 curl -o policy/namespaces/onlineboutique/kubernetes-manifests.yaml https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yam
复制代码


这时,我们的仓库会变成这样:


$ find policy/policy/policy/systempolicy/system/repo.yamlpolicy/namespacespolicy/namespaces/onlineboutiquepolicy/namespaces/onlineboutique/kubernetes-manifests.yamlpolicy/namespaces/onlineboutique/namespace.yaml
复制代码


把刚才创建的这两个文件提交到 git 中,并推送到 github:


git add git add policy/namespaces/onlineboutique/kubernetes-manifests.yaml \  policy/namespaces/onlineboutique/namespace.yamlgit commit -m "new namespace and deployment"git push
复制代码


部署完成后,查看 Cluster 中的应用情况。查看 namespace 会发现刚刚创建的命名空间 onlineboutique:


$ kubectl get namespaces|grep onlineboutiqueonlineboutique             Active   19m
复制代码


查看 deployment:


# kubectl get deployment -n onlineboutiqueNAME                    READY   UP-TO-DATE   AVAILABLE   AGEadservice               1/1     1            1           6mcartservice             1/1     1            1           6mcheckoutservice         1/1     1            1           6mcurrencyservice         1/1     1            1           6memailservice            1/1     1            1           6mfrontend                1/1     1            1           6mloadgenerator           1/1     1            1           6mpaymentservice          1/1     1            1           6mproductcatalogservice   1/1     1            1           6mrecommendationservice   1/1     1            1           6mredis-cart              1/1     1            1           6mshippingservice         1/1     1            1           6m
复制代码


我们看到,这个应用已经被成功的部署了。


2020-05-25 21:531062

评论

发布
暂无评论
发现更多内容

龙蜥开发者说:历时三周,记录如何从 0 到 1 构建龙蜥衍生版 | 第 18 期

OpenAnolis小助手

开源 操作系统 龙蜥社区 浪潮信息 衍生版

CNStack 服务网格:构建统一的服务治理和零信任安全能力

阿里巴巴云原生

阿里云 云原生 CNStack

对话阿里云致凡:社会视频化“狂飙”,倒逼视频云技术加速迭代

云布道师

平头哥

智改数转:这个制造业的必答题该如何作答?

加入高科技仿生人

低代码 数字化 制造业 智能化 智改数转

重磅消息 | 2023年腾讯云从业者课程全面升级

科技热闻

再获权威认可!MIAOYUN入选中国信通院2022年度《云原生产品目录》

MIAOYUN

云计算 容器 云原生 容器云 容器云平台

前沿成果 | 澳鹏Appen团队两篇研究论文被国际顶会收录

澳鹏Appen

人工智能 机器学习 计算机视觉 nlp 数据标注

软件测试/测试开发丨Chrome 浏览器+Postman还能这样做接口测试 ?

测试人

软件测试 Postman 自动化测试 接口测试 测试开发

开心档之C++ 多态

雪奈椰子

【特别策划】2022年银行年报金融科技系列专题(一)

易观分析

金融科技 金融 银行

容器化,让数据库如虎添翼

沃趣科技

MySQL 数据库 云原生 容器化

软件测试/测试开发丨如何高效使用 Requests 做接口自动化测试

测试人

软件测试 自动化测试 接口测试 测试开发 requests

从“卖船”到提供建造“航母” 的基础设施,用友BIP有底气

用友BIP

打破软件开发“不可能三角” 只需一个低代码方案

力软低代码开发平台

国营单位工作4年转行网络安全,成功上岸安全开发!

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

再立灯塔,我们为什么仍然期待魅族?

脑极体

魅族

保证高效写入查询的情况下,如何实现 CPU 资源和磁盘 IO 的最低开销?

TDengine

大数据 tdengine 数据处理 时序数据库 资源消耗

FastAPI 快速开发 Web API 项目: 定义路径参数和查询参数

宇宙之一粟

Python FastApi

大数据公司如何结合AI技术

MobTech袤博科技

如何通过Java代码将添加页码到PDF文档?

在下毛毛雨

Java PDF 添加页码

开心档之MySQL WHERE 子句

🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦

Kagol

Vue3 cli 后台管理系统 vue admin

使用 LifseaOS 体验 ACK 千节点分钟级扩容

阿里巴巴云原生

阿里云 云原生 ACK

数据库原理及MySQL应用 | 程序流程控制

TiAmo

数据库 sql

开心档之C++ 指针

雪奈椰子

CTO:半小时内处理好MyBatisPlus逻辑删除与唯一索引的兼容问题

了不起的程序猿

网上说低代码的一大堆,JNPF凭什么可以火?

引迈信息

前端 敏捷开发 低代码 快速开发 JNPF

哪里有免费大文件传输平台?通过这4个网站免费来进行大文件传输

镭速

软件测试/测试开发丨玩游戏为什么会卡顿?

测试人

软件测试 游戏 自动化测试 卡顿 测试开发

分布式政企应用如何快速实现云原生的微服务架构改造

华为云开源

微服务 云原生

明道云技术路径选择及与LCDP的比较

明道云

  • 扫码添加小助手
    领取最新资料包
GitOPS 与Anthos Config Management_服务革新_盛骏_InfoQ精选文章