22.云原生之GitLab CICD实战及解析【干货】

云原生专栏大纲

文章目录

  • 准备工作
  • gitlab-ci.yml流水线
      • mven打包项目
      • 制作并推送镜像
        • kaniko方式
        • docker方式
      • 部署到k8s
      • 验证执行情况
  • GitLab Runner k8s执行器工作流程
  • 注册配置kubernetes runner
    • kubernetes runner配置
      • 通过修改 Pod 规范为每个构建作业创建一个 PVC
      • 自定义卷装载
      • 持久性并发构建卷
      • 为容器设置安全策略
      • 设置拉取策略
      • 配置 Pod DNS 设置
    • kubesphere应用仓库中部署
      • 部署细节
        • 启动命令
        • 环境变量
        • 挂载情况
          • config.toml
          • /configmaps 目录
          • /secrets
      • runner 默认配置问题
      • 最后生成config.toml 配置如下

准备工作

  1. 安装gitlab
  2. 安装配置gitlab-runner,参考本章节 《注册配置kubernetes runner》
  3. 登录gitlab配置需安全保护全局变量,如kube_config、harbor账号密码等。

image.png

gitlab-ci.yml流水线

可参考官网GitLab CI/CD examples | 预定义的 CI/CD 变量参考

CICD流程:

  1. 使用maven打包项目
  2. 制作docker镜像
  3. 推送镜像到harbor仓库
  4. 部署到k8s

mven打包项目

variables:MAVEN_OPTS: >--Dmaven.repo.local=/builds/maven #maven下载文件路径-Dorg.slf4j.simpleLogger.showDateTime=true-Djava.awt.headless=trueMAVEN_CLI_OPTS: >---batch-mode--errors--fail-at-end--show-version--no-transfer-progress-DinstallAtEnd=true-DdeployAtEnd=truepackage:stage: packageimage: maven:3.6.3-jdk-8tags:- k8sscript:- pwd- mvn clean package -Dmaven.test.skip=true# 将打包后target拷贝到指定目录- rm -rf /builds/project-target/devops-web- rm -rf /builds/project-target/devops-service# 将打包后制品拷贝到同一目录进行管理- cp -rf ./devops-web /builds/project-target/devops-web- cp -rf ./devops-service /builds/project-target/devops-service

制作并推送镜像

kaniko方式
build:stage: buildimage:name: registry.cn-hongkong.aliyuncs.com/cmi/kaniko-project_executor:debugentrypoint: [""]tags:- k8sscript:- /kaniko/executor--skip-tls-verify--insecure--context "${CI_PROJECT_DIR}"--dockerfile "/devops-web/Dockerfile"--destination "harbor.yxym.com/library/devops-web:kaniko"except:- tags
docker方式
docker-build:
#  image: docker:latestimage: docker:cliservices:- docker:dindstage: buildscript:- docker login -u admin -p Harbor12345 harbor域名- cd /builds/project-target- docker build -t devops-web:dind -f ./devops-web/Dockerfile  ./devops-web/- docker tag devops-web:dind harbor域名/library/devops-web:dind- docker push harbor域名/library/devops-web:dind

部署到k8s

deploy:image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/kubectl:1.16.6stage: deploytags:- k8sscript:- mkdir -p /etc/deploy# 该命令配置kube_config,用于获取k8s命令操作权限- echo $kube_config |base64 -d > $KUBECONFIG- kubectl apply -f /builds/project-target/devops-web/deploy.yml

验证执行情况

  1. 登录gitlab查看流水线:
    image.png

  2. 登录harbor查看镜像是否推送到仓库
    image.png

  3. 登录kubesphere查看部署情况
    在这里插入图片描述

GitLab Runner k8s执行器工作流程

image.png
在 GitLab Runner 中使用 Kubernetes (k8s) 执行器时,以下是其工作流程的一般概述:

  1. 配置 Kubernetes 集群:首先,你需要在 GitLab Runner 所在的机器上配置和连接到 Kubernetes 集群。这包括安装和配置 kubectl 命令行工具,并确保 Runner 具有访问 Kubernetes 集群的权限。
  2. 注册 Runner:使用 gitlab-runner register 命令注册一个新的 Runner,选择 kubernetes 作为执行器。在注册过程中,你需要提供 GitLab 实例的 URL、Runner 的描述、Kubernetes 集群的相关配置等信息。
  3. 配置 Runner:完成注册后,GitLab Runner 将生成一个配置文件,其中包含与 Kubernetes 执行器相关的配置信息,例如 Kubernetes API 的地址、访问凭证等。这些配置将被保存在 Runner 的配置目录中。
  4. 运行作业:当有作业需要执行时,GitLab CI/CD 将向 GitLab Runner 发送作业请求。Runner 将根据作业的定义和配置,使用 Kubernetes API 向 Kubernetes 集群提交一个 Pod 规范,描述作业的运行环境和要运行的容器。
  5. 创建 Pod:Kubernetes 集群接收到 Runner 提交的 Pod 规范后,将根据规范创建一个 Pod。Pod 是 Kubernetes 中的最小调度单位,可以包含一个或多个容器。
  6. 容器运行:一旦 Pod 创建成功,Kubernetes 将根据 Pod 规范在集群中选择一个合适的节点,并在该节点上创建和运行容器。容器将根据作业定义的镜像和命令来执行相应的操作,例如构建、测试或部署。
  7. 监听作业状态:GitLab Runner 会定期查询 Kubernetes API 来获取作业的状态信息。这包括容器的运行状态、日志输出等。Runner 将这些信息返回给 GitLab CI/CD,以便实时监控作业的进度和结果。
  8. 提交结果:作业完成后,GitLab Runner 将收集作业的结果,包括日志输出、环境变量等,并将其提交给 GitLab CI/CD。这些结果将在 GitLab CI/CD 界面上显示,并可以用于后续的流程控制和报告生成。
  9. 清理资源:一旦作业完成,Kubernetes 将根据配置自动清理相关的 Pod 和容器。这确保了资源的有效使用和释放。

通过将 GitLab Runner 与 Kubernetes 执行器结合使用,你可以在 Kubernetes 集群中动态地创建和管理容器化的作业环境,实现高度可扩展的持续集成和持续交付流程。

注册配置kubernetes runner

注册器kubernetes 的gitlab runner,使用参考Kubernetes executor官网。Executors | GitLab
执行器 | 极狐GitLab
helm方式部署优势:

  1. 省去了注册kubernetes执行器很多细节,kubernetes执行器是最复杂的一个

helm方式部署缺点:

  1. helm方式部署的github-runner使用了特定的镜像,启动后很多目录用户没有操作权限
  2. 该镜像不能以特权用户启动
  3. 配置挂载路径和gitlab官网使用镜像挂载路径存在区别

kubernetes runner配置

通过修改 Pod 规范为每个构建作业创建一个 PVC

若要为每个生成作业创建 PersistentVolumeClaim,请确保查看如何启用 Pod Spec 功能。

Kubernetes 允许创建一个附加到 Pod 生命周期的临时 PersistentVolumeClaim。 如果在 Kubernetes 集群上启用了动态预配,这将起作用,允许 每个请求一个新的卷,该卷也将与 Pod 的生命周期相关联。PVC

启用动态配置后,可以按如下方式修改:

[[runners.kubernetes.pod_spec]]name = "ephemeral-pvc"patch = '''containers:- name: buildvolumeMounts:- name: buildsmountPath: /builds- name: helpervolumeMounts:- name: buildsmountPath: /buildsvolumes:- name: buildsephemeral:volumeClaimTemplate:spec:storageClassName: <The Storage Class that will dynamically provision a Volume>accessModes: [ ReadWriteOnce ]resources:requests:storage: 1Gi'''

自定义卷装载

要存储作业的 builds 目录,请定义自定义卷挂载到 已配置(默认)。 如果您使用 PVC 卷, 基于接入模式, 您可能被限制为在一个节点上运行作业。builds_dir/builds

concurrent = 4[[runners]]# usual configurationexecutor = "kubernetes"builds_dir = "/builds"[runners.kubernetes][[runners.kubernetes.volumes.empty_dir]]name = "repo"mount_path = "/builds"medium = "Memory"

持久性并发构建卷

默认情况下,Kubernetes CI 作业中的构建目录是临时的。 如果您想在作业中持久化 Git 克隆(以使其正常工作), 您必须为生成文件夹装载持久性卷声明。 由于多个作业可以同时运行,因此您必须 使用一个卷,或为每个电位设置一个卷 同一运行器上的并发作业。后者可能性能更高。

concurrent = 4[[runners]]executor = "kubernetes"builds_dir = "/mnt/builds"[runners.kubernetes][[runners.kubernetes.volumes.pvc]]# CI_CONCURRENT_ID identifies parallel jobs of the same runner.# name是pvc名称如"build-pvc-$CI_CONCURRENT_ID"name = "k8s-running-pod-data"mount_path = "/mnt/builds"

为容器设置安全策略

  • 设置 Pod 安全上下文。
  • 重写以及生成和帮助程序容器。run_as_userrun_as_group
  • 指定所有服务容器都继承 Pod 安全上下文并从 Pod 安全上下文继承。run_as_userrun_as_group
concurrent = 4
check_interval = 30[[runners]]name = "myRunner"url = "gitlab.example.com"executor = "kubernetes"[runners.kubernetes]helper_image = "gitlab-registry.example.com/helper:latest"[runners.kubernetes.pod_security_context]run_as_non_root = truerun_as_user = 59417run_as_group = 59417fs_group = 59417[runners.kubernetes.init_permissions_container_security_context]run_as_user = 1000run_as_group = 1000[runners.kubernetes.build_container_security_context]run_as_user = 65534run_as_group = 65534[runners.kubernetes.build_container_security_context.capabilities]add = ["NET_ADMIN"][runners.kubernetes.helper_container_security_context]run_as_user = 1000run_as_group = 1000[runners.kubernetes.service_container_security_context]run_as_user = 1000run_as_group = 1000
选择类型必填描述
run_as_groupint用于运行容器进程入口点的 GID。
run_as_non_root布尔指示容器必须以非 root 用户身份运行。
run_as_userint用于运行容器进程入口点的 UID。
capabilities.add字符串列表运行容器时要添加的功能。
capabilities.drop字符串列表运行容器时要删除的功能。
selinux_type字符串与容器进程关联的 SELinux 类型标签。

设置拉取策略

使用文件中的参数指定单个或多个拉取策略。 该策略控制如何提取和更新映像,并应用于生成映像、帮助程序映像和任何服务。pull_policyconfig.toml
要确定要使用的策略,请参阅有关拉取策略的 Kubernetes 文档。
对于单个拉取策略:

[runners.kubernetes]pull_policy = "never"

对于多个拉取策略:

[runners.kubernetes]# use multiple pull policiespull_policy = ["always", "if-not-present"]

当您定义多个策略时,将尝试每个策略,直到成功获取映像。 例如,当您使用 时,如果策略由于临时注册表问题而失败,则使用该策略。[ always, if-not-present ]if-not-presentalways
要重试失败的拉取,请执行以下操作:

[runners.kubernetes]pull_policy = ["always", "always"]

GitLab 的命名约定与 Kubernetes 的命名约定不同。

运行器拉取策略Kubernetes 拉取策略描述
空白空白使用 Kubernetes 指定的默认策略。
if-not-presentIfNotPresent仅当执行作业的节点上尚不存在映像时,才会拉取该映像。您应该注意一些安全注意事项
alwaysAlways每次执行作业时都会拉取映像。
neverNever永远不会拉取映像,并且要求节点已经拥有它。

配置 Pod DNS 设置

使用以下选项配置 Pod 的 DNS 设置。

选项类型必须描述
nameserversstring 列表将用作 Pod 的 DNS 服务器的 IP 地址列表
optionsKubernetesDNSConfigOption一个可选的对象列表,其中每个对象可能有一个名称参数(必需)和一个值参数(可选)
searchesstring 列表用于在 Pod 中查找主机名的 DNS 搜索域列表

config.toml 文件中的配置示例:

concurrent = 1
check_interval = 30
[[runners]]name = "myRunner"url = "https://gitlab.example.com"token = "__REDACTED__"executor = "kubernetes"[runners.kubernetes]image = "alpine:latest"[runners.kubernetes.dns_config]nameservers = ["1.2.3.4",]searches = ["ns1.svc.cluster-domain.example","my.dns.search.suffix",][[runners.kubernetes.dns_config.options]]name = "ndots"value = "2"[[runners.kubernetes.dns_config.options]]name = "edns0"

KubernetesDNSConfigOption:

选项类型必须描述
name字符串配置选项名称。
value*string配置选项值。

kubesphere应用仓库中部署

  1. 添加仓库:https://charts.gitlab.io
  2. 修改values.yml
#以下两个在gitlab页面获取
gitlabUrl: http://192.168.31.3:83 # 使用k8s内部gitlab svc地址
runnerRegistrationToken: "GR1348941EfP6qKATzEULxDtvkvAg" #gitlab-runner注册用到的tockenconcurrent: 10 #最大作业并发数
checkInterval: 30 #新作业检查间隔
tags: "k8s" #runner的标签
#rbac权限打开
rbac:create: trueresources: ["pods", "pods/exec", "secrets","configmaps"]verbs: ["get", "list", "watch", "create", "patch", "delete","update"]
runners:# 下述配置config: |
  1. 查看部署情况

在kubesphere应用仓库部署结果如下,部署到了ksnode26节点上:
image.png

  1. 使用特权模式:在创建容器时,使用–privileged参数来启动特权模式。这将使容器拥有更高的权限,并允许执行需要特权的操作。例如,使用docker run --privileged命令来启动容器。
  2. 允许特权提升:如果你不想在整个容器中启用特权模式,可以使用–cap-add参数来允许特定的权限提升。例如,使用docker run --cap-add=SYS_ADMIN命令来允许容器在运行时获取系统管理权限。
  3. 挂载可写目录:如果根目录是只读的,你可以尝试将一个可写的目录挂载到容器中,并在该目录中执行需要写入的操作。使用-v参数来挂载目录,例如,使用docker run -v /path/on/host:/path/in/container命令将主机上的目录挂载到容器中。

部署细节

部署后进入终端发现一些目录无操作权限,这是Docker容器的安全限制导致,可设置容器访问控制
image.png

启动命令
/usr/bin/dumb-init,--,/bin/bash,/configmaps/entrypoint

查看/configmaps:
image.png
这个命令是使用了/usr/bin/dumb-init作为初始进程,然后运行/bin/bash作为子进程,并将/configmaps/entrypoint作为参数传递给/bin/bash。

/usr/bin/dumb-init是一个轻量级的进程初始化器,它可以帮助正确处理子进程的信号和进程间通信。它在容器环境中经常被使用,以确保进程的正确启动和终止。

/bin/bash是一个常见的Unix和Linux系统中的命令解释器。它提供了一个交互式的命令行界面,可以运行命令和脚本,并提供了丰富的功能和工具集。

/configmaps/entrypoint是一个文件路径,它可能是一个配置映射(ConfigMap)中的入口点脚本。ConfigMap是Kubernetes中用于存储配置数据的一种资源类型。入口点脚本通常用于在容器启动时执行一些初始化操作或配置加载。

综合起来,这个命令的作用是使用dumb-init作为初始进程,启动一个bash子进程,并将/configmaps/entrypoint作为参数传递给bash。这可能是在容器环境中运行的一个脚本或配置文件的启动方式。具体的功能和目的需要查看/configmaps/entrypoint文件的内容来确定。

环境变量

image.png

CI_SERVER_URL:http://192.168.31.3:83/
RUNNER_EXECUTOR:kubernetes
REGISTER_LOCKED:true
RUNNER_TAG_LIST:k8s

挂载情况

image.png

config.toml

配置文件使用临时挂载,挂载路径/home/gitlab-runner/.gitlab-runner/config.toml,默认配置如下

concurrent = 10
check_interval = 30
log_level = "info"
shutdown_timeout = 0[session_server]session_timeout = 1800[[runners]]name = "gitlab-k8s-runner-gitlab-runner-6fff86bf78-nbjrn"url = "http://192.168.31.3:83/"id = 7token = "HxBNrMvn89soRxaKiR4v"token_obtained_at = 2024-01-24T09:31:39Ztoken_expires_at = 0001-01-01T00:00:00Zexecutor = "kubernetes"[runners.cache]MaxUploadedArchiveSize = 0[runners.kubernetes]host = ""bearer_token_overwrite_allowed = falseimage = "alpine"namespace = "base"namespace_overwrite_allowed = ""node_selector_overwrite_allowed = ""pod_labels_overwrite_allowed = ""service_account_overwrite_allowed = ""pod_annotations_overwrite_allowed = ""[runners.kubernetes.pod_security_context][runners.kubernetes.init_permissions_container_security_context][runners.kubernetes.build_container_security_context][runners.kubernetes.helper_container_security_context][runners.kubernetes.service_container_security_context][runners.kubernetes.volumes][runners.kubernetes.dns_config]

/entrypoint文件

#!/bin/sh# gitlab-runner data directory
DATA_DIR="/etc/gitlab-runner"
CONFIG_FILE=${CONFIG_FILE:-$DATA_DIR/config.toml}
# custom certificate authority path
CA_CERTIFICATES_PATH=${CA_CERTIFICATES_PATH:-$DATA_DIR/certs/ca.crt}
LOCAL_CA_PATH="/usr/local/share/ca-certificates/ca.crt"update_ca() {echo "Updating CA certificates..."cp "${CA_CERTIFICATES_PATH}" "${LOCAL_CA_PATH}"update-ca-certificates --fresh >/dev/null
}if [ -f "${CA_CERTIFICATES_PATH}" ]; then# update the ca if the custom ca is different than the currentcmp -s "${CA_CERTIFICATES_PATH}" "${LOCAL_CA_PATH}" || update_ca
fi# launch gitlab-runner passing all arguments
exec gitlab-runner "$@"

这个Shell脚本的作用是更新GitLab Runner的CA证书。
首先,它定义了一些变量:

  • DATA_DIR 变量设置为 /etc/gitlab-runner,表示GitLab Runner的数据目录。
  • CONFIG_FILE 变量使用了KaTeX parse error: Expected '}', got 'EOF' at end of input: {CONFIG_FILE:-DATA_DIR/config.toml}的语法,表示如果CONFIG_FILE变量未定义,则使用$DATA_DIR/config.toml作为默认值。
  • CA_CERTIFICATES_PATH 变量使用了KaTeX parse error: Expected '}', got 'EOF' at end of input: …IFICATES_PATH:-DATA_DIR/certs/ca.crt}的语法,表示如果CA_CERTIFICATES_PATH变量未定义,则使用$DATA_DIR/certs/ca.crt作为默认值。
  • LOCAL_CA_PATH 变量设置为 /usr/local/share/ca-certificates/ca.crt,表示本地系统中的CA证书路径。

接下来,脚本定义了一个名为 update_ca 的函数。该函数的作用是更新CA证书。它执行以下操作:

  • 打印消息 “Updating CA certificates…”。
  • 使用 cp 命令将 C A C E R T I F I C A T E S P A T H 的内容复制到 {CA_CERTIFICATES_PATH}的内容复制到 CACERTIFICATESPATH的内容复制到{LOCAL_CA_PATH}。
  • 使用 update-ca-certificates --fresh 命令更新系统的CA证书。

然后,脚本使用条件语句检查${CA_CERTIFICATES_PATH}文件是否存在。如果文件存在,则执行以下操作:

  • 使用 cmp 命令比较 C A C E R T I F I C A T E S P A T H 和 {CA_CERTIFICATES_PATH}和 CACERTIFICATESPATH{LOCAL_CA_PATH}的内容是否相同。如果不相同,则调用 update_ca 函数更新CA证书。

最后,脚本使用 exec 命令运行 gitlab-runner 命令,并将脚本的参数(“$@”)传递给 gitlab-runner 命令。这将启动GitLab Runner并执行相应的操作。

总体而言,这个脚本的目的是确保GitLab Runner的CA证书是最新的,并在启动GitLab Runner之前执行必要的更新操作。

/configmaps 目录

image.png

  • check-live
#!/bin/bash
set -eou pipefailif ! /usr/bin/pgrep -f ".*register-the-runner"  > /dev/null && ! /usr/bin/pgrep -f "gitlab.*runner"  > /dev/null ; thenexit 1
finame=$(awk -F'"' '/^  name = ".*"/ { print $2 }' "${HOME%/root}/.gitlab-runner/config.toml")
url=$(awk -F'"' '/^  url = ".*"/ { print $2 }' "${HOME%/root}/.gitlab-runner/config.toml")gitlab-runner verify -n "$name" -u "$url" 2>&1 | grep -E "is alive|is valid"
  • config.template.toml
[[runners]][runners.kubernetes]namespace = "base"image = "alpine"
  • config.toml
shutdown_timeout = 0
concurrent = 10
check_interval = 30
log_level = "info"
  • entrypoint
#!/bin/bash
set -eexport CONFIG_PATH_FOR_INIT="/home/gitlab-runner/.gitlab-runner/"
mkdir -p ${CONFIG_PATH_FOR_INIT}
cp /configmaps/config.toml ${CONFIG_PATH_FOR_INIT}# Set up environment variables for cache
if [[ -f /secrets/accesskey && -f /secrets/secretkey ]]; thenexport CACHE_S3_ACCESS_KEY=$(cat /secrets/accesskey)export CACHE_S3_SECRET_KEY=$(cat /secrets/secretkey)
fiif [[ -f /secrets/gcs-applicaton-credentials-file ]]; thenexport GOOGLE_APPLICATION_CREDENTIALS="/secrets/gcs-applicaton-credentials-file"
elif [[ -f /secrets/gcs-application-credentials-file ]]; thenexport GOOGLE_APPLICATION_CREDENTIALS="/secrets/gcs-application-credentials-file"
elseif [[ -f /secrets/gcs-access-id && -f /secrets/gcs-private-key ]]; thenexport CACHE_GCS_ACCESS_ID=$(cat /secrets/gcs-access-id)# echo -e used to make private key multiline (in google json auth key private key is oneline with \n)export CACHE_GCS_PRIVATE_KEY=$(echo -e $(cat /secrets/gcs-private-key))fi
fiif [[ -f /secrets/azure-account-name && -f /secrets/azure-account-key ]]; thenexport CACHE_AZURE_ACCOUNT_NAME=$(cat /secrets/azure-account-name)export CACHE_AZURE_ACCOUNT_KEY=$(cat /secrets/azure-account-key)
fiif [[ -f /secrets/runner-registration-token ]]; thenexport REGISTRATION_TOKEN=$(cat /secrets/runner-registration-token)
fiif [[ -f /secrets/runner-token ]]; thenexport CI_SERVER_TOKEN=$(cat /secrets/runner-token)
fi# Register the runner
if ! sh /configmaps/register-the-runner; thenexit 1
fi# Run pre-entrypoint-script
if ! bash /configmaps/pre-entrypoint-script; thenexit 1
fi# Start the runner
exec /entrypoint run \--working-directory=/home/gitlab-runner

这个Shell脚本的作用是配置GitLab Runner的运行环境,并执行GitLab Runner的入口点命令。

首先,set -e 表示在脚本中如果有任何命令执行失败(返回非零退出码),则立即退出脚本。
接下来,脚本导出了一个名为 CONFIG_PATH_FOR_INIT 的环境变量,设置为 /home/gitlab-runner/.gitlab-runner/。然后使用 mkdir -p 命令创建了该路径。

然后,脚本使用 cp 命令将 /configmaps/config.toml 文件复制到 ${CONFIG_PATH_FOR_INIT} 目录中。

接下来,脚本使用条件语句检查一些文件是否存在。如果文件存在,则将其内容读取到相应的环境变量中。具体的环境变量如下:

  • CACHE_S3_ACCESS_KEY 和 CACHE_S3_SECRET_KEY:从 /secrets/accesskey 和 /secrets/secretkey 读取内容。
  • GOOGLE_APPLICATION_CREDENTIALS:从 /secrets/gcs-applicaton-credentials-file 或 /secrets/gcs-application-credentials-file 读取文件路径。
  • CACHE_GCS_ACCESS_ID 和 CACHE_GCS_PRIVATE_KEY:从 /secrets/gcs-access-id 和 /secrets/gcs-private-key 读取内容。
  • CACHE_AZURE_ACCOUNT_NAME 和 CACHE_AZURE_ACCOUNT_KEY:从 /secrets/azure-account-name 和 /secrets/azure-account-key 读取内容。
  • REGISTRATION_TOKEN:从 /secrets/runner-registration-token 读取内容。
  • CI_SERVER_TOKEN:从 /secrets/runner-token 读取内容。

然后,脚本分别执行 /configmaps/register-the-runner 和 /configmaps/pre-entrypoint-script 脚本。如果其中任何一个脚本执行失败(返回非零退出码),则脚本会退出并返回1。

最后,脚本使用 exec 命令执行 /entrypoint run 命令,并传递 --working-directory=/home/gitlab-runner 参数。这将启动GitLab Runner,并设置工作目录为 /home/gitlab-runner。

总体而言,这个脚本的目的是设置GitLab Runner的配置文件和环境变量,然后执行GitLab Runner的入口点命令以启动Runner。

  • pre-entrypoint-script

  • register-the-runner
#!/bin/bash
MAX_REGISTER_ATTEMPTS=30# Reset/unset the not needed flags when an authentication token
RUN_UNTAGGED=""
ACCESS_LEVEL=""for i in $(seq 1 "${MAX_REGISTER_ATTEMPTS}"); doecho "Registration attempt ${i} of ${MAX_REGISTER_ATTEMPTS}"/entrypoint register \${RUN_UNTAGGED} \${ACCESS_LEVEL} \--template-config /configmaps/config.template.toml \--non-interactiveretval=$?if [ ${retval} = 0 ]; thenbreakelif [ ${i} = ${MAX_REGISTER_ATTEMPTS} ]; thenexit 1fisleep 5
doneexit 0

/secrets

runner-token文件内容空
runner-registration-token文件内容:GR1348941EfP6qKATzEULxDtvkvAg

runner 默认配置问题

上述方式部署存在runner pod重启,config.toml配置被重置情况,原因在于下述启动命令中,/configmaps中的脚本。

/usr/bin/dumb-init,--,/bin/bash,/configmaps/entrypoint

/configmaps挂载为了ConfigMap,默认存在如下问题:

  1. 重启runner 后config.toml配置会被重置为初始配置
  2. 重启runner 后构建后的文件丢失
  3. 内网harbor域名解析问题

需修改ConfigMap下config.template.toml配置:
在这里插入图片描述
在这里插入图片描述

[[runners]]builds_dir = "/builds"[runners.kubernetes]namespace = "base"image = "alpine"pull_policy = "if-not-present"      # 拉取镜像策略,本地有是有本地无需拉取[[runners.kubernetes.volumes.pvc]]  # 挂载数据卷持久化name = "k8s-running-pod-data"mount_path = "/builds"[[runners.kubernetes.volumes.host_path]]  # 使用docker命令需要配置引擎name = "docker"mount_path = "/var/run/docker.sock"host_path = "/var/run/docker.sock"[[runners.kubernetes.host_aliases]]  # 用于解析内网中的harbor域名ip = "192.168.31.11"hostnames = ["harbor域名"][[runners.kubernetes.host_aliases]]  # 用于解析k8s集群中Kubernetes API Server 的地址ip = "192.168.31.21"               # k8s集群master iphostnames = ["lb.kubesphere.local"]

最后生成config.toml 配置如下

runner注册配置可直接修改config.toml 配置文件,无需重启即可生效

concurrent = 10
check_interval = 30
log_level = "info"
shutdown_timeout = 0[session_server]session_timeout = 1800[[runners]]name = "k8s-gitlab-runner-gitlab-runner-58cbcc57d5-8kbfz"url = "http://192.168.31.3:83"id = 65token = "Qvdu1hpsUpYNa3dzrjqP"token_obtained_at = 2024-01-29T05:21:04Ztoken_expires_at = 0001-01-01T00:00:00Zexecutor = "kubernetes"builds_dir = "/builds"[runners.cache]MaxUploadedArchiveSize = 0[runners.kubernetes]host = ""bearer_token_overwrite_allowed = falseimage = "alpine"namespace = "base"namespace_overwrite_allowed = ""pull_policy = ["if-not-present"]node_selector_overwrite_allowed = ""pod_labels_overwrite_allowed = ""service_account_overwrite_allowed = ""pod_annotations_overwrite_allowed = ""[runners.kubernetes.pod_security_context][runners.kubernetes.init_permissions_container_security_context][runners.kubernetes.build_container_security_context][runners.kubernetes.helper_container_security_context][runners.kubernetes.service_container_security_context][runners.kubernetes.volumes][[runners.kubernetes.volumes.host_path]]name = "docker"mount_path = "/var/run/docker.sock"host_path = "/var/run/docker.sock"[[runners.kubernetes.volumes.pvc]]name = "k8s-running-pod-data"mount_path = "/builds"[[runners.kubernetes.host_aliases]]ip = "192.168.31.11"hostnames = ["harbor域名"][[runners.kubernetes.host_aliases]]ip = "192.168.31.21"hostnames = ["lb.kubesphere.local"][runners.kubernetes.dns_config]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247813.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云Linux(OpenCloudOS)安装tomcat9(9.0.85)

腾讯云Linux(OpenCloudOS)安装tomcat9 下载并上传 tomcat官网 https://tomcat.apache.org/download-90.cgi 下载完成后上传至自己想要放置的目录下 解压文件 输入tar -xzvf apache-tomcat-9.0.85.tar.gz解压文件&#xff0c;建议将解压后的文件重新命名为tomcat,方便后期进…

如何编辑图片上的文字?分享5种可以编辑的工具!

在数字时代&#xff0c;图片已经成为信息传递的重要载体。有时候&#xff0c;我们需要在图片上添加文字&#xff0c;以增加信息的清晰度或创意性。那么&#xff0c;如何编辑图片上的文字呢&#xff1f;本文将为你揭秘编辑图片文字的必备工具&#xff0c;让你轻松实现创意表达。…

python小项目:口令保管箱

代码&#xff1a; #! python3 # python 编程-----口令保管箱passwords{emails: F7minlBDDuvMJuxESSKHFhTxFtjVB6,blog:VmALvQyKAxiVH5G8v01if1MLZF3sdt,luggage:12345,} import sys,pyperclip if len(sys.argv)<2:print(usage:python python3文件[accout]-copy accout pass…

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.1.29 前言&#xff1…

《HTML 简易速速上手小册》第9章:HTML5 新特性(2024 最新版)

文章目录 9.1 HTML5 新增标签和属性9.1.1 基础知识9.1.2 案例 1&#xff1a;创建一个结构化的博客页面9.1.3 案例 2&#xff1a;使用新的表单元素创建事件注册表单9.1.4 案例 3&#xff1a;创建一个具有高级搜索功能的搜索表单 9.2 HTML5 表单增强9.2.1 基础知识9.2.2 案例 1&a…

【Algorithms 4】算法(第4版)学习笔记 01 - 1.5 案例研究:union-find算法

文章目录 前言参考目录学习笔记1&#xff1a;动态连通性2&#xff1a;UF 实现 1&#xff1a;快速查找 quick-find2.1&#xff1a;demo 演示 12.2&#xff1a;demo 演示 22.3&#xff1a;quick-find 代码实现3&#xff1a;UF 实现 2&#xff1a;快速合并 quick-union3.1&#xf…

第 6 章:Linux中使用时钟、计时器和信号

在本章中&#xff0c;我们将开始探索Linux环境中可用的各种计时器。随后&#xff0c;我们将深入了解时钟的重要性&#xff0c;并探讨UNIX时间的概念。接下来&#xff0c;我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后&#xff0c;我们将进入std::chrono的领域&…

第二篇:数据结构与算法-顺序表

顺序表 动态星空制作 #include <iostream> #include <graphics.h> #include <Windows.h> using namespace std;#define MAX_START 100 //星星数 #define MAX_MARGIN 80 //随机地 #define WIN_WIDTH 640 //窗口宽 #define WIN_HEIGHT 480 //窗口高 #define…

.ui文件相关

目录 ui类生成过程&#xff1a; 提问&#xff1a; 等以后自己熟练了用代码写这些样式内容&#xff0c;尽量用代码写&#xff0c;原因很简单&#xff1a; 用代码写的可以直接修改代码&#xff0c;但是在设计界面修改的东西&#xff0c;电脑没有QC这玩意&#xff0c;还真不好改…

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换&#xff1f;总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

深入浅出 diffusion(4):pytorch 实现简单 diffusion

1. 训练和采样流程 2. 无条件实现 import torch, time, os import numpy as np import torch.nn as nn import torch.optim as optim from torchvision.datasets import MNIST from torchvision import transforms from torch.utils.data import DataLoader from torchvision.…

基于Redis的高可用分布式锁——RedLock

目录 RedLock简介 RedLock工作流程 获取锁 释放锁 RedLock简介 Redis作者提出来的高可用分布式锁由多个完全独立的Redis节点组成&#xff0c;注意是完全独立&#xff0c;而不是主从关系或者集群关系&#xff0c;并且一般是要求分开机器部署的利用分布式高可以系统中大多数存…

基于ncurse的floppy_bird小游戏

1. 需求分析 将运动分解为鸟的垂直运动和杆的左右运动。 2. 概要设计 2.1 鸟运动部分 2.2 杆的运动 3. 代码实现 #include <stdio.h> #include <ncurses.h>#include <stdlib.h> #include <time.h>int vx 0; int vy 1;int bird_r; int bird_c;int…

2023年算法CDO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法CDO-CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; CDO-CNN-BiLSTM-Attention切诺贝利灾难优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 切诺贝利灾难优化器Chernobyl Disaster Optimizer (CDO)是H. Shehadeh于202…

力扣题集(第一弹)

一日练,一日功;一日不练十日空。 学编程离不开刷题&#xff0c;接下来让我们来看几个力扣上的题目。 1. 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数…

详解OpenHarmony各部分文件在XR806上的编译顺序

大家好&#xff0c;今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道&#xff0c;一提到编译可能大家会感到有点儿头疼&#xff0c;但请放心&#xff0c;我不会让大家头疼的。我们要明白&#xff0c;在开始写代码之前&#xff0c;了解整个程序的编译路径是十分有必…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉语言导航

专属领域论文订阅 VX 关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起免费…

【国产MCU】-认识CH32V307及开发环境搭建

认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…

Unity3d实现简单的战斗

使用u3d实现一个简单的战斗demo&#xff0c;记下学到的知识点&#xff0c;以备后查。 1.判断鼠标是否点中制定物体 if (Input.GetMouseButton(0)) {Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit)){//坐标转换Ve…

Docker 安装篇(Ubuntu)

图省事一般采用第一种 一、 直接采用apt安装 apt install docker.io查看 /usr/lib/systemd/system/docker.service ubuntu默认守护进程用的&#xff1a;fd:// ps -ef | grep docker root 775237 1 0 11:14 ? 00:01:07 /usr/bin/dockerd -H fd:// --cont…