在Kubernetes pod中克隆一个安全的git仓库

3oc*_*ene 7 git ssh github docker kubernetes

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

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

约束

我需要以下内容:

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

可能的解决方案:

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

我尝试使用在单独的pod中运行的bash脚本将repo克隆到emptydir中(无论如何这个脚本都必须运行,我也将它用于其他事情),然后我遇到了将ssh键放入其中的问题.荚.这个问题是关于这个问题的,但它似乎没有办法实现.我能够使用秘密安装获取密钥,但随后权限设置为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
Run Code Online (Sandbox Code Playgroud)

我也尝试使用cat并将它们管道到他们的文件但是没有用.当我遇到错误的路径时,它首先给了我这些错误:

cat: /keys/id_rsa: input file is output file
cat: /keys/id_rsa.pub: input file is output file
Run Code Online (Sandbox Code Playgroud)

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

我想我已经走到了这条道路的尽头,所以我认为这不是解决方案.

配置ssh以忽略密钥权限

如果SSH有办法忽略密钥的权限 - 默认情况下它强制执行644或更少,我相信 - 然后上述解决方案是可能的.我很惊讶我没有找到任何方法来做到这一点,但我的google-fu总是出现结果,说你只需要正确设置权限.

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

理想情况下,我希望在容器中有一个密钥,用于使用其他回购项目进行此项目的未来扩展.可能还有其他一些方法可以做到这一点,我没有想过或尝试过.

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

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

克隆在docker图像中

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

我觉得我什么都没有尝试,所以任何建议都值得一试.


类似的问题

这个问题与我正在尝试的问题非常相似,但是我觉得因为他们没有使用Kubernetes和我,因为秘密和安装文件的不同方法,所以值得单独发布.

这个问题讨论了如何将SSH密钥放入Kubernetes的容器中,但是我并没有因为在SSH上使用git而死定,所以我认为这应该是它自己的问题.

Cam*_*mil 5

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

volumeMounts:
  - mountPath: /root/.ssh
    name: ssh-key
volumes:
- name: ssh-key
  secret:
    secretName: ssh-key
    defaultMode: 256
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)