前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 cdk8s 与 Argo CD 进行 GitOps 实践

使用 cdk8s 与 Argo CD 进行 GitOps 实践

作者头像
我是阳明
发布2020-07-21 16:02:45
1.3K0
发布2020-07-21 16:02:45
举报
文章被收录于专栏:k8s技术圈

cdk8s 是 AWS Labs 发布的一个使用 TypeScript 编写的新框架,它允许我们使用一些面向对象的编程语言(目前支持 TypeScript 与 Python)来定义 Kubernetes 的资源清单,并最终生成原生的 Kubernetes YAML 文件。所以我们自然也会想到在进行 GitOps 实践的过程中,是否可以将 cdk8s 利用起来,和 Argo CD 结合是否会是更好的方式?

Argo CD 就是通过 GitOps 规范来实现 Kubernetes 资源对象的部署的,所以我们只需要将资源清单的文件保存到 Git 仓库中,Argo CD 这样的工具就可以来同步到 Kubernetes 集群中,所以当然使用 cdk8s 也是可以很好的和 Argo CD 结合使用的。

如果你不熟悉 cdk8s,可以查看前面我们的文章[使用编程语言描述 Kubernetes 应用 - cdk8s] 来了解更多信息。同样关于 Argo CD 也可以参考前面的文章[使用 GitLab CI 与 Argo CD 进行 GitOps 实践] 了解相关信息。

使用 cdk8s 编写资源清单

我们这里使用 Argo CD 官方的示例应用来进行说明,应用包含了不同的渲染方式,包括普通的资源清单、Helm Chart 或者 Kustomize 文件,最终都是部署一个简单的 guestbook 应用,由一个 Deployment 和一个 Service 组成。我们这里将把代码放到一个名为 cdk8s-guestbook 的新的文件夹中。

在 cdk8s-guestbook 目录中通过 cdk8s init python-app 命令进行初始化:

代码语言:javascript
复制
$ cdk8s-guestbook [master] cdk8s init python-app
Initializing a project from the python-app template
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (832b5d)!
Installing dependencies from Pipfile.lock (832b5d)…
  ?   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 8/8 — 00:00:03
To activate this project's virtualenv, run the following:
 $ pipenv shell
Installing cdk8s~=0.26.0…
Collecting cdk8s~=0.26.0
  Downloading cdk8s-0.26.0-py3-none-any.whl (205 kB)
......
  ?   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 9/9 — 00:00:03
To activate this project's virtualenv, run the following:
 $ pipenv shell
k8s
========================================================================================================

 Your cdk8s Python project is ready!

   cat help      Prints this message
   cdk8s synth   Synthesize k8s manifests to dist/
   cdk8s import  Imports k8s API objects to "imports/k8s"

  Deploy:
   kubectl apply -f dist/*.k8s.yaml

========================================================================================================

初始化完成后的目录结构如下所示:

代码语言:javascript
复制
$ cdk8s-guestbook [master] ⚡  tree .
.
├── Pipfile
├── Pipfile.lock
├── cdk8s.yaml
├── dist
│   └── cdk8sguestbook.k8s.yaml
├── help
├── imports
│   └── k8s
│       ├── __init__.py
│       ├── _jsii
│       │   ├── __init__.py
│       │   └── generated@0.0.0.jsii.tgz
│       └── py.typed
└── main.py

4 directories, 10 files

然后在 main.py 文件中添加生成 Service 与 Deployment 的代码,如下所示:

代码语言:javascript
复制
#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart

from imports import k8s


class MyChart(Chart):
    def __init__(self, scope: Construct, ns: str):
        super().__init__(scope, ns)

        # 定义标签
        label = {"app": "guestbook-ui"}
        # 定义 Service 对象
        k8s.Service(self, 'service',
                    spec=k8s.ServiceSpec(
                        type='NodePort',
                        ports=[k8s.ServicePort(port=80, target_port=k8s.IntOrString.from_number(80))],
                        selector=label)
                    )
        # 定义 Deployment 对象
        k8s.Deployment(self, 'deployment',
                       spec=k8s.DeploymentSpec(
                         replicas=1,
                         selector=k8s.LabelSelector(match_labels=label),
                         template=k8s.PodTemplateSpec(
                           metadata=k8s.ObjectMeta(labels=label),
                           spec=k8s.PodSpec(containers=[
                             k8s.Container(
                               name='guestbook-ui',
                               image='cnych/ks-guestbook-demo:0.2',
                               ports=[k8s.ContainerPort(container_port=80)])]))))


app = App()
MyChart(app, "cdk8s-guestbook")

app.synth()  # 该方法负责生成生成k8s资源清单文件

正常我们可以使用 cdk8s synth 命令来生成 Kubernetes 资源清单文件,我们这里是和 Argo CD 进行集成,所以可以将该步骤交由 Argo CD 去操作。

与 Argo CD 集成

不过目前 cdk8s 还不支持 Argo CD 的开箱即用,所以我们还需要将 cdk8s 注册成一个自定义配置管理的插件。通过创建一个如下所示的名为 argocd-cm 的 ConfigMap 对象即可实现:

代码语言:javascript
复制
# argocd-cdk8s-plugin-config.yml
kind: ConfigMap
apiVersion: v1
metadata:
  annotations:
  labels:
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
  name: argocd-cm
  namespace: argocd
data:
  configManagementPlugins: |
    - name: cdk8s # 插件名称,后面会引用它
      init: # 一些预处理命令
        command: ["bash"]
        args: ["-c", "pipenv install && cdk8s import -l python && cdk8s synth"] # 保证依赖安装执行 cdk8s synth 命令生成资源清单
      generate: # 将该命令的输出结果部署到集群中
        command: ["bash"]
        args: ["-c", "cat dist/*"] # 打印生成的 Kubernetes 资源清单文件

直接创建上面的对象就可以使用这个插件了:

代码语言:javascript
复制
$ kubectl apply -f argocd-cdk8s-plugin-config.yml

然后我们可以使用 Argo CD 的 CLI 工具或者 Dashboard 页面来创建应用:

需要注意的是 path 路径为 cdk8s-guestbook,最下面要选择我们上面创建的 cdk8s 这个插件,然后点击 CREATE 按钮,正常会出现如下所示的错误提示信息:

这是因为 Argo CD 的配置管理插件是在一个 argocd-repo-server 的组件中去执行的,而我们这里自定义的插件需要 pipenvcdk8s 的命令,默认情况下该组件中显然是没有这些环境的,所以我们需要去重新定制镜像,在镜像中安装 pipenv 和 cdk8s 环境,对应的 Dockerfile 文件如下所示:

代码语言:javascript
复制
FROM argoproj/argocd:latest

USER root

RUN apt-get update && \
    apt-get install -y \
        curl \
        python3-pip \
        python3-venv && \
    apt-get clean && \
    pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    pip3 install pipenv constructs==2.0.2 cdk8s==0.26.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y yarn && \
    yarn config set registry https://registry.npm.taobao.org/ && \
    yarn global add npm cdk8s-cli

USER argocd

使用上面的 Dockerfile 构建一个新的镜像,推送到 Docker Hub,镜像为 cnych/argocd:cdk8s ,然后我们需要更新 argocd-repo-server 在 Kubernetes 中的镜像:

代码语言:javascript
复制
$ kubectl get deploy -n argocd
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
argocd-application-controller   1/1     1            1           6d3h
argocd-dex-server               1/1     1            1           6d3h
argocd-redis                    1/1     1            1           6d3h
argocd-repo-server              1/1     1            1           6d3h
argocd-server                   1/1     1            1           6d3h
$ kubectl edit deploy argocd-repo-server -n argocd
......
image: cnych/argocd:cdk8s  # 更改镜像
......

argocd-repo-server 使用新的镜像重新更新后我们就可以再次尝试创建新的应用了,第一次创建的时候需要安装依赖,等待一会儿时间,正常就可以触发同步的操作了:

在集群中查看对应的资源对象:

代码语言:javascript
复制
$ kubectl get svc
NAME                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
cdk8s-guestbook-service-c89b8c51   NodePort    10.111.165.217   <none>        80:32436/TCP   6m35s
$ kubectl get pods -l app=guestbook-ui
NAME                                                   READY   STATUS    RESTARTS   AGE
cdk8s-guestbook-deployment-967cec91-74b44c997d-j4vqz   1/1     Running   0          10m

我们还可以在 main.py 中将 replicaCount 设置成2,然后提交代码到 GitHub,隔一会儿,观察 Argo 中是否有同步变化:

可以很明显看到现在是两个 Pod 副本了:

代码语言:javascript
复制
$ kubectl get pods -l app=guestbook-ui
NAME                                                   READY   STATUS              RESTARTS   AGE
cdk8s-guestbook-deployment-967cec91-74b44c997d-j4vqz   1/1     Running             0          14m
cdk8s-guestbook-deployment-967cec91-74b44c997d-jqv6n   0/1     ContainerCreating   0          23s

此外,我们还可以通过点击应用详情页上方的 HISTORY AND ROLLBACK 按钮,进行快速回滚:

到这里我们实现了 Argo CD 与 cdk8s 的结合,和 Argo CD 结合使用的方式多种多样,优秀的工具也非常多,主要还是根据自己的实际需求选择适合自己的工具,所以我们也需要了解更多的工具,这样才能在需要的时候做出更好的选择。

参考链接

  • https://cdk8s.io/
  • https://argoproj.github.io/argo-cd/
  • https://brennerm.github.io/posts/integrating-cdk8s-with-argocd.html
  • https://www.qikqiak.com/post/use-cdk8s-define-k8s-apps/
  • https://www.qikqiak.com/post/gitlab-ci-argo-cd-gitops/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 cdk8s 编写资源清单
  • 与 Argo CD 集成
  • 参考链接
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档