使用 Kubernetes Agent Server 实现 GitOps

目录

温习 GitOps

极狐GitLab Kubernetes Agent

极狐GitLab GitOps workflow

极狐GitLab KAS 的配置

创建极狐GitLab  agent

创建 agent token

Kubernetes 上安装 agent(agentk)

极狐GitLab GitOps workflow 实践

写在最后


温习 GitOps


GitOps 的核心不是 Git,而是以声明式系统为基座,以 Git 为单一可信源,通过将应用程序和基础设施代码化(一切皆代码),进行云原生应用程序和基础设施部署管理。更多关于 GitOps 的内容,可以查看公众号文章GitOps 系列|云原生时代,你还不懂 GitOps?

极狐GitLab Kubernetes Agent 恰巧就是实现 GitOps workflow 的一个特性功能,在 13.x 版本中陆续引入。

本文将通过理论加实践的方式对极狐GitLab GitOps workflow 进行剖析,方便大家对其有个全方位的认知。

极狐GitLab Kubernetes Agent


极狐GitLab Kubernetes Agent 是一个位于 Kubernetes 集群侧的组件,能够以安全、云原生的方式来实现极狐GitLab 和 Kubernetes 的集成。主要实现的功能有:

  • 将极狐GitLab 与防火墙或 NAT(网络地址转换)后的 Kubernetes 集群进行集成;

  • “pull” 模式的 GitOps workflow;

  • 对应用在集群上的资源进行追踪;

  • 对集群的 API 端点进行实时访问;

  • 基于容器网络策略的报警生成;

  • CI/CD 隧道作用,以使用户能够从 GitLab CI/CD 中访问 Kubernetes 集群,即使 GitLab Runner 和集群之间没有网络连接。

更多的功能和特性还在开发过程中,感兴趣的可以查看 Roadmap。

接下来将重点分析如何使用极狐GitLab Kubernetes Agent 来实现 GitOps workflow。

极狐GitLab GitOps workflow


极狐GitLab GitOps workflow 的示意图如下

图片

上述列出了完成实践所需的组件

  • 极狐GitLab 服务(如使用极狐Saas 则地址为 GitLab-10万企业使用的一站式DevOps平台_GitLab中文官网);

  • 一个运行正常且安装了极狐GitLab Kubernetes Agent 的 Kubernetes 集群(Agent 安装过程后续会讲);

  • 一个配置仓库,包含 config.yaml 文件,里面定义了 agent 需要去跟集群侧做同步的 Project 信息;

  • 一个清单仓库,包含了往 Kubernetes 集群上部署资源的清单文件。

最终的目的就是:一旦部署清单仓库中的清单文件发生了变更,则此变更能够自动同步至集群侧。

可以将 config.yaml 文件和部署资源清单文件存放在同一个极狐GitLab Project 里面,这是 Project 可以是 Public 的,也可以是 Private的,而且这也是官方推荐方式。当然,也可以用不同的 Project 来分别存储config.yaml文件和部署清单文件,此时,需要注意的是,存放部署清单文件的 Project 必须是 Public 的,而存放config.yaml文件的 Project 则可以是 Public 或 Private 的,具体原因可以查看 issue。

从上述示意图中看到,要完成整个流程,需要两个重要组件的配合:agentk 和 kas。其中 agentk 代表极狐GitLab Kubernetes Agent,是位于 Kubernetes 集群侧的组件,主要用来和 kas 进行交互。kas 代表极狐GitLab Kubernetes Agent Server,是位于极狐GitLab 侧的组件,主要实现的功能有:

  • 接受来自 agentk 侧的请求;

  • 对 agentk 做权限验证(这一步是通过查询极狐 GitLab RoR 来完成);

  • 通过查询 Gitaly 来获取 agent 的配置信息;

  • 将来自极狐GitLab RoR 的请求与正确的 agentk 的现有连接进行匹配,然后将请求转发给 agentk,且将响应转发回来;

  • 通过和 Gitaly 通信来对存储部署清单的 Project 进行轮询,从而实现 GitOps。

整体的架构示意图如下:

图片

从架构图中可以看出,要想实现极狐GitLab GitOps workflow,需要对 agentk 和 kas 进行安装配置。

极狐GitLab KAS 的配置


首先,要在极狐GitLab 侧创建一个与存储 config.yaml 文件的配置仓库相关联的 agent 记录。这个过程分两步走:创建 agent 和生成 agent token(后面的步骤会用到)。

创建极狐GitLab  agent

可以使用 GraphQL 来完成创建工作,关于 GraphQL 的更多内容可以查看极狐GitLab GraphQL API 使用方法。当然最快速的方法就是使用 GraphQL Explorer 来完成创建工作。

在 GraphQL Explorer 的页面中输入创建 agent 的语法,然后运行即可。如在左侧输入如下 GraphQL 语法:

mutation createAgent {
# agent-name should be the same as specified above in the config.yaml
createClusterAgent(input: { projectPath: "your-configuration-project-path", name: "agent-name-you-specified-in-config.yaml" }) {
    clusterAgent {
    id
    name
    }
    errors
}
}

点击运行按钮之后,在右侧会会出现返回结果,如:

{
  "data": {
    "createClusterAgent": {
      "clusterAgent": {
        "id": "gid://gitlab/Clusters::Agent/43",
        "name": "gitops"
      },
      "errors": []
    }
  }
}

整体效果如下:

图片

上述步骤创建了一个名为gitops,且与 your-configuration-project-path 这个 project 相关联的 agent,agent 的 ID 为 gid://gitlab/Clusters::Agent/43。接下来就需要为这个 agent 创建一个 agent token了。

创建 agent token

和创建 Agent 一样,利用 GraphQL Explorer 页面,在左侧输入 agent token 创建的 GraphQL 语法:

mutation createToken {
    clusterAgentTokenCreate(
      input: {
        clusterAgentId: "gid://gitlab/Clusters::Agent/43"
        description: "GitLab Kubernetes Agent Server Demo"
        name: "gitops"
      }
    ) {
      secret # This is the value you need to use on the next step
      token {
        createdAt
        id
      }
      errors
    }
  }

clusterAgentId为创建 agent 时候的返回值,如gid://gitlab/Clusters::Agent/43。name为指定的 agent 名称,本文为 gitops。

点击运行之后,在右侧会返回 agent token:

{
  "data": {
    "clusterAgentTokenCreate": {
      "secret": "generated-agent-token",
      "token": {
        "createdAt": "2021-08-17T13:22:31+08:00",
        "id": "gid://gitlab/Clusters::AgentToken/37"
      },
      "errors": []
    }
  }
}

结果中的 secret 即为 agent token。在后续会用到。

紧接着,就需要在 Kubernetes 集群侧安装 agent 了。

Kubernetes 上安装 agent(agentk)

在 Kubernetes 上安装 agent 时,有三个必要参数:

  • your-agent-token(上述步骤已经获取);

  • Agent 所在的 namespace,这个自定义即可,本文用 gitlab-kubernetes-agent;

  • Kubernetes Agent Server(KAS)的地址。以极狐GitLab 用户为例,地址为 wss://kas.gitlab.cn

接下来可以用如下命令进行一键式安装

$ docker run --pull=always --rm registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable generate --agent-token=your-agent-token --kas-address=wss://kas.gitlab.cn --agent-version stable --namespace gitlab-kubernetes-agent | kubectl apply -f -

将上述的--agent-token指定为前面步骤获取的值,同时用--namespace指定 agent 安装的 namespace,然后执行上述命令

$ docker run --pull=always --rm registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable generate --agent-token=your-agent-token  --kas-address=wss://kas.gitlab.cn --agent-version stable --namespace gitlab-kubernetes-agent | kubectl apply -f -
stable: Pulling from gitlab-org/cluster-integration/gitlab-agent/cli
Digest: sha256:a34079259440dcb627947e4df26fe5462829a3d6622d031ea0129e5953b70281
Status: Image is up to date for registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable
namespace/gitlab-kubernetes-agent created
serviceaccount/gitlab-agent created
clusterrole.rbac.authorization.k8s.io/cilium-alert-read created
clusterrole.rbac.authorization.k8s.io/gitlab-agent-gitops-read-all created
clusterrole.rbac.authorization.k8s.io/gitlab-agent-gitops-write-all created
clusterrolebinding.rbac.authorization.k8s.io/cilium-alert-read created
clusterrolebinding.rbac.authorization.k8s.io/gitlab-agent-gitops-read-all created
clusterrolebinding.rbac.authorization.k8s.io/gitlab-agent-gitops-write-all created
secret/gitlab-agent-token-8ccgb67gb2 created
deployment.apps/gitlab-agent created

安装完毕,可在gitlab-kubernetes-agent namespace 下查看 agent pod:

$ kubectl -n gitlab-kubernetes-agent get pods
NAME                            READY   STATUS    RESTARTS   AGE
gitlab-agent-866cc7fb95-5dgc2   1/1     Running   0          42s

查看 pods 的 log,如果成功的话会看到下面的内容:

{"level":"info","time":"2021-08-17T05:31:44.009Z","msg":"Cluster successfully synced","mod_name":"gitops","project_id":"your-configruation-project"}

说明 agent 在 Kubernetes 集群侧安装成功,且 agent 已和 config Project 同步成功。接下来就可以进行 GitOps workflow 实践了。

极狐GitLab GitOps workflow 实践


实践的前提条件

  • 一个运行良好的极狐GitLab 实例(方便期间,推荐使用极狐GitLab Saas 产品,也即 GitLab-10万企业使用的一站式DevOps平台_GitLab中文官网);

  • 一个运行良好的 Kubernetes 集群(本文使用 Desktop 自带的 Kubernets 集群)。

根据上面的理论介绍,极狐GitLab GitOps workflow 需要有存放 config.yaml 文件和部署清单文件的 Project。两个可以用不同的 Project,也可以用同一个 Project,本次实践是将全部文件存放在同一个极狐GitLab Project 下面。目录结构如下:

├── .gitlab
│   └── agents
│       └── gitops
│           └── config.yaml
├── README.md
└── deployment
    └── deployment.yaml

其中 .gitlab/agents/gitops/ 是 config.yaml 文件存放的路径,gitops 是创建的 agent 名称,config.yaml 文件的内容如下:

gitops:
  manifest_projects:
  - id: "your-jihu-GitLab-project-which-you-want-to-be-listened-by-agent"
    paths:
    - glob: '/**/*.yaml'
observability:
  logging:
    level: debug

其中 id 表示存放部署清单文件的 Project 路径,glob 表示 agent 要监听的文件,可以监听所有的文件,也可以监听某个目录下的文件。具体的语法可以在这儿查看。而 deployment 目录下存放的则是需要部署的清单文件,本文以部署 nginx 来做示范,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: gitlab-kubernetes-agent 
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

上述内容会在 gitlab-kubernetes-agent namesace 下面部署一个名为 nginx-deployment 的 deployment,且 pod 副本数为 1。

$ kubectl -n gitlab-kubernetes-agent get deploy,pods
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/gitlab-agent       1/1     1            1           4h3m
deployment.apps/nginx-deployment   1/1     1            1           4h

NAME                                    READY   STATUS    RESTARTS   AGE
pod/gitlab-agent-866cc7fb95-5dgc2       1/1     Running   0          4h3m
pod/nginx-deployment-66b6c48dd5-mzwdb   1/1     Running   0          4h

接下来我们将 deployment.yaml 文件中的 replicas 修改为 2,来触发极狐GitLab GitOps workflow。观察 agent 的 log 可以看到如下内容:

$ kubectl -n gitlab-kubernetes-agent logs -f gitlab-agent-866cc7fb95-5dgc2
{"level":"info","time":"2021-08-17T09:34:58.406Z","msg":"Applying resource Deployment/nginx-deployment in cluster: https://10.96.0.1:443, namespace: gitlab-kubernetes-agent","mod_name":"gitops","project_id":"jihulab/marketing/technical-marketing/devops-demo"}
{"level":"info","time":"2021-08-17T09:34:58.502Z","msg":"Synced","mod_name":"gitops","project_id":"jihulab/marketing/technical-marketing/devops-demo","resource_key":"apps/Deployment/gitlab-kubernetes-agent/nginx-deployment","sync_result":"deployment.apps/nginx-deployment configured"}

同时查看 nginx-deployment 的 pod 数量变化:

$ kubectl -n gitlab-kubernetes-agent get pods -w
NAME                                READY   STATUS    RESTARTS   AGE
gitlab-agent-866cc7fb95-5dgc2       1/1     Running   0          4h5m
nginx-deployment-66b6c48dd5-mzwdb   1/1     Running   0          4h2m
nginx-deployment-66b6c48dd5-hpwqd   0/1     Pending   0          0s
nginx-deployment-66b6c48dd5-hpwqd   0/1     Pending   0          0s
nginx-deployment-66b6c48dd5-hpwqd   0/1     ContainerCreating   0          0s
nginx-deployment-66b6c48dd5-hpwqd   1/1     Running             0          2s

可以看到有新的 pod 被创建,当前 nginx-deployment 下的 pod 副本数是 2,这和部署清单文件里面描述的是一致的。也再次证明:当部署清单文件发生任何变更的时候,变更会被自动同步至 Kubernetes 集群侧

写在最后


极狐GitLab 在设计 kas 和 agentk 的时候,倾向于把功能逻辑添加在 kas 中,而不是 agentk 中。尽量保持了 agentk 的精简,以便能够减少对于升级的需要,这也减少了维护人员的升级工作负担。因为在 gitlab.cn 中,kas 是由极狐GitLab 来管理的,所以功能的添加和版本的升级都是极狐侧来完成,而无需要求用户同步升级 agentk。这一点,其实在类似 agent/server 的设计架构中还是值得借鉴的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/224745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

课题学习(十五)----阅读《测斜仪旋转姿态测量信号处理方法》论文

一、 论文内容 1.1 摘要 为准确测量旋转钻井时的钻具姿态,提出了一种新的信号处理方法。测斜仪旋转时,垂直于其旋转轴方向加速度计的输出信号中重力加速度信号分量具有周期性特征,以及非周期性离心加速度分量频率低于重力加速度信号分量频率…

渲染(iOS渲染过程解析)

渲染 渲染原理 一个硬核硬件科普视频 CPU和GPU CPU(Central Processing Unit):现代计算机整个系统的运算核心、控制核心,适合串行计算。GPU(Graphics Processing Unit):可进行绘图运算工作的…

系列四、过滤器简介

一、简介 1.1、概述 过滤器作为JavaWEB的三大组件(Servlet程序、Filter过滤器、Listener监听器),它的主要功能是用来拦截请求的,当客户端要访问某个资源时,先来到配置好的过滤器,过滤器可以在用户访问某个…

Docker架构、镜像操作和容器操作

一、docker基本管理和概念 1、概念 docker:开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机” docker的容器技术可用在一台主机上轻松到达为任何应用创建一个轻量级到的,可移植的,自给自足的容器 dock…

基于remix+metamask+ganache的智能合约部署调用

在我们部署合约时为了让它更接近真实区块链去中心化体验,我们需要调用小狐狸(Metamask)来进行真实交易,而metamask里没有内置虚拟测试币,我们需要进行调用Ganache来添加带有虚拟测试币的账号。以上就是三者的关系&…

编程实战:类C语法的编译型脚本解释器(十)编译表达式

系列入口:编程实战:类C语法的编译型脚本解释器(九)编译语句 本文介绍表达式的编译。 一、代码概览 表达式的编译就是不断获取下一个标识符,直到遇到不属于表达式的东西。 完整代码如下: Expression* GetExp…

Java+Swing: (jframe自定义图标和居中显示) 整理1

package com.test;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author:xiexu* Date:2023/12/3 19:13*/ public class JframeTest {JFrame jFrame;JButton jButton;public JframeTest() {// 容器组件(jframe, jpanel,…

深圳冬季穿搭造型

深圳冬季穿搭造型 今天是2023年11月17日,北方在11月初就降下了大雪,那是我的老家,无比怀念。 而在深圳,冬天是体会不到那份冷冽的寒冷的,所以在深圳,每天的晚上,我都会出去散步,昨…

Kubernetes Service控制器详解以及切换为ipvs代理模式

文章目录 一、Service 存在的意义二、Pod与Service的关系三、Service定义与创建四、Service三种常用类型五、Service代理模式六、切换Service代理模式七、service总体工作流程八、kube-proxy ipvs和iptables的异同九、Service DNS名称 一、Service 存在的意义 service的引入主…

推荐10款App安全测试工具

移动互联网时代,我们的生活和工作深受 App 影响。伴随移动 App 的广泛应用,App 安全日益重要。本文介绍了 App 开发可能用到的安全测试工具。 当今, 全球移动用户大约超过37亿。 Google Play 上大约有 220 万个 App, 苹果App Sto…

二极管是什么

二极管 电子元器件百科 文章目录 二极管前言一、二极管是什么二、二极管的类别三、二极管的应用实例四、二极管的作用原理总结前言 二极管是一种重要的电子器件,通过其整流行为和管理方向的特性,可以在电路中实现电流控制和电压整流等功能。 一、二极管是什么 二极管是一种…

idea__SpringBoot微服务03——yaml(新注解)(新的依赖)

yaml 一、数据格式二、注入配置文件(yaml注入)(新注解ConfigurationProperties)三、注入配置文件(properties注入)(新注解PropertySource)四、yaml配置文件占位符${}五 、yaml跟prop…

【虚拟机】Docker基础 【二】【数据卷和挂载本地目录】

2.2.数据卷 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题: 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了&#x…

智能优化算法应用:基于蜜獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蜜獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蜜獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜜獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

深入理解 new 操作符:创建对象的秘密武器(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

SQL Server 数据库,创建触发器避免数据被更改

5.4触发器 触发器是一种特殊类型的存储过程,当表中的数据发生更新时将自动调用,以响应INSERT、 UPDATE 或DELETE 语句。 5.4.1什么是触发器 1.触发器的概念 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强…

Elastcsearch:通过 Serverless 提供更多服务

作者:Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性,让搜索…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帐户或密码错误!2. 新建LocaleConfig.java文件 Configurati…

gpt3、gpt2与gpt1区别

参考:深度学习:GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot(零次学习)简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成,本质上是自回归模型…

Hazelcast分布式内存网格(IMDG)基本使用,使用Hazelcast做分布式内存缓存

文章目录 一、Hazelcast简介1、Hazelcast概述2、Hazelcast之IMDG3、数据分区 二、Hazelcast配置1、maven坐标2、集群搭建(1)组播自动搭建 3、客户端4、集群分组5、其他配置 三、Hazelcast分布式数据结构1、IMap2、IQueue:队列3、MultiMap4、I…