Flux(学习笔记)

核心原理

Flux为一款GitOPS的发布工具,应用信息全部放到git仓库中,一旦git仓库中应用信息有新的提交,Flux即可在k8s中发布新的部署。支持kustomize和helm chart形式的应用。目前该项目为CNCF的孵化项目。

快速开始

前置条件

  1. 已经存在k8s集群
  2. 可以获取到Github的个人token

安装flux cli

执行如下命令安装flux cli

1
curl -s https://fluxcd.io/install.sh | sudo bash

将如下内容追到到文件~/.bash_profile

1
. <(flux completion bash)

bootstrap

bootstrap操作会在k8s集群中安装flux到flux-system下,并且会通过git的方式来管理其自身。这里直接采用github,首先要获取到token,并设置为环境变量。

1
export GITHUB_TOKEN=xxx

并执行如下命令开始bootstrap

1
2
3
4
5
flux bootstrap github \
  --owner=kuring \
  --repository=flux-learn \
  --path=clusters/my-cluster \
  --personal

会自动创建github repo,并且会在main分支的clusters/my-cluster/flux-system下创建三个文件:

  • gotk-components.yaml:flux的组件yaml
  • gotk-sync.yaml
  • kustomization.yaml:使用kustomization来个性化flux组件

会安装如下组件到k8s中

1
2
3
4
5
6
$ k get deployment -n flux-system 
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
helm-controller           1/1     1            1           27m
kustomize-controller      1/1     1            1           27m
notification-controller   1/1     1            1           27m
source-controller         1/1     1            1           27m

也可以使用更简单的方式flux install来安装flux,该命令不会将flux的安装信息存放到git仓库中,而是会直接安装。

部署应用

将上述的github项目copy到本地,需要特别注意的是github不允许使用密码来认证,需要在输入密码的地方输入token。

1
2
git clone https://github.com/kuring/flux-learn
cd fleet-infra

使用如下命令在git仓库中创建podinfo-source.yaml文件和kustomization文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
flux create source git podinfo \
  --url=https://github.com/stefanprodan/podinfo \
  --branch=master \
  --interval=30s \
  --export > ./clusters/my-cluster/podinfo-source.yaml
  
flux create kustomization podinfo \
  --target-namespace=default \
  --source=podinfo \
  --path="./kustomize" \
  --prune=true \
  --interval=5m \
  --export > ./clusters/my-cluster/podinfo-kustomization.yaml

podinfo-source.yaml文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 30s
  ref:
    branch: master
  url: https://github.com/stefanprodan/podinfo

podinfo-kustomization.yaml文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 5m0s
  path: ./kustomize
  prune: true
  sourceRef:
    kind: GitRepository
    name: podinfo
  targetNamespace: default

执行如下命令将文件提供到git仓库

1
2
git add -A && git commit -m "Add podinfo GitRepository"
git push

查看podinfo的部署状态,说明已经自动部署成功。

1
2
3
4
$ flux get kustomizations --watch
NAME    REVISION        SUSPENDED       READY   MESSAGE                          
podinfo master/bf09377  False           True    Applied revision: master/bf09377
flux-system     main/81f2115    False   True    Applied revision: main/81f2115

修改podinfo-kustomization.yaml文件内容如下,并重新提交到git仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 5m0s
  path: ./kustomize
  prune: true
  sourceRef:
    kind: GitRepository
    name: podinfo
  targetNamespace: default
  patches:
    - patch: |-
        apiVersion: autoscaling/v2beta2
        kind: HorizontalPodAutoscaler
        metadata:
          name: podinfo
        spec:
          minReplicas: 3             
      target:
        name: podinfo
        kind: HorizontalPodAutoscaler

过会可以看到环境中的hpa最小副本数已经变更为3.

资料