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

相关推荐
❀͜͡傀儡师18 分钟前
如何使用k8s安装redis呢
redis·容器·kubernetes
云道轩8 小时前
llm-d:面向Kubernetes的高性能分布式LLM推理框架
分布式·容器·kubernetes
徐传良11 小时前
03.搭建K8S集群
云原生·容器·kubernetes
Ares-Wang12 小时前
kubernetes》》k8s》》kubectl proxy 命令后面加一个&
云原生·容器·kubernetes
藥瓿亭15 小时前
2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志
linux·运维·docker·云原生·容器·kubernetes·cka
探索云原生18 小时前
开源 vGPU 方案:HAMi,实现细粒度 GPU 切分
ai·云原生·kubernetes·gpu
斯普信云原生组19 小时前
K8S主机漏洞扫描时检测到kube-服务目标SSL证书已过期漏洞的一种永久性修复方法
https·kubernetes·ssl
头疼的程序员1 天前
Jenkins的学习与使用(CI/CD)
ci/cd·jenkins
试剂界的爱马仕1 天前
软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码
网络·人工智能·科技·机器学习·ci/cd·ai写作
用户26834842239592 天前
前端搭建 CI/CD 工作流指南
前端·ci/cd