在Kubernetes pod

时间:2016-12-09 19:37:59

标签: git github docker ssh kubernetes

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

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

约束

我需要以下内容:

  • 容器内的仓库,我可以在集装箱运行时间歇性地拉动
  • 必须使用GitHub部署密钥访问存储库
  • 密钥必须保密(以Kubernetes保密)并且不存储在docker图像中
  • repo必须在同一个pod中的两个容器之间共享 - 一个写入,一个读取

可能的解决方案:

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

我尝试使用在单独的pod中运行的bash脚本将repo克隆到emptydir中(无论如何这个脚本都必须运行,我还将其用于其他事情),然而我遇到了获取ssh的问题进入吊舱的钥匙。 This question是关于这个问题的,但它似乎没有办法实现。我能够通过秘密安装获取密钥,但随后权限设置为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/ app.use( express.static( __dirname + '/public' ) ); 中没有文件显示__dirname

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

配置ssh以忽略关键权限

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

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

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

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

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

在docker镜像中克隆

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

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

类似问题

This question与我正在尝试的非常相似,但我觉得因为他们不使用Kubernetes而且我是,因为秘密和安装文件的不同方法,所以值得单独发布。

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

1 个答案:

答案 0 :(得分:5)

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

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