使用runAsUser时使git在kubernetes容器中工作

问题描述

我想在Kubernetes窗格中将git作为initContainer的一部分来运行。我还希望容器以任意非root用户身份运行。有什么办法可以做到这一点?

问题是,如果我在广告连播说明中添加了以下内容

securityContext:
  runAsUser: 1234

然后git会像这样失败:

No user exists for uid 1234
fatal: Could not read from remote repository.

错误来自ssh。显而易见的解决方法是通过https:// URL进行克隆,而不是使用ssh,但是我依赖于部署密钥对远程存储库进行只读访问。

我无法让用户进入图像,因为直到运行时我都不知道用户ID。

由于容器以非root用户身份运行,因此我无法在运行时将用户添加/etc/passwd

其他人如何处理这种情况?

万一有人问:

$ kubectl version
Server Version: version.Info{Major:"1",Minor:"18",GitVersion:"v1.18.9+k3s1",GitCommit:"630bebf94b9dce6b8cd3d402644ed023b3af8f90",GitTreeState:"clean",BuildDate:"2020-09-17T19:05:07Z",GoVersion:"go1.13.15",Compiler:"gc",Platform:"linux/amd64"}

解决方法

您可以在容器级别而不是Pod级别使用securityContext。

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
  initContainers:
  - name: sec-ctx-in-init
    image: busybox
    securityContext:
      runAsUser: 2000
    command: ['sh','-c','id']
  containers:
  - name: sec-ctx-in-container
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      runAsUser: 3000
      allowPrivilegeEscalation: false

创建Pod后(我使用katacoda),您可以运行:

master $ kubectl logs security-context-demo -c sec-ctx-in-init
uid=2000 gid=0(root)
master $ kubectl exec -it security-context-demo -c sec-ctx-in-container -- id
uid=3000 gid=0(root) groups=0(root)

通知:如果您实际上是在容器和initcontainer之间共享文件,则需要在Pod级安全性上下文中指定相同的fsGroup