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

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes (k8s) 是一种流行的容器编排平台,可以大大简化应用程序的部署和管理。CI/CD(持续集成/持续交付)管道是软件开发过程中的关键环节,可以将代码从开发到部署的流程自动化和加速。在 k8s 上部署 CI/CD 管道的步骤如下: 1. 创建代码仓库。您可以使用 Git 或其他版本控制工具。确保您的代码仓库可以与 CI/CD 工具集成。 2. 配置 CI 工具。这可以是 Jenkins、GitLab CICircleCI 等等。您需要将 CI 工具配置为从代码仓库拉取代码,并将其构建为容器镜像。确保您的 CI 工具可以与 Kubernetes 集群通信。 3. 配置 Docker Registry。您需要一个 Docker Registry 来存储构建的容器镜像,以便它们可以在 Kubernetes 集群中使用。您可以使用 Docker Hub、Google Container Registry、AWS ECR 等等。 4. 创建 Kubernetes 资源定义文件。这些文件告诉 Kubernetes 如何部署和管理您的应用程序。确保您的资源定义文件包含必要的配置和环境变量,以及指向您的 Docker Registry 的正确信息。 5. 部署应用程序。使用 kubectl 工具将 Kubernetes 资源定义文件应用于 Kubernetes 集群。 6. 配置 CD 工具。这可以是 Helm、Spinnaker、Argo CD 等等。您需要将 CD 工具配置为从 Docker Registry 拉取构建的容器镜像,并将其部署到 Kubernetes 集群。确保您的 CD 工具可以与 Kubernetes 集群通信。 7. 自动化部署使用 CD 工具将新版本的应用程序自动部署到 Kubernetes 集群中。 总的来说,上述步骤是一个基本的 CI/CD 管道部署过程。当然,具体实现方式会因不同的应用程序和工具而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值