【问题标题】:Gitlab CI Kubernetes Agent Self Signed CertificateGitlab CI Kubernetes 代理自签名证书
【发布时间】:2023-02-13 09:45:13
【问题描述】:

我有以下 .gitlab-ci.yml 配置:

deploy:
  stage: deploy
  image:
    name: bitnami/kubectl:latest
    entrypoint: ['']
  script:
    - echo "Hello, Rules!"
    - kubectl config get-contexts
    - kubectl config use-context OurGroup/our-repo:agent-0
    - kubectl get pods
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master"'
      when: manual
      allow_failure: true    
    - if: '$CI_COMMIT_REF_NAME == "develop"'
      when: manual
      allow_failure: true    
  tags: 
    - docker

这会因以下错误而失败:

无法连接到服务器:x509:由未知授权机构签署的证书

我们正在运行一个带有自签名证书的自托管 gitlab 实例。问题是 bitnami/kubectl:latest 是一个非 root docker 容器,它在官方 gitlab docu 中有描述: https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html#update-your-gitlab-ciyml-file-to-run-kubectl-commands

我已经尝试使用“echo "$CA_CERTIFICATE" > /usr/local/share/ca-certificates/my-ca.crt && update-ca-certificates" 来注入证书,但由于没有权限和 SUDO 而失败存在于这个容器中。

kubectl get certificates 因无法连接到本地主机而失败:8080

关于如何获得自签名证书以与 kubectl 和代理身份验证连接工作的任何指示,或者什么可能被认为是使这项工作安全的方法?

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我刚刚遇到了完全相同的问题。

标签: kubernetes gitlab kubectl gitlab-ci-runner bitnami


【解决方案1】:

值得庆幸的是,Gitlab 提供了一种方法,可以在代理启动期间通过标志提供指向 ca-crt-file 的路径。

加载自签名证书的大致过程是:

  1. 创建一个包含自签名证书公钥的文件,确保连接签名链中涉及的任何其他公钥
  2. 如果您可以执行上述操作,则可以将此文件作为 K8S ConfigMap 应用,如果不能(您包括私钥),则将其创建为 K8S Secret,如后续文档所示。
  3. 修改 K8S Deployment 以将 ConfigMap/Secret 挂载到代理容器,然后向容器添加新行 args 以指向文件 - --ca-cert-file=/certs/ca.crt

    GitLab Kubernetes Agent: provide custom certificates to the Agent Issue #280518 (thank you Philipp Hahn)

    在kind:Deployment部署部分添加如下东西:

    • 在 spec:template:spec:containers:args append - --ca-cert-file=/certs/${YOUR_CA}.crt - 在这里手动展开 ${YOUR_CA}
    • spec:template:spec:contaiers:volumeMounts添加一个新块:
    - name: custom-certs
      readOnly: true
      mountPath: /certs
    
    • spec:template:spec:volumes添加一个新块:
    - name: custom-certs
      secret:
      secretName: ca
    

    官方文档:

    Providing a custom certificate for accessing GitLab

    您可以向 GitLab Runner Helm Chart 提供 Kubernetes Secret,它将用于填充容器的 /home/gitlab-runner/.gitlab-runner/certs 目录。 Secret 中的每个密钥名称将用作目录中的文件名,文件内容是与密钥关联的值:

    • 使用的密钥/文件名应采用 <gitlab.hostname>.crt 格式,例如 gitlab.your-domain.com.crt。
    • 任何中间证书都需要连接到同一文件中的服务器证书。
    • 使用的主机名应该是证书注册的主机名。

    Gitlab Agent Helm Chart Deployment

    - --ca-cert-file=/etc/agentk/config/ca.crt
    

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2018-11-19
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多