在通过gitlab-ci部署应用到k8s集群的过程中,报了下面的错误

failed to query with labels: secrets is forbidden: User “system:serviceaccount:cicd:default” cannot list resource “secrets” in API group “” in the namespace “front” helm.go:81: [debug] secrets is forbidden: User “system:serviceaccount:cicd:default” cannot list resource “secrets” in API group “” in the namespace “front”

image.png

原因:

Kubernetes 使用 API 服务器对 API 请求进行鉴权。 它根据所有策略评估所有请求属性来决定允许或拒绝请求。 一个 API 请求的所有部分都必须被某些策略允许才能继续。 这意味着默认情况下拒绝权限。
当我们在k8s集群外对集群进行API请求时,需要经过k8s的鉴权,通过才能进行变更操作。

解决方案

当我们使用helm对k8s集群进行操作时,可能使用helm v2或v3版本。

helm v2版本

1、安装helm客户端

ref:https://v2.helm.sh/docs/using_helm/

Helm由客户端命helm令行工具和服务端tiller组成,Helm的安装十分简单。
下载helm命令行工具到master节点node1的/usr/local/bin下,这里下载的v2.11.0版本,

  1. wget wget https://get.helm.sh/helm-v2.11.0-linux-amd64.tar.gz
  2. tar -zxvf helm-v2.11.0-linux-amd64.tar.gz
  3. cd linux-amd64/
  4. cp helm /usr/local/bin/
  5. #查询安装版本
  6. $ helm version
  7. Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
  8. Error: could not find tiller

2、创建tiller账户

kubectl create serviceaccount --namespace kube-system tiller

3、给用户tiller用户授予集群超级管理员权限

kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

4、安装helm 服务端tiller并绑定账户tiller

安装Tiller的最简单方式是helm init, 该命令会检查helm本地环境设置是否正确,helm init会连接kubectl默认连接的kubernetes集群(可以通过kubectl config view查看),一旦连接集群成功,tiller会被安装到kube-system namespace中。

但是,在国内环境中,我们直接使用helm init会无法拉取到tiller镜像,需要手动指定镜像地址,同时如果Kubernetes集群开启了rbac,还需要指定运行tiller的servicaccount,并为该serviceaccount作合适的授权。

#检查tiller服务是否安装
kubectl get pod -n kube-system -l app=tiller

#若您已经在k8s部署了tiller,而仍然没有权限在集群外调用API操作集群,则只需要执行
helm init  --client-only

kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

---------------------------------------
#如果没有安装,执行下面命令安装
helm init --service-account tiller --upgrade --tiller-image=registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0

注意:
2019 年 8 月 27 日,helm init 命令已经从helm 3版本后移除,不再支持 #ref:https://helm.sh/blog/helm-v3-beta/,如果你的helm 版本是3.0+的,恐怕这里不能init成功。

“Tiller has been removed. This simplifies the experience of using Helm. There is no more need to have cluster admin privileges or to install a Tiller in every namespace. With Tiller removed, Helm now uses the settings and access defined in the local kubeconfig file.”

官网解释为了提高helm使用感受,不再使用helm服务端tiller,而使用local kubeconfig file 来进行权限控制。

helm v3版本

1、提取集群的 Kube 配置

从k8s集群中获取的连接集群信息
image.png

2、添加变量

添加项目变量

Project -> Settings -> CI/CD -> Variables

添加全局变量

Admin Area ->Settings -> CI/CD -> Variables

image.png
kube连接信息可以存为File或者Variable,变量名随意取名

3、修改项目.gitlab-ci.yml配置

......
image:
    name: aliartiza75/kubectl:0.0.2

before_script:
- mkdir ~/.kube/
- echo $KUBE_CONFIG | base64 -d > config    #KUBE_CONFIG变量这里存为Variable,默认为base64加密。
- mv config ~/.kube/

stages:
- deploy

deploy:
stage: deploy
script:
    - kubectl get namespaces
......  

当我们把KUBE_CONFIG变量存为文件时。
......
image:
    name: aliartiza75/kubectl:0.0.2

before_script:
- mkdir -p ~/.kube && cp ${KUBECONFIG} ~/.kube/config

stages:
- deploy

deploy:
stage: deploy
script:
    - kubectl get namespaces
......

有时候虽然我们可能会遇到虽然设置了变量,但是.gitlab-ci.yaml文件中读取不到,在情况允许的情况下,我们可以把KUBECONFIG文件放到仓库里或者其他地方下载下来也可以的。

经过上面的配置以后,重新部署即可。