极狐GitLab Runner Kubernetes(k8s)配置

2024-03-06 15:20

本文主要是介绍极狐GitLab Runner Kubernetes(k8s)配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。

资料

  1. Kubernetes

  2. 高级配置

  3. 添加额外主机别名

  4. Pod 的 DNS 配置

  5. 极狐GitLab Runner 的 Kubernetes 执行器

  6. Docker 执行器

  7. 通过特权模式使用 Docker-in-Docker

  8. 极狐GitLab CI/CD Services

说明

  1. 极狐GitLab Runner 注册到 极狐GitLab 的操作请参见上面章节中的 CentOS 安装 GitLab Runner, 只需要将流水线的执行器设置成kubernetes即可,然后执行流水线,会出现问题,按照下方内容去解决
  2. 本文采用遇见什么错误,增加对应的配置来介绍 GitLab Runner、Kubernetes 的配置

配置

  1. 运行流水线,出现问题

    Using Kubernetes namespace: default
    ERROR: Preparation failed: getting Kubernetes config: 
    invalid configuration: 
    no configuration has been provided, 
    try setting KUBERNETES_MASTER environment variable
    

    原因:k8s地址未配置 修改文件

    vim /etc/gitlab-runner/config.toml
    

    修改对应流水线的配置内容如下

    [runners.kubernetes]# k8s 地址host = "https://192.168.80.130:6443"
    
  2. 运行流水线,出现问题

    ERROR: Job failed (system failure): 
    prepare environment: setting up credentials: 
    Post "https://192.168.61.139:6443/api/v1/namespaces/default/secrets": 
    x509: certificate signed by unknown authority. 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:k8s证书未配置 修改文件

    vim /etc/gitlab-runner/config.toml
    

    修改对应流水线的配置内容如下

    [runners.kubernetes]# k8s 证书ca_file = "/etc/kubernetes/pki/ca.crt"
    
  3. 运行流水线,出现问题

    ERROR: Job failed (system failure): 
    prepare environment: setting up credentials: secrets is forbidden: 
    User "system:anonymous" cannot create resource "secrets" in API group "" in the namespace "default". 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:k8s账户未配置 修改文件

    vim /etc/gitlab-runner/config.toml
    

    修改对应流水线的配置内容如下

    [runners.kubernetes]# service 账户配置# 设置 服务授权的名称service_account = "gitlab-runner"bearer_token = "先随便写一个"bearer_token_overwrite_allowed = true
    
  4. 运行流水线,出现问题

    ERROR: Job failed (system failure): 
    prepare environment: setting up credentials: Unauthorized. 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:k8s凭证不正确,需要:创建命名空间、创建角色、创建服务账户并授权命名空间、创建服务账户在命名空间的token 修改文件

    vim /etc/gitlab-runner/config.toml
    

    修改对应流水线的配置内容如下

    # 创建命名空间
    kubectl create namespace gitlab# 创建角色 gitlab-runner 前,要求命名空间 gitlab 必须存在cat > role.yaml << EOFapiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:name: gitlab-runnernamespace: gitlab
    rules:- apiGroups: ["*"]resources: ["pods"]verbs: ["list", "get", "watch", "create", "delete"]- apiGroups: ["*"]resources: ["pods/exec"]verbs: ["create"]- apiGroups: ["*"]resources: ["pods/log"]verbs: ["get"]- apiGroups: ["*"]resources: ["pods/attach"]verbs: ["list", "get", "create", "delete", "update"]- apiGroups: ["*"]resources: ["secrets"]verbs: ["list", "get", "create", "delete", "update"]      - apiGroups: ["*"]resources: ["configmaps"]verbs: ["list", "get", "create", "delete", "update"]EOFcat role.yamlkubectl apply -f role.yaml# 命名空间授权
    kubectl create serviceaccount gitlab-runner -n gitlab# 创建用户操作命名空间的Token,指定有效时间,单位是秒,315360000s代表10年
    kubectl create token gitlab-runner -n gitlab --duration=315360000svim /etc/gitlab-runner/config.toml[runners.kubernetes]# service 账户配置# 设置 服务授权的名称service_account = "gitlab-runner"bearer_token = "填写上述生成的token"
    
  5. 运行流水线,出现问题

    ERROR: Job failed (system failure): 
    prepare environment: setting up credentials: 
    secrets is forbidden: User "system:serviceaccount:gitlab:gitlab-runner" cannot create resource "secrets" in API group "" in the namespace "default". 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:要设置上述创建的命名空间 修改文件

    vim /etc/gitlab-runner/config.toml
    

    修改对应流水线的配置内容如下

    [runners.kubernetes]namespace = "gitlab"
    
  6. 运行流水线,出现问题

    ERROR: Job failed (system failure): 
    prepare environment: setting up credentials: 
    secrets is forbidden: User "system:serviceaccount:gitlab:gitlab-runner" cannot create resource "secrets" in API group "" in the namespace "gitlab". 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:创建角色绑定,将角色极狐gitlab-runner、命名空间极狐gitlab设置服务账户gitlab:gitlab-runner并命名为极狐gitlab-runner

    修改对应流水线的配置内容如下

    kubectl create rolebinding gitlab-runner --namespace=gitlab --role=gitlab-runner --serviceaccount=gitlab:gitlab-runner
    
  7. 运行流水线,出现问题

    WARNING: Failed to pull image with policy "": 
    image pull failed: rpc error: 
    code = Unknown 
    desc = failed to pull and unpack image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": 
    failed to resolve reference "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": 
    failed to do request: Head "https://registry.gitlab.com/v2/gitlab-org/gitlab-runner/gitlab-runner-helper/manifests/x86_64-7178588d": 
    dial tcp 35.227.35.254:443: connect: connection refused
    ERROR: Job failed: prepare environment: 
    waiting for pod running: 
    pulling image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": 
    image pull failed: rpc error: 
    code = Unknown 
    desc = failed to pull and unpack image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": 
    failed to resolve reference "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7178588d": 
    failed to do request: Head "https://registry.gitlab.com/v2/gitlab-org/gitlab-runner/gitlab-runner-helper/manifests/x86_64-7178588d": 
    dial tcp 35.227.35.254:443: connect: connection refused. 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:下载极狐gitlab-runner-helper失败,需要手动上设置helper_image 修改文件

    vim /etc/gitlab-runner/config.toml
    

    修改对应流水线的配置内容如下

    # 选择适合的gitlab-runner-helper版本[runners.kubernetes]# helper_image="gitlab/gitlab-runner-helper:x86_64-${CI_RUNNER_REVISION}"# 由于 gitlab 将 gitlab-runner-helper 发布到 hub.docker.com 的时间较慢,可以会用 bitnami/gitlab-runner-helper# 也可以使用 xuxiaoweicomcn/gitlab-runner-helper:所有镜像均为 registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper 中拉取并上传的,未做任何修改# bitnami/gitlab-runner-helper:15.6.1helper_image = "gitlab/gitlab-runner-helper:x86_64-v14.10.2"
    
  8. 运行流水线,出现问题

    ERROR: Job failed (system failure): 
    prepare environment: waiting for pod running: 
    timed out waiting for pod to start. 
    Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
    

    原因:创建 pod 时需要 helper_image,但是拉取超时,可手动拉取 helper_image;拉取流水线所用的镜像超时,可手动拉取

    # 执行过程可使用 kubectl -n gitlab describe pod pod的名称,查看状态,pod的名称可在流水线中看到
    ctr -n=k8s.io image pull docker.io/gitlab/gitlab-runner-helper:x86_64-v14.10.2
    # ctr -n=k8s.io image pull docker.io/bitnami/gitlab-runner-helper:15.6.1
    # 也可以使用 xuxiaoweicomcn/gitlab-runner-helper:所有镜像均为 registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper 中拉取并上传的,未做任何修改# 假如流水线使用的镜像是 node:16.0.0
    ctr -n=k8s.io image pull docker.io/node:16.0.0ctr -n=k8s.io image list
    
  9. 如果要在 k8s 中使用 Docker,方案如下:

    1. 方案 1(不推荐): 在 k8s 各节点上安装 docker,并设置 docker 开机,流水线运行时挂载 docker.sock,需要在 GitLab Runner 中配置如下,详情参见: 极狐GitLab Runner、Kubernetes(k8s)配置

      [[runners]]...[runners.kubernetes]...[runners.kubernetes.volumes][[runners.kubernetes.volumes.host_path]]name = "docker"mount_path = "/var/run/docker.sock"host_path = "/var/run/docker.sock"
      
    2. 方案 2(推荐): 以特权身份运行流水线, 极狐GitLab CI/CD Services 中文文档, 需要在极狐 GitLab Runner 中配置如下:

      [[runners]]...[runners.kubernetes]...privileged = true
      

      使用 docker.sock 端口 示例

      stages:# 阶段名称:构建- build# job 名称
      build:# 阶段名称stage: build# 环境变量variables:# maven 环境变量MAVEN_OPTS: >--Dhttps.protocols=TLSv1.2-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository-Dorg.slf4j.simpleLogger.showDateTime=true-Djava.awt.headless=true# 颜色定义COLOR_BLUE: \033[34mCOLOR_GREEN: \033[92mCOLOR_RED: \033[31mCOLOR_RESET: \033[0mCOLOR_YELLOW: \033[93m# 镜像image: maven:3.6.3-openjdk-17# 使用的服务# 如果是基于 k8s 运行流水线,请以特权身份运行(在 /etc/gitlab-runner/config.toml 中配置 privileged = true),否则无法使用 services# 由于要访问域名 nexus.xuxiaowei.cn、pig.docker.xuxiaowei.cn,所以在 /etc/gitlab-runner/config.toml 中配置了对应的 runners.kubernetes.host_aliasesservices:# 使用 docker 服务,用于构建 docker 镜像- name: docker:dind# 服务别名alias: docker-dindvariables:# 关闭 TLS(仅使用 http)DOCKER_TLS_CERTDIR: ""# docker 镜像发布域名 pig.docker.xuxiaowei.cn(仅作者局域网可以访问)# 默认情况下域名 pig.docker.xuxiaowei.cn 证书可能不受信任(可能是非权威机构颁发的证书,也可能是容器镜像无法识别权威机构颁发的域名证书)# 信任域名证书command: [ "--insecure-registry=pig.docker.xuxiaowei.cn" ]# 执行脚本前的任务before_script:# 此处使用 http 而非 https,因为 https 证书可能不受信任(可能是非权威机构颁发的证书,也可能是容器镜像无法识别权威机构颁发的域名证书)# 下载的 settings-private.xml 配置文件里使用的也是 http 协议- echo -e $COLOR_BLUE'下载作者 Maven 私库配置文件(仅作者局域网可用)'$COLOR_RESET && curl -o settings-private.xml http://nexus.xuxiaowei.cn/repository/raw-hosted/maven/settings-private.xml- echo -e $COLOR_BLUE'查看作者 Maven 私库配置文件'$COLOR_RESET && cat settings-private.xml# 执行脚本script:- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 jar 包'$COLOR_RESET && mvn clean -U install -s settings-private.xml- echo -e $COLOR_BLUE'将所有 *.xml 文件中的 <image> <name> 标签增加 CI_PIPELINE_ID 变量,CI_PIPELINE_ID 变量代表 流水线ID'$COLOR_RESET- find . -type f -name "*.xml" -exec sed -i 's|<name>${docker.registry}/${docker.namespace}/${project.name}:${project.version}</name>|<name>${docker.registry}/${docker.namespace}/${project.name}:${project.version}-${CI_PIPELINE_ID}</name>|g' {} +- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-auth docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-auth docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-gateway docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-gateway docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-upms/pig-upms-biz docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-upms/pig-upms-biz docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-visual/pig-codegen docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-visual/pig-codegen docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-visual/pig-monitor docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-visual/pig-monitor docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-visual/pig-quartz docker:build -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD- echo -e $COLOR_BLUE'使用作者 Maven 私库配置文件构建 docker 镜像'$COLOR_RESET && mvn -pl pig-visual/pig-quartz docker:push -s settings-private.xml -Ddocker.host=$DOCKER_HOST -Ddocker.registry=$DOCKER_REGISTRY -Ddocker.username=$DOCKER_USERNAME -Ddocker.password=$DOCKER_PASSWORD# 缓存cache:# 缓存名称# 使用 job 名称key: "${CI_JOB_NAME}"# 缓存路径paths:- .m2/repository# 流水线标签:选择可执行流水线的机器tags:- plugin-kubernetes# 触发条件:触发流水线执行的条件only:# 仅在 xuxiaowei/k8s 分支上执行- xuxiaowei/k8s
      

问题

  1. 如果克隆镜像时无法解析极狐 GitLab 的域名,可以在极狐 GitLab Runner 中自定义域名的IP(其他自定义域名同理)

    vim /etc/gitlab-runner/config.toml
    
    [[runners]]...[runners.kubernetes][[runners.kubernetes.host_aliases]]# 自定义 GitLab 的 IPip = "192.168.80.14"hostnames = ["gitlab.example.com"][[runners.kubernetes.host_aliases]]# 自定义 Docker host 的 IPip = "192.168.80.33"hostnames = ["host.docker.example.xuxiaowei.cloud"][[runners.kubernetes.host_aliases]]# 自定义 Docker 私库的 IPip = "192.168.80.45"hostnames = ["registry.docker.example.xuxiaowei.cloud"]
    

    更多关于极狐GitLab 的最佳实践,请搜索关注【极狐GitLab】公众号或者登录极狐GitLab 官网 https://gitlab.cn 进行学习。

这篇关于极狐GitLab Runner Kubernetes(k8s)配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780485

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实