在 Kubernetes pod 中克隆安全的 git 存储库

2024-03-28

我遇到了一个有趣的情况,我需要将私有 github 存储库克隆到我在 Kubernetes 中运行的 Docker 容器中。最初我尝试使用 gitRepo 安装,但是,在我的部署清单中包含 OAuth 密钥是不可接受的,我想使用存储库部署密钥而不是附加到我的 GitHub 帐户的 OAuth 密钥。

理想情况下,我会使用使用秘密进行身份验证的 gitRepo 安装,但此功能在撰写本文时尚不可用。

约束条件

我需要以下内容:

  • 容器内的存储库,我可以在容器运行时间歇性地拉取
  • 必须使用 GitHub 部署密钥访问存储库
  • 密钥必须保持安全(在 Kubernetes 秘密中)并且不能存储在 docker 镜像中
  • 存储库必须在同一 Pod 中的两个容器之间共享 - 一个用于写入,一个用于读取

可能的解决方案:

将 SSH 密钥挂载为机密并克隆:

我尝试将存储库克隆到一个空目录中,并在单独的 pod 中运行一个 bash 脚本(该脚本无论如何都必须运行,我也将它用于其他用途),但是我随后遇到了将 ssh 密钥放入荚。这个问题 https://stackoverflow.com/questions/39568412/creating-ssh-secrets-key-file-in-kubernetes是关于这个问题的,但似乎没有办法做到这一点。我能够通过秘密挂载获取密钥,但随后权限设置为 777。为了解决这个问题,我将密钥挂载到/test/目录,然后尝试cp他们进入/root/.ssh/。这给了我这些奇怪的错误:

cp: '/test/id_rsa' and '/root/.ssh/id_rsa' are the same file
cp: '/test/id_rsa.pub' and '/root/.ssh/id_rsa.pub' are the same file

我也尝试过使用cat并将它们通过管道传输到他们的文件中,但这不起作用。起初,当我的路径错误时,它给了我这些错误:

cat: /keys/id_rsa: input file is output file
cat: /keys/id_rsa.pub: input file is output file

一旦我修复了路径,它什么也没做并且默默地失败了。kubectl exec进入容器显示没有文件/root/.ssh/.

我认为我已经到达了这条道路的底部,所以我不认为这会是解决方案。

配置 ssh 以忽略关键权限

如果 SSH 有办法忽略密钥的权限(我相信默认情况下它强制执行 644 或更少),那么上述解决方案是可能的。我很惊讶我没有找到任何方法来做到这一点,但我的谷歌总是显示结果说你只需要正确设置权限。

将密钥安全地放入容器的其他方法

理想情况下,我希望容器中有一个密钥,以便将来使用其他存储库扩展该项目。可能还有其他我没有想到或尝试过的方法来做到这一点。

在容器内使用 OAuth 密钥进行克隆

我考虑过尝试在环境变量中使用 OAuth 密钥,然后使用它通过 HTTPS 克隆存储库。这不太理想,但如果有效,我会接受。现在唯一阻止我这样做的是我无法使用部署密钥。如果有一种方法可以通过部署密钥使用 OAuth,我还没有找到它,但如果有人了解更多,它可能是解决方案。

在 docker 镜像中克隆

仓库中没有任何东西让我在 docker 镜像中感到不舒服,所以我可以走这条路。问题是我需要能够下载存储库的更新。如果我把它放在容器里,没有钥匙我就无法拉动。可能有一些我还没有尝试过的解决方法。

我觉得我已经没有什么可以尝试的了,所以任何建议都值得一试。


类似的问题

这个问题 https://stackoverflow.com/questions/33373846/cloning-private-git-repo-in-the-docker-container与我想要做的非常相似,但是我觉得由于他们没有使用 Kubernetes 而我正在使用,因此值得单独发布,因为秘密和安装文件的不同方法。

这个问题 https://stackoverflow.com/questions/39568412/creating-ssh-secrets-key-file-in-kubernetes谈论将 SSH 密钥放入 Kubernetes 中的容器中,但是我并不一定要在 SSH 上使用 git,所以我认为这应该是它自己的问题。


尝试安装包含部署密钥的秘密,如下所示:

volumeMounts:
  - mountPath: /root/.ssh
    name: ssh-key
volumes:
- name: ssh-key
  secret:
    secretName: ssh-key
    defaultMode: 256

这是我如何使用它的完整示例:

apiVersion: batch/v2alpha1
kind: ScheduledJob
metadata:
  name: transporter
spec:
  schedule: 0 5 * * *
  jobTemplate:
    spec:
      template:
        spec:
          nodeSelector:
            role: mysqldump
          containers:
          - name: transporter
            image: camil/mysqldump
            command: ["/bin/bash", "-c"]
            args:
              - ssh-keyscan -t rsa $TARGET_HOST > ~/.ssh/known_hosts && ssh -i /root/.ssh/private/id_rsa $LINUX_USER@$TARGET_HOST 'mkdir mysqldump || true' && scp -i /root/.ssh/private/id_rsa /mysqldump/* $LINUX_USER@$TARGET_HOST:/home/$LINUX_USER/mysqldump
            env:
              - name: TARGET_HOST
                valueFrom:
                  configMapKeyRef:
                    name: transporter
                    key: target.host
              - name: LINUX_USER
                valueFrom:
                  configMapKeyRef:
                    name: transporter
                    key: linux.user
            imagePullPolicy: Always
            volumeMounts:
              - mountPath: /mysqldump
                name: mysqldump
              - mountPath: /root/.ssh/private
                name: ssh-key
          volumes:
            - name: mysqldump
              hostPath:
                path: /home/core/mysqldump
            - name: ssh-key
              secret:
                secretName: ssh-key
                defaultMode: 256
          restartPolicy: OnFailure
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Kubernetes pod 中克隆安全的 git 存储库 的相关文章

随机推荐