如何使用Flux CD持续交付Kubernetes应用程序

2020-07-13 11:21:10 浏览数 (1)

Flux CD - 适用于Kubernetes工作负载的GitOps

Flux CD是一个连续交付工具,正在迅速普及。Weaveworks最初开发了该项目,然后将其开源到CNCF.

它成功的原因是它可以感知Kubernetes变化并且易于设置。它提供的最亮点的功能是,它允许团队以声明方式管理其Kubernetes部署。Flux CD通过定期轮询存储库来将存储在源代码存储库中的Kubernetes manifests文件与Kubernetes集群同步, 因此团队无需担心运行kubectl命令和监视环境以查看他们是否部署了正确的工作负载。相反,Flux CD确保Kubernetes集群始终与源代码存储库中定义的配置保持同步。

它使团队可以实现GitOps,它具有以下原则:

  • Git是的唯一的真实来源。
  • Git是操作所有环境的唯一场所,所有配置都是代码。
  • 所有更改都是可观察/可验证的。

为什么使用 FLUX CD?

使用Kubernetes的传统CI/CD部署遵循以下模式:

  • 开发人员创建代码并编写Dockerfile。他们还为应用程序创建Kubernetes manifests和Helm Charts。
  • 他们将代码推送到源代码存储库。
  • 源代码存储库使用提交后的钩子触发Jenkins构建。
  • Jenkins CI流程将构建Docker映像和Helm软件包,并将其推送到依赖仓库。
  • 然后,Jenkins CD程序部署helm charts到k8s cluster。

这个过程听起来合理,或多或少是行业标准。但是,有一些限制:

  • 您需要将Kubernetes 凭据存储在Jenkins服务器中。由于服务器是共享的,这是折中的做法。
  • 尽管您可以使用Jenkins创建和更改配置,但无法使用它删除现有资源。例如,如果您从存储库中删除清单文件,则kubectl不会将其从服务器中删除。这是自动化GitOps的最大障碍。

Flux CD如何工作

Flux CD允许团队以声明方式使用YAML清单指定所有必需的Kubernetes配置。

  • 团队编写Kubernetes manifests并将其推送到源代码存储库。
  • memcached pod存储当前配置。
  • Flux定期(默认为五分钟)使用Kubernetes operator轮询存储库以进行更改。Flux容器将其与memcached中的现有配置进行比较。如果检测到更改,它将通过运行一系列kubectl apply/delete命令将配置与集群同步。然后,它将最新的元数据再次存储在memcached存储中。

另外,如果要自动升级工作负载,Flux CD允许您轮询docker registry,并使用最新镜像更新Git存储库中的Kubernetes manifests。由于Flux CD以Kubernetes operator的身份运行,因此设置非常简单,而且启动也很轻松。让我们看一下动手演示,以便我们更好地理解它。

先决条件

确保您具有一个正在运行的Kubernetes集群,并具有cluster-admin的角色以部署Flux CD 。

安装fluxctl

Flux CD提供了一个fluxctl二进制文件,可以帮助您在Kubernetes集群中部署和管理Flux CD。下载的最新版本fluxctl并将其移动到/usr/bin目录中。

代码语言:javascript复制
$ wget https://github.com/fluxcd/flux/releases/download/1.19.0/fluxctl_linux_amd64
$ mv fluxctl_linux_amd64 /usr/bin/fluxctl
$ sudo chmod  x /usr/bin/fluxctl

在此示例中,让我们使用GitHub作为源代码存储库。forck bharatmicrosystems/nginx-kubernetes存储库到您的GitHub的帐户中。

该存储库包含目录中的清单nginx-deployment和nginx-service清单以及workloads目录中的web名称空间定义namespaces。

代码语言:javascript复制
├─ namespaces
│  └─ web-ns.yaml
├─ workloads
│  ├─ nginx-deployment.yaml
│  └─ nginx-service.yaml
├─ .gitignore
├─ LICENSE
└─ README.md

在GHUSER环境变量中提供GitHub用户的名称,在环境变量中提供GitHub存储库GHREPO,如下所示。创建一个名为的新名称空间,flux并在Kubernetes集群中安装Flux CD操作符。

该fluxctl install命令根据以下选项生成所需的Kubernetes清单:

  • git-user— Git用户。在这种情况下,GitHub用户名
  • git-email — Git用户电子邮件。在这种情况下,默认的GitHub电子邮件
  • git-url — Git存储库的URL
  • git-path — Git存储库中用于同步更改的目录
  • namespace —部署flux运算符的名称空间
代码语言:javascript复制
$ export GHUSER="<YOUR_GITHUB_USER>"
$ export GHREPO="<YOUR_GITHUB_REPO>"
$ kubectl create ns flux
namespace/flux created
$ fluxctl install 
--git-user=${GHUSER} 
--git-email=${GHUSER}@users.noreply.github.com 
--git-url=git@github.com:${GHUSER}/${GHREPO} 
--git-path=namespaces,workloads 
--namespace=flux | kubectl apply -f -
service/memcached created
serviceaccount/flux created
clusterrole.rbac.authorization.k8s.io/flux created
clusterrolebinding.rbac.authorization.k8s.io/flux created
deployment.apps/flux created
secret/flux-git-deploy created
deployment.apps/memcached created

检查Flux部署是否成功。

代码语言:javascript复制
$ kubectl -n flux rollout status deployment/flux
deployment "flux" successfully rolled out

让我们获取flux名称空间中的所有资源,以查看对象的当前状态。如您所见,有一个flux吊舱和一个memcached吊舱。吊舱需要与之交互时,还有一项memcached服务flux。

代码语言:javascript复制
$ kubectl get all -n flux
NAME                             READY   STATUS    RESTARTS   AGE
pod/flux-86d86b868-lndhn         1/1     Running   0          2m
pod/memcached-86869f57fd-qwnts   1/1     Running   0          2m
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)     AGE
service/memcached   ClusterIP   10.8.11.199   <none>        11211/TCP   2m
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/flux        1/1     1            1           2m
deployment.apps/memcached   1/1     1            1           2m
NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/flux-86d86b868       1         1         1       2m
replicaset.apps/memcached-86869f57fd 1         1         1       2m

授权Flux CD连接到您的Git存储库

现在,我们需要允许Flux CD操作员与Git存储库进行交互,因此,我们需要将其公共SSH密钥添加到存储库中。使用获取公共SSH密钥fluxctl。

代码语言:javascript复制
$ fluxctl identity --k8s-fwd-ns flux
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCryxSADyA GIxtyCwpO3R9EuRcjZCqScKbYO246LZknyeluxKz0SlHYZHrlqxvla k5GpPqnbImLLhuAD YLzn0DbI58hUZLsrvxPWKiku--REDACTED--MKoPyEtQ JiR3ZiADx6Iq8tYRRR WBs1k5Hc8KNpg FSRP8I8 CJRkCG4JQacPwK8FESP4qr1dxVv1tE8ZXyb8CdiToKpK7Mkc= root@flux-b9b4cc4f9-p9w88

将SSH密钥添加到您的存储库中,以便Flux CD可以访问它。转到https://github.com//nginx-kubernetes/settings/keys 在标题部分的密钥中添加一个名称。将SSH密钥粘贴到“密钥”部分。选中“允许写访问权限”。

Flux CD每五分钟自动与配置的Git存储库同步一次。但是,如果要立即将Flux与Git存储库同步,则可以使用fluxctl sync,如下所示。

代码语言:javascript复制
$ fluxctl sync --k8s-fwd-ns flux
Synchronizing with ssh://git@github.com/bharatmicrosystems/nginx-kubernetes
Revision of master to apply is 8db9163
Waiting for 8db9163 to be applied ...
Done.

现在让我们看一下Pod,看看是否有两个Nginx副本。

代码语言:javascript复制
$ kubectl get pod -n web
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7fd6966748-lj8zd   1/1     Running   0          20s
nginx-deployment-7fd6966748-rbxqs   1/1     Running   0          20s

获得该服务,您应该会看到一个暴露80端口的nginx负载均衡器服务。如果您的Kubernetes集群可以动态加载负载平衡器,那么您应该会看到一个外部IP。

代码语言:javascript复制
$ kubectl get svc -n web
NAME            TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)        AGE
nginx-service   LoadBalancer   10.8.10.33   35.222.174.212   80:30609/TCP   94s

使用外部IP测试服务。如果您的群集不支持负载均衡器,则可以使用NodeIP:NodePort组合。

代码语言:javascript复制
$ curl http://35.222.174.212/
This is version 1

从workloads/nginx-deployment.yaml上更新镜像bharamicrosystems/nginx:v2

代码语言:javascript复制
$ sed -i "s/nginx:v1/nginx:v2/g" workloads/nginx-deployment.yaml
$ git add --all
$ git commit -m 'Updated version to v2'
$ git push origin master

现在,让我们等待五分钟以进行自动同步,同时,查看pod的更新。

代码语言:javascript复制
$ watch -n 30 'kubectl get pod -n web'
NAME                                READY   STATUS        RESTARTS   AGE
nginx-deployment-5db4d6cb84-8lbsk   1/1     Running       0          11s
nginx-deployment-5db4d6cb84-qc6jp   1/1     Running       0          10s
nginx-deployment-6784c95fc7-zqptk   0/1     Terminating   0          6m43s

如您所见,旧的pod正在终止,新pod正在滚动更新。检查pod状态,以确保所有pod都在运行。

代码语言:javascript复制
$ kubectl get pod -n web
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5db4d6cb84-8lbsk   1/1     Running   0          1m
nginx-deployment-5db4d6cb84-qc6jp   1/1     Running   0          1m

现在,让我们再次调用该服务。

代码语言:javascript复制
$ curl http://35.222.174.212/
This is version 2

如您所见,该版本现已更新为v2。恭喜你!您已经在Kubernetes集群上成功设置了Flux CD。

结论

Flux是声明式地将Git存储库中的Kubernetes配置与集群进行同步的最轻量的方法之一,尤其是从GitOps着手时。

原文:https://medium.com/better-programming/how-to-continuously-deliver-kubernetes-applications-with-flux-cd-502e4fb8ccfe

0 人点赞