在Kubernetes荚中克隆一个安全的git回购

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

理想情况下,我将使用一个使用秘密进行身份validation的gitRepo挂载,但是在撰写本文时,此function不可用。

约束

我需要以下内容:

  • 在我的容器运行时,我可以间歇性地拖拉容器内的回购
  • 回购必须使用GitHub部署密钥进行访问
  • 密钥必须保持安全(在Kubernetes秘密中),而不是存储在泊坞窗图像中
  • repo必须在同一个pod中的两个容器之间共享,一个写入,一个读取

可能的解决scheme:

挂载SSH密钥作为秘密并克隆:

我试图用一个在单独的pod中运行的bash脚本将repo克隆到emptydir中(这个脚本必须运行,我也用它来做其他的事情),然而,然后我遇到了ssh密钥进入荚。 这个问题是关于这个问题,但似乎没有办法做到这一点。 我能够使用秘密挂载获得密钥,但是然后将权限设置为777.为了解决这个问题,我将密钥安装到/test/目录,然后尝试将它们转换为/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和pipe道他们的文件,但没有奏效。 起初,当我弄错path时,它给了我这些错误:

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

一旦我修好了path,它什么都不做,并且失败了。 kubectl exec到包含器中的kubectl exec/root/.ssh/没有显示任何文件。

我想我已经达到了这条道路的底部,所以我不认为这将是解决scheme。

configurationssh忽略密钥权限

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

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

理想情况下,我希望在集装箱中拥有一个钥匙,以便将来可能使用其他回购方式扩展该项目。 还有其他方法可以做到这一点,我没有想到或尝试过。

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

我想过在环境variables中使用OAuth密钥,然后使用它来通过HTTPS克隆回购。 这是不理想的,但如果它的工作,我会采取。 现在唯一阻止我这样做的是我不能使用部署密钥。 如果有一种方法可以将OAuth与部署密钥一起使用,我还没有find它,但是如果有人知道更多的话,这可能是解决scheme。

在docker图像中克隆

回购中没有任何东西让我在docker图像中感到不舒服,所以我可以走这条路。 这个问题是,我需要能够下拉更新回购。 如果我把它放在容器里,我将无法拿走我的钥匙。 可能有一些解决方法,我没有尝试过。

我现在已经没有什么可以尝试的地步了,所以任何build议都值得一试。


类似的问题

这个问题和我正在做的非常相似,但是我觉得既然他们没有使用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