使用GitLab自带的CI/CD功能在K8S集群里部署项目(四)

前置内容:

通过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集群环境其实没那么复杂,大家可以去我主页找相关教程学习一下,多动手实验。

相关推荐
aherhuo5 小时前
kubevirt网络
linux·云原生·容器·kubernetes
只会copy的搬运工6 小时前
Jenkins 持续集成部署——Jenkins实战与运维(1)
运维·ci/cd·jenkins
catoop6 小时前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
liuxuzxx7 小时前
1.24.1-Istio安装
kubernetes·istio·service mesh
道一云黑板报8 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes
运维小文8 小时前
K8S中的PV、PVC介绍和使用
docker·云原生·容器·kubernetes·存储
tingkeiii8 小时前
gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘
gitlab
ζั͡山 ั͡有扶苏 ั͡✾9 小时前
Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
云原生·容器·kubernetes
Hadoop_Liang9 小时前
Kubernetes ConfigMap的创建与使用
云原生·容器·kubernetes
dami_king13 小时前
项目开源能够带来什么?从中得到了什么?
开源·gitlab·github