我遇到了一个有趣的情况,我需要将私有github repo克隆到我在Kubernetes中运行的docker容器中。最初我尝试使用gitRepo挂载,但在部署清单中使用OAuth密钥是不可接受的,我想使用repo deploy密钥而不是附加到我的GitHub帐户的OAuth密钥。
理想情况下,我会使用一个使用秘密进行身份验证的gitRepo挂载,但在撰写本文时此功能尚不可用。
我需要以下内容:
我尝试使用在单独的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有办法忽略密钥的权限 - 默认情况下它强制执行644或更少,我相信 - 然后上述解决方案是可能的。我很惊讶我没有找到任何方法来做到这一点,但我的google-fu总是出现结果,说你只需要正确设置权限。
理想情况下,我希望在容器中有一个密钥,以便将来使用其他回购扩展此项目。可能有其他一些方法可以做到这一点,我没有想过或尝试过。
我考虑过尝试在环境变量中使用OAuth密钥,然后使用它来通过HTTPS克隆repo。这不太理想,但如果它有效,我会接受它。现在唯一阻止我这样做的是我无法使用部署密钥。如果有一种方法可以使用部署密钥使用OAuth,我还没有找到它,但如果有人知道更多,它可能是解决方案。
回购中没有任何东西我会在码头图像中感到不舒服,所以我可以走这条路。这个问题是我需要能够下载回购的更新。如果我把它放在容器中,我将无法在没有钥匙的情况下拉动它。可能有一些解决方法,我没有尝试过。
我觉得我什么都没有尝试,所以任何建议都值得一试。
This question与我正在尝试的非常相似,但我觉得因为他们不使用Kubernetes而且我是,因为秘密和安装文件的不同方法,所以值得单独发布。
This question讨论了如何将SSH密钥放入Kubernetes的容器中,但是我并没有因为使用git而不是SSH,所以我认为这应该是它自己的问题。
答案 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