1、从Kubernetes获取ServiceAccount token
Service Account 是 Kubernetes 用于集群内运行的程序,进行服务发现时调用 API 的帐号,帐号的 token 会直接挂载到 Pod 中,可以供程序直接使用,ServiceAccount给运行在Pod中的进程提供一个身份
如果kubernetes开启了ServiceAccount,那么会在每个namespace下面都会创建一个默认的default的sa。我这里使用的是默认的default。
步骤:
(1)登录到kubernetes集群中,使用命令
kubectl get -n uase-iot-dev secret
uase-iot-dev是你的命名空间
然后使用kubectl get -n uase-iot-dev secret default-token-v0jdt -o yaml
查看拿到token,但是这个token是经过base64加密过的,所以要将token解密
echo token | base64 -d
将解密结果保存好,后续会用到
2、获得Kubernetes CA证书
登录kubernetes集群,在/etc/kubernetes/pki目录下,有一个ca.crt文件就是kubernetes的证书
证书格式如下:
-----BEGIN CERTIFICATE-----
[REDACATED]
-----END CERTIFICATE-----
3、在gitlab中集成kubernetes
登录gitlab,选择你的项目,在左侧选择Settings下的Integrations,往下拉找到kubernetes,点击进入
然后输入以下:
API URL:kubernetes集群的API URL, kubernetes API Server公网地址
CA Certificate:kubernetes的CA证书
Project namespace (optional/unique):kubernetes的命名空间
Token:之前获取到的token,base64解码后的
然后save changes即可
4、添加.gitlab-ci.yml到项目中
在项目根目录下添加.gitlab-ci.yml配置文件,这个文件就是写自动化部署的脚本,包含打jar包、打镜像、自动部署到kubernetes
在deploy-huang-test阶段,image是registry.gitlab.com/gitlab-examples/kubernetes-deploy的镜像,上图中是我们把它拉下来上传到我们的私服中的
配置文件中的${}都是在gitlab中配置的,在Setting下的CI/CD中的Secret variables
5、给service account授权
我们使用的service account是默认的default,它默认是没有任何权限的,我们需要给他授权,不然会报如下错误:
Error from server (Forbidden)
授权步骤:
登录kubernetes集群,执行如下命令:
kubectl create rolebinding default-edit --clusterrole=edit --serviceaccount=uase-iot-dev:default --namespace=uase-iot-dev
uase-iot-dev是你的命名空间
这样default就有权限去执行我们的部署脚本了
最后运行结果如下:
6、碰到的错误
(1)Unable to connect to the server: x509: certificate signed by unknown authority
我碰到这个错误是因为证书弄错了,我使用的证书是前面获取token里有的ca证书,所以报了这个错。正确的证书是在/etc/kubernetes/pki目录下的ca.crt。
(2)Error from server (Forbidden): error when creating "gitlabci/deployment.yml": User "system:serviceaccount:uase-iot-dev:default"
这个错误是因为没有给default授权