前置内容:
通过Docker Compose部署GitLab和GitLab Runner(一)
使用GitLab自带的CI/CD功能在本地部署项目(二)
使用GitLab自带的CI/CD功能在远程服务器部署项目(三)
一、K8S集群信息
节点名称 | IP |
Master | 192.168.184.130 |
Worker01 | 192.168.184.131 |
Worker02 | 192.168.184.132 |
在Master节点上创建eshop命名空间:
kubectl create namespace eshop
二、将公钥拷贝到K8S集群的Master节点上
在GitLab服务器上执行以下命令将公钥拷贝到K8S集群的Master节点上:
scp /root/.ssh/id_rsa.pub root@192.168.184.130:/root/.ssh/id_rsa_gitlab.pub
在K8S集群的Master节点执行以下命令,将GitLab服务器的公钥内容写入authorized_keys文件
cat /root/.ssh/id_rsa_gitlab.pub >> /root/.ssh/authorized_keys
在GitLab服务器上执行以下命令,可以看到不用输入用户名密码就可以登录到K8S集群的Master节点了
ssh 192.168.184.130
三、更新SSH_KNOWN_HOSTS变量值
获取K8S集群Master节点的公钥,并更新到全局的CI/CD变量SSH_KNOWN_HOSTS中。
在GitLab服务器上使用以下命令收集K8S集群Master节点(IP:192.168.184.130)公钥相关内容,并复制它们:
ssh-keyscan 192.168.184.130
在GitLab页面上,通过 【Admin Area → Settings → CI/CD → Variables → Expand 】菜单路径,找到SSH_KNOWN_HOSTS全局变量所在行,点击“编辑”图标,如图所示:
将复制的ssh-keyscan生成内容追加到原内容后面,然后一定要按回车符,添加新行,如图所示:
四、将K8S集群Master节点IP设置成CI/CD全局变量
在GitLab页面上,通过 【Admin Area → Settings → CI/CD → Variables → Expand → Add Variable】菜单路径,添加后的结果如图所示:
五、编写.gitlab-ci.yml文件
重新修改上一篇文章介绍的使用.Net8开发的EShop.WebApi项目的.gitlab-ci.yml文件内容,如下:
stages:
- build
- deploy
variables:
## 镜像版本号
Docker_ImageTag: "latest"
## 镜像名称
Docker_Image: "eshop.webapi:$Docker_ImageTag"
## 阿里云镜像名称
Ali_Docker_Image: "$Ali_Docker_Registry/eshop/$Docker_Image"
build:
stage: build
script:
## 构建镜像
- docker build -f "./EShop.WebApi/Dockerfile" -t $Docker_Image .
## 将镜像标记为阿里云镜像名称
- docker tag $Docker_Image $Ali_Docker_Image
## 登录阿里云私人镜像仓库
- docker login -u $Ali_Docker_UserName --password "$Ali_Docker_Password" $Ali_Docker_Registry
## 将镜像推送到阿里云镜像仓库
- docker push $Ali_Docker_Image
only:
- main
deploy:
stage: deploy
before_script:
## 安装ssh-agent
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
## 将GitLab服务器私钥添加到ssh-agent代理中
- chmod 400 "$SSH_PRIVATE_KEY"
- ssh-add "$SSH_PRIVATE_KEY"
## 创建~/.ssh目录
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
## 创建SSH_KNOWN_HOSTS
- cp "$SSH_KNOWN_HOSTS" ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
## 使用ssh免密登录K8S集群,执行部署eshop.webapi服务脚本命令
- ssh -t $K8S_Master_IP "cd /opt/eshop/ && kubectl apply -f eshop.webapi.yaml"
only:
- main
在.gitlab-ci.yml文件中我们通过ssh登录到K8S集群Master节点,然后使用kubectl命令进行部署,这里的eshop.webapi.yaml文件内容如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: eshop-webapi
name: eshop-webapi
namespace: eshop
spec:
replicas: 2
selector:
# Deployment会匹配与这里设置的相同标签内容的pod
matchLabels:
app: eshop-webapi
# pod的模板描述
template:
metadata:
#定义pod的标签
labels:
app: eshop-webapi
spec:
containers:
- image: 'registry.cn-qingdao.aliyuncs.com/eshop/eshop.webapi:latest'
name: eshop-webapi
ports:
- containerPort: 8080
imagePullSecrets:
- name: aliyun
---
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-eshop-webapi
name: svc-eshop-webapi
namespace: eshop
spec:
selector:
#选择指定标签的Deployment
app: eshop-webapi
#注意指定type为NodePort
type: NodePort
ports:
- port: 8000
protocol: TCP
targetPort: 8080
#指定暴露的端口号,不设置就默认随机一个
#nodePort: 31234
因为我用的是阿里云私有镜像,所以文件中使用到了k8s的secret对象,其保存了阿里云仓库用户名密码等信息,其创建命令如下:
kubectl create secret docker-registry aliyun --docker-server=https://registry.cn-qingdao.aliyuncs.com --docker-username=xxxx --docker-password=xxxxx --docker-email=xxxxx -n eshop
六、验证
在GitLab的EShopWebApi仓库页面查看Pipeline的Job执行结果,可以看到kubectl apply命令已经执行成功:
在K8S Master节点上查看eshop-webapi服务暴露的端口信息:
在浏览器中输入master节点IP和端口信息,访问接口地址:http://192.168.184.130:31644/WeatherForecast,可以看到返回的信息:
至此,通过GitLab自带的CI/CD实现应用部署到K8S集群大功告成!
七、总结
本地搭建K8S集群环境其实没那么复杂,大家可以去我主页找相关教程学习一下,多动手实验。