CNCF Fluxcd 开源软件华为CCE集群验证任务

举报
Fermion 发表于 2025/04/21 19:23:01 2025/04/21
【摘要】 本文的主要目的是介绍并验证如何利用 fluxcd 将 Git 仓库的应用程序自动部署到华为云 CCE 集群,让集群中的工作负载随着 Git 代码库的更新而自动更新,从而降低运维成本。

1 背景介绍

开源for Huawei(developer.huaweicloud .com/programs/opensource/contributing/) 通过和公司、高校、社区的开发者合作,完成鲲鹏、昇腾、欧拉、鸿蒙、高斯、云服务等与开源软件的适配开发,帮助繁荣Huawei的基础生态,同时让开源软件能够更加简单、高效的运行于华为云上。
开始之前,开发者可以下载 开源for Huawei Wiki(gitcode .com/HuaweiCloudDeveloper/OpenSourceForHuaweiWiki/overview) 了解详细的开发步骤,技术准备,以及开发过程需要的各种资源。

2 需求分析

2.1 开源软件基本情况

相对于 DevOps 而言,GitOps 是一种全新的理念,它将 Git 仓库作为一切事实的唯一来源,fluxcd 项目就是这一理念的践行者。Flux 是一种工具,用于使 Kubernetes 集群与配置(如 Git 资料档案库和 OCI 构件), 以及在有新代码要部署时自动更新配置。Flux 版本 2(“v2”)是从头开始构建的,以使用 Kubernetes 的 API 扩展系统,并与 Prometheus 等核心集成 Kubernetes 生态系统的组件。在版本 2 中,Flux 支持多租户并支持同步任意数量的 Git repositories 以及其他长期请求的功能。

源码地址:github .com/fluxcd/flux2
官网主页:fluxcd .io/
主要开发语言:Go
LICENSE:Apache 2.0
维护者:CNCF Fluxcd-开源社区

项目数据:Fork 612, Star 6.6K, Contributor 155,最近一次提交:2024-11-14
star历史(star-history .com/):

image.png

2.2 任务目的和范围

本次任务的主要目的是验证如何利用 fluxcd 将 Git 仓库的应用程序自动部署到华为云CCE集群,让集群中的工作负载随着 Git 代码库的更新而自动更新,从而降低运维成本。

3 华为云CCE使用fluxcd自动部署podinfo

3.1 购买CCE集群和配置鲲鹏节点资源

购买CCE集群(因为要验证鲲鹏云,因此控制节点选择鲲鹏)
image.png
创建节点池并购买节点资源(鲲鹏服务器)
image.png

3.2 在个人仓库fork podinfo仓库

Podinfo 是一个用 Go 语言编写的微型 Web 应用程序,展示了在 Kubernetes 中运行微服务的最佳实践。Podinfo 被如 Flux 和 Flagger 等 CNCF 项目用于端到端测试和工作坊。因此我们使用podinfo作为自动化部署应用来验证华为云的CCE集群是否可以使用Fluxcd通过git自动化部署应用。

为了能自行控制podinfo,首先需要在Github上Fork Podinfo(github .com/stefanprodan/podinfo.git)仓库

3.3 连接CCE集群

可以直接通过华为云的CCE控制台右上角的命令行工具连接
image.png
也可以在自己机器上通过kubectl连接集群,参考官方文档(support.huaweicloud .com/usermanual-cce/cce_10_0107.html)

3.4 安装flux

安装过程参考flux官方文档(fluxcd .io/flux/installation/#install-the-flux-cli)

以linux为例,运行下面命令安装:

curl -s https://fluxcd.io/install.sh | sudo bash

安装完成后,运行下面版本查看命令检查是否正确安装:

flux -v

输出类似于:

# flux -v
flux version 2.5.1

3.5 获取Github个人访问令牌

参考Github官方文档管理个人访问令牌(docs.github .com/zh/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)获得账户的访问令牌,如果是组织或企业账户同样可以参考Flux bootstrap for GitHub(fluxcd .io/flux/installation/bootstrap/github/)

获取到令牌后,将令牌和账户名导入到系统环境中,供后续使用:

export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>

3.6 检查Kubernetes集群环境

运行检查命令查看集群环境是否符合要求

flux check --pre

输出类似于:

► checking prerequisites
✔ Kubernetes 1.30.4-r4-30.0.14.11 >=1.30.0-0
✔ prerequisites checks passed

3.7 在集群中安装flux

运行bootstrap(fluxcd .io/flux/installation/bootstrap/)命令

flux bootstrap github \
  --owner=$GITHUB_USER \
  --repository=fleet-infra \
  --branch=main \
  --path=./clusters/my-cluster \
  --private=false \
  --token-auth \
  --personal

输出类似于:

► connecting to github.com
► cloning branch "main" from Git repository "https://github.com/HGZ-20/fleet-infra.git"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ component manifests are up to date
✔ reconciled components
► determining if source secret "flux-system/flux-system" exists
► generating source secret
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
► generating sync manifests
✔ generated sync manifests
✔ sync manifests are up to date
► applying sync manifests
✔ reconciled sync configuration
◎ waiting for GitRepository "flux-system/flux-system" to be reconciled
✔ GitRepository reconciled successfully
◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ helm-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
✔ all components are healthy

上述引导命令执行以下操作:

  • 在您的 GitHub 账户中创建一个 git 仓库 fleet-infra
  • 将 Flux 组件清单添加到仓库中
  • 将 Flux 组件部署到您的 Kubernetes 集群中
  • 配置 Flux 组件以跟踪仓库中的路径 /clusters/my-cluster/
  • 启用token-auth后会使得使用个人访问令牌代替 SSH 部署密钥

3.8 克隆fleet-infra仓库

将fleet-infra仓库克隆到本地

git clone https://github.com/$GITHUB_USER/fleet-infra
cd fleet-infra

3.9 将podinfo仓库添加到Flux

使用podinfo(github .com/stefanprodan/podinfo)作为部署示例,注意一定要使用自己fork后的地址,不然无法通过修改git仓库内容来查看自动化部署的变化结果。

  1. 创建指向 podinfo 仓库 master 分支的 GitRepository 清单:
  flux create source git podinfo \
    --url=https://github.com/$GITHUB_USER/podinfo \
    --branch=master \
    --interval=1m \
    --export > ./clusters/my-cluster/podinfo-source.yaml

输出类似于:

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 1m
  ref:
    branch: master
  url: <Your GitHub repository URL>
  1. podinfo-source.yaml 文件提交并推送到 fleet-infra 仓库:
git add -A && git commit -m "Add podinfo GitRepository"
git push

3.10 修改podinfo应用部署配置

在部署应用前先修改fork的podinfo应用的配置内容

git clone https://github.com/$GITHUB_USER/podinfo.git
cd podinfo/kustomize
ls

可以看到四个配置文件如下:

deployment.yaml
hpa.yaml
kustomization.yaml
service.yaml
  1. 首先,删除hpa.yaml,这个配置能够根据 CPU 使用率自动缩放 Pod 数量,但是我们后续观察集群是否根据git更新进行了自动化部署就是通过修改pod副本数量来观察的,为了避免收到影响,因此将改配置删除。
  2. 修改service.yaml内容如下,使用负载均衡的访问类型,使应用服务暴露出去
apiVersion: v1
kind: Service
metadata:
  name: podinfo
spec:
  type: LoadBalancer
  selector:
    app: podinfo
  ports:
    - name: http
      port: 9898
      protocol: TCP
      targetPort: http
    - name: grpc
      port: 9999
      protocol: TCP
      targetPort: grpc
  1. 修改deployment.yaml,在配置中添加具体的pod数量,添加replicas: 2配置,修改后文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: podinfo
spec:
  replicas: 2
  minReadySeconds: 3
  revisionHistoryLimit: 5
  progressDeadlineSeconds: 60
  strategy:
    rollingUpdate:
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: podinfo
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9797"
      labels:
        app: podinfo
    spec:
      containers:
      - name: podinfod
        image: ghcr.io/stefanprodan/podinfo:6.8.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 9898
          protocol: TCP
        - name: http-metrics
          containerPort: 9797
          protocol: TCP
        - name: grpc
          containerPort: 9999
          protocol: TCP
        command:
        - ./podinfo
        - --port=9898
        - --port-metrics=9797
        - --grpc-port=9999
        - --grpc-service-name=podinfo
        - --level=info
        - --random-delay=false
        - --random-error=false
        env:
        - name: PODINFO_UI_COLOR
          value: "#34577c"
        livenessProbe:
          exec:
            command:
            - podcli
            - check
            - http
            - localhost:9898/healthz
          initialDelaySeconds: 5
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - podcli
            - check
            - http
            - localhost:9898/readyz
          initialDelaySeconds: 5
          timeoutSeconds: 5
        resources:
          limits:
            cpu: 2000m
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 64Mi
        volumeMounts:
          - name: data
            mountPath: /data
      volumes:
        - name: data
          emptyDir: {}
  1. 修改kustomization.yaml如下:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml
  1. 修改后,添加相关的变动提交信息,并将修改的内容push到远程仓库中,注意一定要Push到远程仓库,flux是跟踪远程仓库地址来自动化部署的
git add -A && git commit -m "Modify application deployment configuration"
git push

3.11 部署podinfo应用

配置 Flux 以构建并应用位于 podinfo 仓库中的 kustomize 目录

  1. 使用 flux create 命令创建应用 podinfo 部署的 Kustomization
# 注意,在fleet-infra仓库目录下,运行下面命令
flux create kustomization podinfo \
  --target-namespace=default \
  --source=podinfo \
  --path="./kustomize" \
  --prune=true \
  --wait=true \
  --interval=1m \
  --retry-interval=1m \
  --health-check-timeout=1m \
  --export > ./clusters/my-cluster/podinfo-kustomization.yaml
  1. Kustomization 清单提交并推送到仓库:
git add -A && git commit -m "Add podinfo Kustomization"
git push

3.12 观察flux是否同步部署应用程序

  1. 使用 flux get 命令监视 podinfo 应用
flux get kustomizations --watch

输出类似于:

NAME       	REVISION          	SUSPENDED	READY	MESSAGE                              
flux-system	main@sha1:42ea91f7	False    	True 	Applied revision: main@sha1:42ea91f7	
podinfo	master@sha1:30f508f0	False	True	Applied revision: master@sha1:30f508f0
  1. 检查 podinfo 是否已在您的集群中部署:
kubectl -n default get deployments,services

输出类似于:

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo      2/2     2            2           18h

NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP                   PORT(S)                         AGE
service/podinfo         LoadBalancer   10.247.39.71    121.36.10.205,192.168.0.181   9898:32587/TCP,9999:32567/TCP   18h

同时也可以在集群控制台查看相关负载和服务是否正确运行,注意如果服务中podinfo的负载均衡访问没有自动化配置成功,需要手动更新一下,购买相关的资源后系统方可自动化配置,自动化部署结果如下:
image.png
image.png

3.13 验证flux根据git自动更新

上面我们已经实现了flux在华为云鲲鹏CCE集群上的自动部署,那么下面要验证下flux能根据git仓库自动更新部署。

首先,我们根据上面的部署可知,目前podinfo的pod数量为2,并且根据flux get kustomizations --watch的结果可以看到当前拉取的git仓库版本为master@sha1:30f508f0

下面我们在本地修改podinfo仓库中kustomize文件夹中的deployment.yaml文件,将副本数量修改为replicas: 3,修改后内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: podinfo
spec:
  replicas: 3
  minReadySeconds: 3
  revisionHistoryLimit: 5
  progressDeadlineSeconds: 60
  strategy:
    rollingUpdate:
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: podinfo
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9797"
      labels:
        app: podinfo
    spec:
      containers:
      - name: podinfod
        image: ghcr.io/stefanprodan/podinfo:6.8.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 9898
          protocol: TCP
        - name: http-metrics
          containerPort: 9797
          protocol: TCP
        - name: grpc
          containerPort: 9999
          protocol: TCP
        command:
        - ./podinfo
        - --port=9898
        - --port-metrics=9797
        - --grpc-port=9999
        - --grpc-service-name=podinfo
        - --level=info
        - --random-delay=false
        - --random-error=false
        env:
        - name: PODINFO_UI_COLOR
          value: "#34577c"
        livenessProbe:
          exec:
            command:
            - podcli
            - check
            - http
            - localhost:9898/healthz
          initialDelaySeconds: 5
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - podcli
            - check
            - http
            - localhost:9898/readyz
          initialDelaySeconds: 5
          timeoutSeconds: 5
        resources:
          limits:
            cpu: 2000m
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 64Mi
        volumeMounts:
          - name: data
            mountPath: /data
      volumes:
        - name: data
          emptyDir: {}

将本地修改内容提交到远程仓库

git add -A && git commit -m "update replica count from 2 to 3"
git push

继续监视podinfo应用状态:

flux get kustomizations --watch

发现结果为:

NAME       	REVISION          	SUSPENDED	READY	MESSAGE                              
flux-system	main@sha1:42ea91f7	False    	True 	Applied revision: main@sha1:42ea91f7	
podinfo	master@sha1:5d29acc2	False	True	Applied revision: master@sha1:5d29acc2

运行下面命令

kubectl -n default get deployments,services

结果为:

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo      3/3     3            3           18h

NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP                   PORT(S)                         AGE
service/podinfo         LoadBalancer   10.247.39.71    121.36.10.205,192.168.0.181   9898:32587/TCP,9999:32567/TCP   18h

可以发现,podinfo的应用pod数量已经根据我们的配置修改变更为了3,并且目前拉取的最新git代码已经从master@sha1:30f508f0变更为master@sha1:5d29acc2因此在华为云鲲鹏CCE集群中成功验证了flux能够自动化根据git仓库部署更新应用
image.png

4 参考资料

  1. 开源for Huawei介绍、环境搭建、示例项目、开发和部署指南: gitcode .com/HuaweiCloudDeveloper/OpenSourceForHuaweiWiki/overview
  2. SPIRE适配GaussDB开源开发任务:bbs.huaweicloud .com/blogs/446798
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。