2019独角兽企业重金招聘Python工程师标准>>>
GitOps实操工具-Flux安装与设置
- 本文编译来自 https://github.com/openthings/flux/blob/master/site/standalone/installing.md
- 本文地址 https://my.oschina.net/u/2306127/blog/1826581,by openthings, 2018.06.08.
- 参考:
- GitOps实操工具-Flux简介,https://my.oschina.net/u/2306127/blog/1826581
- GitOps—像代码一样管理Istio配置,https://my.oschina.net/u/2306127/blog/1822993
Flux是一个通过git管理和同步Kubernetes部署状态的支持GitOps的工具,用于完成Docker镜像库与Kubernetes运行时的CD(持续交付)阶段工作的自动化。如下图所示:
Flux 包含几个部分:
- 命令行客户端 fluxctl。
- daemon服务实例,flux 运行在集群中,维护集群的状态。
- service, 运行在 Weave Cloud。
你不需要最后一个就能使用 Flux; 只需要运行daemon然后通过命令行客户端工具连接即可。
快速安装
复制Flux repo并且编辑示范配置文件,位于 deploy/flux-deployment.yaml. 然后应用所有 deploy directory下的配置文件。
$EDITOR ./deploy/flux-deployment.yaml
kubectl apply -f ./deploy
Helm 用户
创建所有的资源,定义在 deploy-helm 目录,如下:
$EDITOR ./deploy-helm/helm-operator-deployment.yaml
kubectl apply -f ./deploy-helm
下一步,下载fluxctl 客户端的最新版本,在 github.
- 继续设置,参照 setup flux
细节描述
该部署安装Flux和其依赖。首先,进入示范配置的目录。
注意
Helm用户需要 deploy-helm 目录。
cd deploy
Memcache
Flux 使用 memcache 来cache docker registry requests.
kubectl create -f memcache-dep.yaml -f memcache-svc.yaml
Flux deployment
你需要创建一个secret,其中 Flux 将存储其SSH key。没有该参数,daemon将不会启动。
kubectl create -f flux-secret.yaml
该 Kubernetes 部署配置文件 flux-deployment.yaml运行 Flux daemon,但需要首先编辑一下,至少提供你自己的configuration repo (即 --git-repo
参数)。
$EDITOR flux-deployment.yaml
kubectl create -f flux-deployment.yaml
对于 Kubernetes >=1.6 的访问控制 (RBAC)
你需要给fluxd提供service account,使其能够访问希望使用Flux的 namespaces。查看 flux-account.yaml 中的服务账户(which puts essentially no constraints on the account) 以及RBAC documentation, 以及创建服务账户,在你放置Flux的namespace之中,你需要修改 namespace: default
一行,如果直接采用这个例程。
你需要明确地告诉fluxd 使用这个服务账户,通过去掉文件fluxd-deployment.yaml中这一行的
注释 # serviceAccountName: flux
Flux API service
为了使 pod对于命令行客户端 fluxctl可以访问,你需要将集群中的API暴露出来。
一个简单的方法是使用 kubectl port-forward
,赋予存取 Kubernetes API的权限。
fluxpod=$(kubectl get pod -l name=flux -o name | awk -F / '{ print $2; }')
kubectl port-forward "$fluxpod" 10080:3030 &
export FLUX_URL="http://localhost:10080/api/flux"
fluxctl list-controllers --all-namespaces
Local endpoint
须知: 这里暴露出的 Flux API, 是非授权的,是通过非安全的通道。除非你完全在本地局域网上,否则不要进行此操作。而且,只是为了试验、验证工作。
如果运行 Flux 在本地环境,比如说 minikube,你可以使用基于 NodePort的service。
一个示范的 manifest为 flux-nodeport.yaml。
然后你可以通过 NodePort
访问 API,获取端口方法如下 (假定用的是minikube):
fluxport=$(kubectl get svc flux --template '{{ index .spec.ports 0 "nodePort" }}')
export FLUX_URL="http://$(minikube ip):$fluxport/api/flux"
fluxctl list-controllers --all-namespaces
fluxctl
这将允许你通过命令行控制 Flux ,如果没有通过 Weave Cloud连接,这是唯一的与Flux交互的方式。
从 github 下载最新的fluxctl版本。
Helm operator (Helm users only)
Kubernetes deployment configuration 文件 helm-operator-deployment.yaml 运行helm operator, 但需要首先编辑,至少提供configuration repo (提供 --git-repo
用于 flux 以及 --git-charts-path 参数
)。
$EDITOR helm-operator-deployment.yaml
kubectl create -f flux-helm-release-crd.yaml -f helm-operator-deployment.yaml
连接 fluxctl 到 daemon
你需要告诉fluxctl
到哪里找到 Flux API。如果你使用minikube,你可以获得host的 IP address和port,如下:
$ flux_host=$(minikube ip)
$ flux_port=$(kubectl get svc flux --template '{{ index .spec.ports 0 "nodePort" }}')
$ export FLUX_URL=http://$flux_host:$flux_port/api/flux
输出 FLUX_URL
对 fluxctl
就足够了,也可以每次通过--url参数来指定。
定制daemon配置
连接flux到repository
你需要连接 flux 到 Kubernetes manifests存放的repository。通过设置 --git-url
和--git-branch
参数来实现,位于 flux-deployment.yaml
文件中的manifest。
Helm 用户
需要连接 helm-operator 到同样的 repository,将 helm-operator 指向包含Charts的 git path。这通过为Flux设置 --git-url
和 --git-branch
参数,同样设置 --git-charts-path
参数,在helm-operator-deployment.yaml
manifest之中。
添加SSH deploy key到repository
Flux连接到repository需要使用SSH key。有两个选项:
1. 允许 flux为你创建 key。
如果没有指定需要使用的key,Flux 将创建一个。可以通过fluxctl获得public key:
$ fluxctl identity ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCN2ECqUFMR413CURbLBcG41fLY75SfVZCd3LCsJBClVlEcMk4lwXxA3X4jowpv2v4Jw2qqiWKJepBf2UweBLmbWYicHc6yboj5o297//+ov0qGt/uRuexMN7WUx6c93VFGV7Pjd60Yilb6GSF8B39iEVq7GQUC1OZRgQnKZWLSQ== 0c:de:7d:47:52:cf:87:61:52:db:e3:b8:d8:1a:b5:ac +---[RSA 1024]----+ | ..= | | + B | | . . +.=| | . + . oo o| | . S . .o.. | | .=.o | | o = | | + | | E | +------[MD5]------+
可选地,你可以在flux
log中看见public key。
该public key需要给到托管Git repository的。例如,在GitHub 创建一个SSH deploy key在repository之中,把这个public key给相应的参数。
该 flux
logs将显示连接到的 repository以及正在同步的cluster。
当使用Kubernetes,该key作为 Kubernetes secret而存储。你可以重新启动flux
,将能够继续使用同样的key。
2. 指定使用的key
从private key创建Kubernetes Secret:
kubectl create secret generic flux-git-deploy --from-file /path/to/identity
现在该secret 到 flux-deployment.yaml
manifest文件中:
...
spec:
volumes:
- name: git-key
secret:
secretName: flux-git-deploy
然后为容器添加 volume mount:
...
spec:
containers:
- name: fluxd
volumeMounts:
- name: git-key
mountPath: /etc/fluxd/ssh
可以通过参数来定制选择的key的paths 和 names (examples使用缺省值),分别为:--k8s-secret-name=flux-git-deploy
, --k8s-secret-volume-mount-path=/etc/fluxd/ssh
以及 --k8s-secret-data-key=identity。
使用 SSH key 允许你维持对 repository的控制。你可以任何时候收回flux对该 repository的控制,通过移除该 deploy key即可。