为了让用户能获得更低延迟的响应,越来越多的企业开始向更加分布式的云计算环境迈进。以可重复、可移植的方式构建平台和应用程序,这种能力变得越来越重要。
延伸阅读,点击链接了解Akamai Cloud Computing
本文将简要介绍如何快速、高效地启用新集群。操作中将会用到GitOps和Flux等基础部署工具,如入口网关、监控、日志和机密管理。
GitOps和Flux是什么
GitOps是一种以Git仓库作为唯一事实来源,从而实现基础设施自动化的过程。
Flux则是GitOps所包含的一种持续交付解决方案。它提供了一组Kubernetes控制器,可用于监控版本库(Git或Helm),并通过部署、更新或删除对象等方式与当前集群状态保持一致。
Flux 2.0的炫酷功能
1.维护一整套平台工具
有了GitOps,我们可以集中维护希望Kubernetes集群具备的一套工具。
在下文示例中,将使用flux向集群部署5个工具:
- Nginx Ingress Gateway:提供第7层路由功能
- Cert-Manager:自动管理TLS证书,实现https
- Sealed Secrets:机密信息会在加密后存储在公共存储库中
- Grafana和Prometheus:工作负载指标监控
- 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,亲自探索一番吧。祝大家玩得愉快:)
如果你喜欢我们的文章,欢迎关注我们↓↓↓