如何添加极狐GitLab Runner 信任域名证书

本文作者 徐晓伟

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

极狐Gitlab Runner 信任实例域名证书,用于注册注册极狐 GitLab Runner。

问题

参见 极狐gitlab-runner-host.md

说明

域名证书解决方案

方案1:重新配置极狐 GitLab,自动生成对应证书并自动配置,然后在极狐 GitLab runner 中信任证书

  1. 问题1:tls: failed to verify certificate: x509: certificate signed by unknown authority

    1. 文档

      1. runners 部分
      2. 自签名证书或自定义证书颁发机构
      3. ConfigMap
      4. 配置 Pod 使用 ConfigMap
    2. 根据上述文档可知,有三种方式可以解决证书信任问题:

      1. 在 极狐GitLab Runner 注册时配置 --tls-ca-file 参数并指向证书文件
      2. 在配置文件中增加 tls-ca-file 并指向配置文件, 此方式本文不做介绍,可参考 gitlab-runner-kubernetes-host.md原理相同
      3. 将证书放在 /etc/gitlab-runner/certs/ 文件夹下,使用域名命名证书,证书后缀名是 .crt由于篇幅限制,这里只介绍这一种方式
    3. 由于 k8s 的 pod 可能随时会被删除(故障转移、主动删除等),所以直接在 pod 内部配置不是上策

    4. k8s 中的 ConfigMap 可以挂载到 pod 内部,所以可以考虑在 ConfigMap 中配置证书,然后 pod 内部使用 ConfigMap 中的证书

    5. 下载证书

      1. 方式1

        1. 浏览器访问域名 https://gitlab.test.helm.xuxiaowei.cn
        2. 按照图中操作,下载证书,上传之服务器,用于后期操作

      2. 方式2

        # 下载证书
        openssl s_client -showcerts -connect gitlab.test.helm.xuxiaowei.cn:443 -servername gitlab.test.helm.xuxiaowei.cn < /dev/null 2>/dev/null | openssl x509 -outform PEM > gitlab.test.helm.xuxiaowei.cn.crt
        
    6. 将证书导入到 k8s 中

      # -n=gitlab-test:指定命名空间
      # create configmap etc-gitlab-runner-certs:创建 ConfigMap 名称是 etc-gitlab-runner-certs
      # --from-file=gitlab.test.helm.xuxiaowei.cn.crt=gitlab.test.helm.xuxiaowei.cn.crt:配置来自文件,文件名 gitlab.test.helm.xuxiaowei.cn.crt,放入 ConfigMap 中的键也是 gitlab.test.helm.xuxiaowei.cn.crt
      kubectl -n=gitlab-test create configmap etc-gitlab-runner-certs --from-file=gitlab.test.helm.xuxiaowei.cn.crt=gitlab.test.helm.xuxiaowei.cn.crt
      
      # 查看
      # kubectl -n=gitlab-test get configmap etc-gitlab-runner-certs -o yaml
      
    7. 导出 helm 极狐GitLab 配置

      helm -n gitlab-test get values my-gitlab > my-gitlab.yaml
      
    8. 修改 helm 极狐GitLab 配置

      gitlab-runner:
        # 挂载卷名称
        volumeMounts:
          # 挂载到 pod 路径(文件/文件夹)
          # 此处是在容器内运行的 gitlab runner,由于权限限制等原因,
          # 所以 配置文件不是在 /etc/gitlab-runner/ 目录下,而是 /home/gitlab-runner/.gitlab-runner/
          - mountPath: /home/gitlab-runner/.gitlab-runner/certs
            name: etc-gitlab-runner-certs-volumes
        # 卷
        volumes:
          # 卷类型
          - configMap:
              items:
              # configMap 中的键
              - key: gitlab.test.helm.xuxiaowei.cn.crt
                # 挂载的路径
                path: gitlab.test.helm.xuxiaowei.cn.crt
              name: etc-gitlab-runner-certs
            # 配置 ConfigMap 名称
            name: etc-gitlab-runner-certs-volumes
      
    9. 更新 helm 极狐GitLab 配置

      helm upgrade -n gitlab-test --install my-gitlab gitlab/gitlab -f my-gitlab.yaml --timeout 600s --version 7.7.0
      
    10. 查看修改结果

      kubectl -n gitlab-test get deployments.apps my-gitlab-gitlab-runner -o yaml
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        annotations:
          deployment.kubernetes.io/revision: "5"
          meta.helm.sh/release-name: my-gitlab
          meta.helm.sh/release-namespace: gitlab-test
        creationTimestamp: "2023-12-22T05:03:46Z"
        generation: 7
        labels:
          app: my-gitlab-gitlab-runner
          app.kubernetes.io/managed-by: Helm
          chart: gitlab-runner-0.59.2
          heritage: Helm
          release: my-gitlab
        name: my-gitlab-gitlab-runner
        namespace: gitlab-test
        resourceVersion: "30086"
        uid: 8c46c44a-5b67-44ae-90d0-008daa3fa388
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app: my-gitlab-gitlab-runner
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            annotations:
              checksum/configmap: f35865354f043583d0903b0a8350830a486eb0e289d18271cf3f533e7d89c5f7
              checksum/secrets: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
              gitlab.com/prometheus_port: "9252"
              gitlab.com/prometheus_scrape: "true"
            creationTimestamp: null
            labels:
              app: my-gitlab-gitlab-runner
              chart: gitlab-runner-0.59.2
              heritage: Helm
              release: my-gitlab
          spec:
            containers:
              - command:
                  - /usr/bin/dumb-init
                  - --
                  - /bin/bash
                  - /configmaps/entrypoint
                env:
                  - name: CI_SERVER_URL
                    value: https://gitlab.test.helm.xuxiaowei.cn
                  - name: RUNNER_EXECUTOR
                    value: kubernetes
                  - name: REGISTER_LOCKED
                    value: "false"
                  - name: RUNNER_TAG_LIST
                  - name: KUBERNETES_NAMESPACE
                    value: gitlab-test
                image: registry.gitlab.com/gitlab-org/gitlab-runner:alpine-v16.6.1
                imagePullPolicy: IfNotPresent
                livenessProbe:
                  exec:
                    command:
                      - /bin/bash
                      - /configmaps/check-live
                  failureThreshold: 3
                  initialDelaySeconds: 60
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 3
                name: my-gitlab-gitlab-runner
                ports:
                  - containerPort: 9252
                    name: metrics
                    protocol: TCP
                readinessProbe:
                  exec:
                    command:
                      - /usr/bin/pgrep
                      - gitlab.*runner
                  failureThreshold: 3
                  initialDelaySeconds: 10
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 3
                resources: {}
                securityContext:
                  allowPrivilegeEscalation: false
                  capabilities:
                    drop:
                      - ALL
                  privileged: false
                  readOnlyRootFilesystem: false
                  runAsNonRoot: true
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /secrets
                    name: projected-secrets
                  - mountPath: /home/gitlab-runner/.gitlab-runner
                    name: etc-gitlab-runner
                  - mountPath: /configmaps
                    name: configmaps
                  - mountPath: /home/gitlab-runner/.gitlab-runner/certs
                    name: etc-gitlab-runner-certs-volumes
            dnsPolicy: ClusterFirst
            hostAliases:
              - hostnames:
                  - gitlab.test.helm.xuxiaowei.cn
                ip: 172.25.25.32
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext:
              fsGroup: 65533
              runAsUser: 100
            serviceAccount: my-gitlab-gitlab-runner
            serviceAccountName: my-gitlab-gitlab-runner
            terminationGracePeriodSeconds: 3600
            volumes:
              - emptyDir:
                  medium: Memory
                name: runner-secrets
              - emptyDir:
                  medium: Memory
                name: etc-gitlab-runner
              - name: projected-secrets
                projected:
                  defaultMode: 420
                  sources:
                    - secret:
                        name: my-gitlab-minio-secret
                    - secret:
                        items:
                          - key: runner-registration-token
                            path: runner-registration-token
                          - key: runner-token
                            path: runner-token
                        name: my-gitlab-gitlab-runner-secret
              - configMap:
                  defaultMode: 420
                  name: my-gitlab-gitlab-runner
                name: configmaps
              - configMap:
                  defaultMode: 420
                  items:
                    - key: gitlab.test.helm.xuxiaowei.cn.crt
                      path: gitlab.test.helm.xuxiaowei.cn.crt
                  name: etc-gitlab-runner-certs
                name: etc-gitlab-runner-certs-volumes
      status:
        availableReplicas: 1
        conditions:
          - lastTransitionTime: "2023-12-22T07:43:25Z"
            lastUpdateTime: "2023-12-22T07:43:25Z"
            message: Deployment has minimum availability.
            reason: MinimumReplicasAvailable
            status: "True"
            type: Available
          - lastTransitionTime: "2023-12-22T05:03:46Z"
            lastUpdateTime: "2023-12-22T07:43:25Z"
            message: ReplicaSet "my-gitlab-gitlab-runner-597d6d8f7c" has successfully progressed.
            reason: NewReplicaSetAvailable
            status: "True"
            type: Progressing
        observedGeneration: 7
        readyReplicas: 1
        replicas: 1
        updatedReplicas: 1
      
    11. 查看 gitlab runner 日志

      [root@anolis-7-9 ~]# kubectl -n gitlab-test get pod | grep gitlab-runner
      my-gitlab-gitlab-runner-597d6d8f7c-8v466             1/1     Running     0              5m52s
      [root@anolis-7-9 ~]#
      

      根据日志判断,已经注册成功了

      [root@anolis-7-9 ~]# kubectl -n gitlab-test logs -f my-gitlab-gitlab-runner-597d6d8f7c-8v466
      Registration attempt 1 of 30
      Runtime platform                                    arch=amd64 os=linux pid=16 revision=f5da3c5a version=16.6.1
      WARNING: Running in user-mode.                     
      WARNING: The user-mode requires you to manually start builds processing:
      WARNING: $ gitlab-runner run                       
      WARNING: Use sudo for system-mode:                 
      WARNING: $ sudo gitlab-runner...
      
      Created missing unique system ID                    system_id=r_3WsywNzJqRud
      Merging configuration from template file "/configmaps/config.template.toml"
      WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://docs.gitlab.com/ee/ci/runners/new_creation_workflow
      Registering runner... succeeded                     runner=BtGwLEwc
      Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
      
      Configuration (with the authentication token) was saved in "/home/gitlab-runner/.gitlab-runner/config.toml"
      Runtime platform                                    arch=amd64 os=linux pid=7 revision=f5da3c5a version=16.6.1
      Starting multi-runner from /home/gitlab-runner/.gitlab-runner/config.toml...  builds=0 max_builds=0
      WARNING: Running in user-mode.                     
      WARNING: Use sudo for system-mode:                 
      WARNING: $ sudo gitlab-runner...
      
      There might be a problem with your config based on jsonschema annotations in common/config.go (experimental feature):
      jsonschema: '/runners/0/kubernetes/pull_policy' does not validate with https://gitlab.com/gitlab-org/gitlab-runner/common/config#/$ref/properties/runners/items/$ref/properties/kubernetes/$ref/properties/pull_policy/$ref/type: expected array, but got null
      
      Configuration loaded                                builds=0 max_builds=10
      listen_address not defined, metrics & debug endpoints disabled  builds=0 max_builds=10
      [session_server].listen_address not defined, session endpoints disabled  builds=0 max_builds=10
      Initializing executor providers                     builds=0 max_builds=10
      ^C
      [root@anolis-7-9 ~]#
      
    12. 管理员访问 https://gitlab.test.helm.xuxiaowei.cn/admin/runners 可以看到 pod my-gitlab-gitlab-runner-597d6d8f7c-8v466 已经注册成了

      1. 如果存在极狐 GitLab Runner Pod 被删除(故障转译、手动删除等等),这里可能会存在不可用的 Runner
  2. 问题2: tls: failed to verify certificate: x509: certificate is valid for ingress.local, not gitlab.test.helm.xuxiaowei.cn

    1. 访问的域名与使用的证书补匹配,可通过更换证书、域名来解决此问题(一般情况是更换证书)

    2. 如果要更换证书:

      1. 证书属于正规机构颁发的(如:上述各大云厂商的证书),请看下方方案2
      2. 如果是自己生成的证书(不受信任),请看下方方案2,并结合上方问题1来解决此问题

方案2:配置正规机构颁发的证书(如:上述各大云厂商的证书),一般无需在 gitlab 配置信任证书,即可正常使用

  1. 正常情况

    1. 要求证书与域名对应
    2. 将证书上传至服务器,解压,使用证书文件创建 k8s TLS Secret
    3. 修改 极狐GitLab 配置,使用 上述步骤创建的 k8s TLS Secret
  2. 异常情况:正规机构颁发的证书,在极狐 GitLab Runner 中依然无法正常使用,但是在浏览器中可以正常使用

    1. 原因是颁发机构的根证书不在极狐 GitLab Runner 的信任列表中,需要手动添加信任(例如:常见的 Windows 较低版本运行一些软件时,也是无法执行,显示证书无法识别,需要在 Windows 导入软件签名所使用的证书链)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容