GitOps实战:使用Flux新建Kubernetes集群

为了让用户能获得更低延迟的响应,越来越多的企业开始向更加分布式的云计算环境迈进。以可重复、可移植的方式构建平台和应用程序,这种能力变得越来越重要。


延伸阅读,点击链接了解Akamai Cloud Computing


本文将简要介绍如何快速、高效地启用新集群。操作中将会用到GitOps和Flux等基础部署工具,如入口网关、监控、日志和机密管理。

GitOps和Flux是什么

GitOps是一种以Git仓库作为唯一事实来源,从而实现基础设施自动化的过程。

Flux则是GitOps所包含的一种持续交付解决方案。它提供了一组Kubernetes控制器,可用于监控版本库(Git或Helm),并通过部署、更新或删除对象等方式与当前集群状态保持一致。

Flux 2.0的炫酷功能

1.维护一整套平台工具

有了GitOps,我们可以集中维护希望Kubernetes集群具备的一套工具。

在下文示例中,将使用flux向集群部署5个工具:

  1. Nginx Ingress Gateway:提供第7层路由功能
  2. Cert-Manager:自动管理TLS证书,实现https
  3. Sealed Secrets:机密信息会在加密后存储在公共存储库中
  4. Grafana和Prometheus:工作负载指标监控
  5. EFK栈:中央日志

2.Flux可同时引用helm和git仓库

Flux对于如何构建和引用应用程序并无倾向性。大多数成熟的开源工具都使用helm chart来维护。很多时候,应用程序微服务可能并不需要额外的抽象层。Flux为我们提供了直接在git仓库(而非helm仓库)中引用yaml集的选项。

3.自动化的漂移修正

由于GitOps以声明方式表达所需状态,因此Flux会定期将实际状态(通过Kubernetes API获得)与所需状态进行核对。任何(意外或故意的)配置漂移都会得到补救,从而让平台工程师睡个好觉。

GitHub仓库──集群设置

让我们仔细看看GitHub仓库是如何设置的。

集群仓库的文件夹结构

该repo包含3个文件夹。在空repo上初始化flux时会自动创建flux-system文件夹。由于这是一个现有repo,我们将保持原样。

让我们重点关注Infra和cluster文件夹。

1.Infra文件夹

该文件夹包含可部署到集群中的工具和配置。这构成了我们可以维护和配置的基线。

在这里定义的应用程序并不意味着会被部署到集群中。该文件夹就像一个"函数",可被cluster文件夹调用并部署。

包含可部署到集群的工具列表

另一点需要注意的是配置和控制器的分离,这样我们就可以在不同yaml之间建立部署依赖关系。在我们的设置中,只有在控制器之后才会部署配置。集群文件夹内的infra.yaml文件中说明了这种依赖关系。下文将详细介绍 infra.yaml。

2.Clusters文件夹

该文件夹通过创建子文件夹来管理多个群集。在本例中,我们将创建一个名为id-cluster的子文件夹来管理k8s集群。

集群设置

在Infra.yaml中,我们将指定从Infra文件夹中包含的工具(本例中将包含所有工具)。

我们还将指明集群特有的任何配置更改,例如grafana和kibana url的唯一主机名。

yaml 复制代码
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: infra-controllers
  namespace: flux-system
spec:
  interval: 2h
  retryInterval: 1m
  timeout: 5m
  sourceRef:
    kind: GitRepository
    name: flux-system
  path: ./infra/controllers
  prune: true
  wait: true
  patches:
    - patch: |
        - op: replace
          path: /spec/values/grafana/ingress/hosts/0
          value: "grafana-id.gangstack.com"
        - op: replace
          path: /spec/values/grafana/ingress/tls/0/hosts/0
          value: "grafana-id.gangstack.com"
      target:
        kind: HelmRelease
        name: prometheus-operator
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: infra-configs
  namespace: flux-system
spec:
  dependsOn:
    - name: infra-controllers
  interval: 1h
  retryInterval: 1m
  timeout: 5m
  sourceRef:
    kind: GitRepository
    name: flux-system
  path: ./infra/configs
  prune: true
  patches:
    - patch: |
        - op: replace
          path: /spec/acme/server
          value: https://acme-v02.api.letsencrypt.org/directory
      target:
        kind: ClusterIssuer
        name: letsencrypt
    - patch: |
        - op: replace
          path: /spec/rules/0/host
          value: "kibana-id.gangstack.com"
        - op: replace
          path: /spec/tls/0/hosts/0
          value: "kibana-id.gangstack.com"
      target:
        kind: Ingress  
        name: kibana-ingress

在展示了软件仓库的设置后,开始它们的表演吧。

好戏上场

接下来,我们将使用Akamai Connected Cloud Linode Kubernetes Engine(LKE)在雅加达区域建立一个集群。

1.Linode Kubernetes Engine

LKE是Akamai Connected Cloud提供的产品,具备完全托管的编排引擎和集群自动扩展功能。让我们在雅加达区域创建一个LKE集群。

  • 首先访问Linode Cloud Manager,进入左侧面板的Kubernetes选项,然后选择Create Cluster。

Linode Cloud Manager──LKE

  • 在雅加达区域建立一个集群。我们选择了3 x 8GB共享Linode。

LKE安装

  • 为kubectl服务器下载kubeconfig。这里使用的是Ubuntu Linode Server。

下载kubeconfig.yaml

  • 将kubeconfig粘贴到.kube文件夹,并将文件重命名为config。

kubectl设置

2.在集群中设置Flux

安装Flux CLI和一系列flux Kubernetes控制器。该配置将在我们的集群中建立GitOps交付管道,并将我们的集群repo作为唯一事实来源。

  • 使用bash安装flux:
arduino 复制代码
curl -s https://fluxcd.io/install.sh | sudo bash
  • 为了让git能访问我们的集群仓库,需要通过环境变量提供一个PAT令牌。
ini 复制代码
export GITHUB_TOKEN=<gh-token>
  • 为集群仓库运行bootstrap。
ini 复制代码
flux bootstrap github \
  --token-auth \
  --owner=gangyi89 \
  --repository=tools-demo-flux \
  --branch=main \
  --path=clusters/id-cluster \
  --personal
  • 等待flux安装完成。

flux cli显示所有组件均已正常运行

  • 检查确保Kustomizations和HelmReleases已经正常运行。

Kustomizations已就绪

Helmreleases已就绪

3.DNS设置

最后,我们将为grafana和kibana仪表板添加2个DNS条目。借助内置的证书管理器工具,我们还能通过https访问它们。

  • 从入口对象获取IP地址。

入口控制器的IP地址

  • 更新DNS条目。在本例中,我们使用Linode DNS Manager作为域名服务器来管理域名。我们将在DNS条目中添加2个A/AAA记录。

Linode DNS Manager

结果

至此,我们已经可以通过网络浏览器访问该集群的Kibana和Grafana仪表板。在这里可以看到一些很喜人的结果:

Elastic:

  • 可支持https的Kibana仪表板
  • 集群内所有容器的集中日志记录
  • 可搜索、索引的日志

Kibana仪表板

Grafana:

  • 可支持https的Grafana仪表板
  • 集群和工作负载的健康度监控

Grafana仪表板

结论

本文介绍了如何利用flux快速启用新群集。GitRepo现在允许我们引用一套可部署到多个集群的工具,只需在集群文件夹中创建另一个子文件夹即可。这其实只是一个开始。请继续探索并扩展这些功能,或立即使用已建立的gitOps管道部署工作负载。

立即注册Linode,亲自探索一番吧。祝大家玩得愉快:)


如果你喜欢我们的文章,欢迎关注我们↓↓↓

了解更多

相关推荐
DataFunTalk几秒前
乐信集团副总经理周道钰亲述 :乐信“黎曼”异动归因系统的演进之路
前端·后端·算法
DataFunTalk11 分钟前
开源一个MCP+数据库新玩法,网友直呼Text 2 SQL“有救了!”
前端·后端·算法
idMiFeng22 分钟前
通过GO后端项目实践理解DDD架构
后端
LemonDu33 分钟前
Cursor入门教程-JetBrains过度向
人工智能·后端
LTPP39 分钟前
掌握Rust Web开发的未来:Hyperlane框架全方位教程 🎓🔧
前端·后端·github
LemonDus1 小时前
Cursor入门教程-JetBrains过度向
后端·工具·技术知识
涡能增压发动积1 小时前
SpringAI+LiteFlow实现智能体编排
人工智能·后端
精神内耗中的钙奶饼干1 小时前
Windows 系统搭建Kafka集群记录
后端·kafka
阿里云云原生1 小时前
MCP 正当时:FunctionAI MCP 开发平台来了!
云原生
uhakadotcom1 小时前
Apache APISIX入门指南:快速理解与实战示例
后端·面试·github