k8s与CICD--利用flux部署应用到kubernetes

简介: 前言 一直在思考部署应用到k8s的姿势,之前介绍过helm,个人感觉helm把记录数据放到k8s中不是特别好。最近发现了weave的flux项目(A tool for deploying container images to Kubernetes services)。

前言

一直在思考部署应用到k8s的姿势,之前介绍过helm,个人感觉helm把记 录数据放到k8s中不是特别好。最近发现了weave的flux项目(A tool for deploying container images to Kubernetes services)。

flux简介和注意事项

flux简介

先上图,大致看一下flux的理念。

83afdade4512142225056995306527f336c4fb7c

1:flux可以和任意你喜欢的CI工具搭配比如:Drone,CircleCI,gitlabCI等。实际上flux做了CD的环节。

2:flux可以帮助你安全地更新应用。一般会遇到更新过程出错的问题,在flux实现中,每个部署的应用的yaml文件存储在git仓库里,所以每次更改都可以追踪,所以也能精确回滚到任何一个历史版本。这点我是觉得非常好的。当应用需要更新镜像的时候,有以下几个步骤:

  1. Clone the repository
  2. Find the deployment files that use the image in question (there may be more than one, since we have e.g., sidecar containers that use the same image)
  3. Update a few fields in each file, in slightly different ways (e.g., put the image name in the template, and the tag part of the image name in a version label)
  4. Commit and push the change back to Git

如果只是更新镜像,其实有更简单的操作:

$ fluxctl release --service=sock-shop/front-end --update-all-images
Submitting release job...
Release job submitted, ID cc08f78c-0e66-24a9-9215-82c80cc646c3
Status: Complete.
Here's what happened:
1. Submitted job.
2. Calculating release actions.
3. Release latest images to sock-shop/front-end 4. Clone the config repo.
5. Clone OK.
6. Update 1 images(s) in the resource definition file for sock-shop/front-end: front-end (weaveworksdemos/front-end:0.2.0 -> weaveworksdemos/front-end:7f511af2d21fd601b86b3bed7baa6adfa9c8c669).
7. Update pod controller OK.
8. Commit and push the config repo.
9. Pushed commit: Release latest images to sock-shop/front-end 10. Regrade 1 service(s): sock-shop/front-end.
Took 55.810622454s

此处会引出和drone结合的想法。这一点在总结里会详细阐述。

3: flux很好解决了可视化的问题,通过几个指令就能清楚知道正在发生的。flux有controller的概念。


$ fluxctl list-services --namespace=sock-shop
SERVICE CONTAINER IMAGE RELEASE POLICY
sock-shop/cart cart weaveworksdemos/cart:0.3.0 
sock-shop/cart-db cart-db mongo 
sock-shop/catalogue catalogue weaveworksdemos/catalogue:0.2.0 
sock-shop/catalogue-db catalogue-db weaveworksdemos/catalogue-db:0.2.0 
sock-shop/front-end front-end weaveworksdemos/front-end:0.2.0 
sock-shop/orders orders weaveworksdemos/orders:0.3.0 
sock-shop/orders-db orders-db mongo 
sock-shop/payment payment weaveworksdemos/payment:0.3.0 
sock-shop/queue-master queue-master weaveworksdemos/queue-master:0.3.0 
sock-shop/rabbitmq rabbitmq rabbitmq:3 
sock-shop/shipping shipping weaveworksdemos/shipping:0.3.0 
sock-shop/user user weaveworksdemos/user:0.3.0 
sock-shop/user-db user-db weaveworksdemos/user-db:0.3.0 
$ fluxctl list-images --service=sock-shop/front-end
SERVICE CONTAINER IMAGE CREATED
sock-shop/front-end front-end weaveworksdemos/front-end | 7f511af2d21fd601b86b3bed7baa6adfa9c8c669 18 Nov 16 16:00 UTC
 | latest 18 Nov 16 16:00 UTC
 | snapshot 18 Nov 16 16:00 UTC
 | 16007dddd86b2ebb41d8880c53b77580cab13f02 18 Nov 16 11:23 UTC
 | a0eaf8c8ffc0b81c2199adaf7d67466891bb3205 17 Nov 16 10:22 UTC
 | 1b664cc81d9cf25b213000686a9e8d6477ae1b06 16 Nov 16 20:31 UTC
 | ce1efe59c32d3c53344defdda4d5b643272022b8 16 Nov 16 20:29 UTC
 | 4c33b216ae902ad89b9c3ca30a99a44833d16d5b 10 Nov 16 21:34 UTC
 | 7015587783bc8f7a9c3d5cfa51e5a257fe188c4b 10 Nov 16 11:34 UTC
 | 4d3ea2896c81e40a630d36cdc29ce740e7617016 10 Nov 16 11:30 UTC
 : 
 '-> 0.2.0 09 Nov 16 10:26 UTC

4:flux实际上可以做到完全自动检测git仓库中yaml文件的变化以及registry中镜像的更新,进而自动部署。
It is most useful when used as a deployment tool at the end of a Continuous Delivery pipeline. Flux will make sure that your new container images and config changes are propagated to the cluster。
大意就是,利用flux作为cd pipeline中最后一个环节,可以很好地解决镜像更新或是yaml文件更新。

flux部署到k8s中注意事项

由于fluxd需要从git仓库中拉取代码,所以会有一个ssh key的问题。
注意flux-secret.yaml文件:

--- apiVersion: v1 kind: Secret metadata: name: flux-git-deploy type: Opaque 

并没有data一项。实际上,flux默认会给我们生成一个key。

9ca35b81688c24c18554dedde49b895b281a9826

然后可以执行

$ fluxctl identity
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1fndADrb1fp6a+7QusXMU9qI2CNodLyMR82/6Li8rAstUCMRI9SjThAAbzyIfuCX61YCjWGj6qHyPusmfOssErbs7+rs6Q3y0RrACZT7w4HTgODX4aXGMigVY+IztpDv+XYztTqLCwMVfsrQWvo/WrtbltCdjzTP3gR7nWriPzCks3KbEFZkk4bCISJzV19RBCQzJBlE6afOAreCCdhooy80zmWOmHqc+OVDbAVTOC5Bcht/EaHNXGCwcHijiNd0MPah6OKI+gG/eDB2OLixdhoNTzeEYN6vB5Y/wwNuH/m29y46EM6mfXuq6KkD+/YT9J0XiTx

就可以获得到public key。这个时候复制到github 仓库的 deploy key即可。

总结

1:如何与drone结合?
首先我是认可将yaml存储在git仓库中,做版本控制。
实际上flux类似于helm,分为fluxd和一个命令行工具fluxctl,fluxd相当于server部署在k8s集群中。那么将fluxctl做成一个drone的插件。放在drone pipeline中最后一步。类似于现在很多helm插件的玩法。
这个插件只需要完成更新镜像的功能即可。毕竟整个pipeline中,更新代码到仓库中触发编译,构建,推送新镜像到harbor,最终对于k8s集群,只需要应用替换新的镜像即可。所以不需要去监听registry这个功能。也不需要关注git中yaml的变化,拉取最新的即可。
具体实现思路:

  • 将新的镜像name和要更新的目标,以及yaml文件路径等作为drone插件的输入参数
  • 然后执行下面的类似命令
$ fluxctl release --controller=default:deployment/helloworld --update-image=quay.io/weaveworks/helloworld:master-a000001
Submitting release ...
Commit pushed: 33ce4e3
Applied 33ce4e38048f4b787c583e64505485a13c8a7836
CONTROLLER STATUS UPDATES
default:deployment/helloworld success helloworld: quay.io/weaveworks/helloworld:master-9a16ff945b9e -> master-a000001

$ fluxctl list-images --controller default:deployment/helloworld
CONTROLLER CONTAINER IMAGE CREATED
default:deployment/helloworld helloworld quay.io/weaveworks/helloworld
 | master-9a16ff945b9e 20 Jul 16 13:19 UTC
 | master-b31c617a0fe3 20 Jul 16 13:19 UTC
 | master-a000002 12 Jul 16 17:17 UTC
 '-> master-a000001 12 Jul 16 17:16 UTC
 sidecar quay.io/weaveworks/sidecar
 '-> master-a000002 23 Aug 16 10:05 UTC
 master-a000001 23 Aug 16 09:53 UTC

2:抛开drone,对于整个paas平台。flux提供的自动监控registry和yaml git 仓库的功能,也能丰富用户的各种玩法。

3:接下来就是drone-flux插件。该插件是我实现本想法而实现的的一个插件。

本文转自中文社区-k8s与CICD--利用flux部署应用到kubernetes

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
8 5
|
1天前
|
Kubernetes Linux Docker
Kubernetes详解(四)——基于kubeadm的Kubernetes部署
Kubernetes详解(四)——基于kubeadm的Kubernetes部署
12 2
|
4天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
5天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
28 1
|
11天前
|
Kubernetes API 调度
|
12天前
|
Kubernetes 应用服务中间件 nginx
K8S二进制部署详解,一文教会你部署高可用K8S集群(二)
K8S二进制部署详解,一文教会你部署高可用K8S集群(二)
|
12天前
|
Kubernetes 网络安全 数据安全/隐私保护
K8S二进制部署详解,一文教会你部署高可用K8S集群(一)
K8S二进制部署详解,一文教会你部署高可用K8S集群(一)
|
12天前
|
SQL Kubernetes 调度
【一文看懂】部署Kubernetes模式的Havenask集群
本次分享内容为havenask的kubernetes模式部署,由下面2个部分组成(部署Kubernetes模式Havenask集群、 Kubernetes模式相关问题排查),希望可以帮助大家更好了解和使用Havenask。
26 1
|
13天前
|
Kubernetes 网络协议 Python
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(二)
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(二)
|
13天前
|
Kubernetes 应用服务中间件 开发工具
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(一)
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(一)