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

如何解决使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?