前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Flux CD持续交付Kubernetes应用程序

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

作者头像
有点技术
发布2020-07-13 11:21:10
5.8K0
发布2020-07-13 11:21:10
举报
文章被收录于专栏:有点技术有点技术

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么使用 FLUX CD?
  • Flux CD如何工作
  • 先决条件
  • 安装fluxctl
  • 授权Flux CD连接到您的Git存储库
  • 结论
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档