GitOps是一种实现持续交付的模型,它的核心思想是将应用系统的声明性基础架构和应用程序存放在Git的版本控制库中。
对于日常维护,我比较关心是否有一个完整的声明,可以反应出 Kubernetes 集群中的资源情况。而不是每个应用去单独描述和发布。我这次使用 Flux 来做练习。
Source
A Source defines the origin of a repository containing the desired state of the system and the requirements to obtain it (e.g. credentials, version selectors). For example, the latest tag available from a Git repository over SSH.
1.x
Reconciliation
Reconciliation refers to ensuring that a given state (e.g. application running in the cluster, infrastructure) matches a desired state declaratively defined somewhere (e.g. a Git repository).
1. 准备一个 Kubernetes 集群,直接使用 Azure 的服务
2. 使用 Az cli 登录,并获取到 access token
az login -t <租户ID>
az aks get-credentials -n <集群名称> -g <资源组名称>
3. 查看一下目前集群的信息,也证明我们上一步获取到的 token 是正确的
4. 我们这次动手实验选用的 GitOps 工具是 Flux ,首先安装他的 cli ,用管理员执行以下命令。
choco install flux
检查一下是否安装成功
5. 创建一个用于管理代码的 repo ,虽然初始化的时候可以自动创建,不过考虑到一会儿需要准备的个人访问令牌的权限问题,我还是提前手动创建好。创建好的 repo 如下:
6. 准备 Github 个人访问令牌
7. 启动 Flux
flux bootstrap github `
--owner=mayong43111 `
--repository=dapr-aks-poc `
--branch=main `
--path=./clusters/dapr-cluster `
--personal
安装完效果如下:
检查 repo ,发现新增加了一些文件
8. 将源代码 clone,并在本地计算机执行命令添加示例
flux create source git podinfo `
--url=https://github.com/stefanprodan/podinfo `
--branch=master `
--interval=30s `
--export > ./clusters/dapr-cluster/podinfo-source.yaml
提交代码仓库
git add -A && git commit -m "add dev cluster" && git push
9. 增加一个部署
flux create kustomization podinfo `
--target-namespace=default `
--source=podinfo `
--path="./kustomize" `
--prune=true `
--interval=5m `
--export > ./clusters/dapr-cluster/podinfo-kustomization.yaml
10. 启动监视
flux get kustomizations --watch
11. 提交代码
git add -A && git commit -m "Add podinfo Kustomization"
git push
并观测到变化
查看 workload
1. 增加一个自己的源,这里使用的是 GitRepository
flux create source git dapr-poc `
--url=https://github.com/mayong43111/dapr-aks-poc `
--branch=main `
--interval=30s `
--export > ./clusters/dapr-cluster/dapr-source.yaml
2. 在代码库根目录下增加一个 aspnetapp.yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: aspnetapp
labels:
app: aspnetapp
spec:
containers:
- image: "mcr.microsoft.com/dotnet/core/samples:aspnetapp"
name: aspnetapp-image
ports:
- containerPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: aspnetapp
spec:
selector:
app: aspnetapp
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aspnetapp
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- http:
paths:
- path: /
backend:
service:
name: aspnetapp
port:
number: 80
pathType: Exact
3. 增加一个 Reconciliation ,这里使用的是 Kustomization
flux create kustomization dapr-poc `
--target-namespace=dapr-poc `
--source=dapr-poc `
--path="./dapr" `
--prune=true `
--interval=5m `
--export > ./clusters/dapr-cluster/dapr-kustomization.yaml
查看结果,发现出现了一个错误,找不到名称为 dapr-poc 的 namespace
4. 在 dapr 文件夹下增加 namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dapr-poc
5. 这次通过命令查看
kubectl -n dapr-poc get pods,deployments,services
本次动手实验结束。