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 实践] 了解相关信息。
我们这里使用 Argo CD 官方的示例应用来进行说明,应用包含了不同的渲染方式,包括普通的资源清单、Helm Chart 或者 Kustomize 文件,最终都是部署一个简单的 guestbook 应用,由一个 Deployment 和一个 Service 组成。我们这里将把代码放到一个名为 cdk8s-guestbook 的新的文件夹中。
在 cdk8s-guestbook 目录中通过 cdk8s init python-app
命令进行初始化:
$ 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
========================================================================================================
初始化完成后的目录结构如下所示:
$ 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 的代码,如下所示:
#!/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 去操作。
不过目前 cdk8s 还不支持 Argo CD 的开箱即用,所以我们还需要将 cdk8s 注册成一个自定义配置管理的插件。通过创建一个如下所示的名为 argocd-cm
的 ConfigMap 对象即可实现:
# 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 资源清单文件
直接创建上面的对象就可以使用这个插件了:
$ kubectl apply -f argocd-cdk8s-plugin-config.yml
然后我们可以使用 Argo CD 的 CLI 工具或者 Dashboard 页面来创建应用:
需要注意的是 path 路径为 cdk8s-guestbook
,最下面要选择我们上面创建的 cdk8s
这个插件,然后点击 CREATE 按钮,正常会出现如下所示的错误提示信息:
这是因为 Argo CD 的配置管理插件是在一个 argocd-repo-server
的组件中去执行的,而我们这里自定义的插件需要 pipenv
和 cdk8s
的命令,默认情况下该组件中显然是没有这些环境的,所以我们需要去重新定制镜像,在镜像中安装 pipenv 和 cdk8s 环境,对应的 Dockerfile 文件如下所示:
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 中的镜像:
$ 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
使用新的镜像重新更新后我们就可以再次尝试创建新的应用了,第一次创建的时候需要安装依赖,等待一会儿时间,正常就可以触发同步的操作了:
在集群中查看对应的资源对象:
$ 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 副本了:
$ 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 结合使用的方式多种多样,优秀的工具也非常多,主要还是根据自己的实际需求选择适合自己的工具,所以我们也需要了解更多的工具,这样才能在需要的时候做出更好的选择。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有