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,亲自探索一番吧。祝大家玩得愉快:)


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

了解更多

相关推荐
IT_陈寒43 分钟前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码2 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo2 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志3 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..3 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects3 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰3 小时前
一些基础和问题解决
后端
陈随易3 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN3 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana3 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端