创建 k8s pod 时如何添加用户名

Posted

技术标签:

【中文标题】创建 k8s pod 时如何添加用户名【英文标题】:How to add an username when create a k8s pod 【发布时间】:2019-08-06 17:13:10 【问题描述】:

我有一个 yaml 文件,用于仅使用一个容器创建 k8s pod。是否可以在创建 k8s pod 时从 yaml 文件中预先添加用户名和密码?

我搜索了许多网站并找到了 env 变量。但是,我无法按照自己的意愿制作吊舱。 pod 创建后,pod 的状态始终显示 Crashoff。

是否可以在 k8s pod 创建过程中从 yaml 文件中预先添加用户名和密码?

以下是我的 yaml 文件:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: centos610-sp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: centos610-sp-v1
    spec:
      containers:
      - name: centos610-pod-v1
        image: centos-done:6.10
        env:
        - name: SSH_USER
          value: "user1"
        - name: SSH_SUDO
          value: "ALL=(ALL) NOPASSWD:ALL"
        - name: PASSWORD
          value: "password"
        command: ["/usr/sbin/useradd"]
        args: ["$(SSH_USER)"]
        ports:
        - containerPort: 22
        resources:
          limits:
            cpu: "500m"
            memory: "1G"
---
apiVersion: v1
kind: Service
metadata:
  name: centos610-sp-v1
  labels:
    app: centos610-sp-v1
spec:
  selector:
    app: centos610-sp-v1
  ports:
  - port: 22
    protocol: TCP
    nodePort: 31022
  type: NodePort
---

我应该使用特定的命令吗

env:
- name: MESSAGE
  value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]

command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]

获取后pod的状态

root@zero:~/k8s-temp# kubectl get pod
NAME                               READY     STATUS             RESTARTS   AGE
centos610-sp-v1-6689c494b8-nb9kv   0/1       CrashLoopBackOff   5          3m

描述后的 pod 状态

root@zero:~/k8s-temp# kubectl describe pod centos610-sp-v1-6689c494b8-nb9kv 
Name:           centos610-sp-v1-6689c494b8-nb9kv
Namespace:      default
Node:           zero/10.111.33.15
Start Time:     Sat, 16 Mar 2019 01:16:59 +0800
Labels:         app=centos610-sp-v1
                pod-template-hash=2245705064
Annotations:    <none>
Status:         Running
IP:             10.233.127.104
Controlled By:  ReplicaSet/centos610-sp-v1-6689c494b8
Containers:
  centos610-pod-v1:
    Container ID:  docker://5fa076c5d245dd532ef7ce724b94033d93642dc31965ab3fbde61dd59bf7d314
    Image:         centos-done:6.10
    Image ID:      docker://sha256:26362e9cefe4e140933bf947e3beab29da905ea5d65f27fc54513849a06d5dd5
    Port:          22/TCP
    Host Port:     0/TCP
    Command:
      /usr/sbin/useradd
    Args:
      $(SSH_USER)
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sat, 16 Mar 2019 01:17:17 +0800
      Finished:     Sat, 16 Mar 2019 01:17:17 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sat, 16 Mar 2019 01:17:01 +0800
      Finished:     Sat, 16 Mar 2019 01:17:01 +0800
    Ready:          False
    Restart Count:  2
    Limits:
      cpu:     500m
      memory:  1G
    Requests:
      cpu:     500m
      memory:  1G
    Environment:
      SSH_USER:  user1
      SSH_SUDO:  ALL=(ALL) NOPASSWD:ALL
      PASSWORD:  password
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-qbd8x (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          False 
  PodScheduled   True 
Volumes:
  default-token-qbd8x:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-qbd8x
    Optional:    false
QoS Class:       Guaranteed
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason                 Age               From               Message
  ----     ------                 ----              ----               -------
  Normal   Scheduled              22s               default-scheduler  Successfully assigned centos610-sp-v1-6689c494b8-nb9kv to zero
  Normal   SuccessfulMountVolume  22s               kubelet, zero      MountVolume.SetUp succeeded for volume "default-token-qbd8x"
  Normal   Pulled                 5s (x3 over 21s)  kubelet, zero      Container image "centos-done:6.10" already present on machine
  Normal   Created                5s (x3 over 21s)  kubelet, zero      Created container
  Normal   Started                4s (x3 over 21s)  kubelet, zero      Started container
  Warning  BackOff                4s (x3 over 19s)  kubelet, zero      Back-off restarting failed container

2019/03/18 更新

虽然不建议从 pod 的 yaml 中预先添加用户名和密码,但我只想澄清如何使用 yaml 文件中的命令和参数。最后,我使用以下 yaml 文件成功创建了用户名“user1”和密码“1234”。感谢大家的精彩回答,让我更加熟悉 k8s 关于 configMap、RBAC、容器的行为。

其实这个链接给了我一个关于如何使用command & args的参考

How to set multiple commands in one yaml file with Kubernetes?

这是我最终的 yaml 文件内容:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: centos610-sp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: centos610-sp-v1
    spec:
      containers:
      - name: centos610-pod-v1
        image: centos-done:6.10
        env:
        - name: SSH_USER
          value: "user1"
        - name: SSH_SUDO
          value: "ALL=(ALL) NOPASSWD:ALL"
        - name: PASSWORD
          value: "password"
        command: ["/bin/bash", "-c"]
        args: ["useradd $(SSH_USER); service sshd restart; echo $(SSH_USER):1234 | chpasswd; tail -f /dev/null"]
        ports:
        - containerPort: 22
        resources:
          limits:
            cpu: "500m"
            memory: "1G"
---
apiVersion: v1
kind: Service
metadata:
  name: centos610-sp-v1
  labels:
    app: centos610-sp-v1
spec:
  selector:
    app: centos610-sp-v1
  ports:
  - port: 22
    protocol: TCP
    nodePort: 31022
  type: NodePort
---

【问题讨论】:

向容器添加用户想要实现什么? 例如,这个容器将提供给我的同事/客户,他们更喜欢他们的专用用户名和密码。这就是为什么我要添加用户名和密码 但是容器不是服务器,你需要在 kubernetes 中配置 rbac 并让他们访问这个部署 这不是容器应该被使用的方式。您似乎想将容器用作 VM。无论如何,它们不是在容器中运行的 SSH 守护进程,所以我不知道你从中得到了什么。 您在 RBAC 中的角色可能类似于 kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list"] - apiGroups: [""] resources: ["pods/exec"] verbs: ["create"] 【参考方案1】:

将用户名和密码保存在 configMap 或机密对象中。将这些值作为环境变量加载到容器中

按照参考 https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

【讨论】:

您好 Ekambaram,您能否为我提供一些示例或参考链接?对不起,我是k8s世界的菜鸟。 参考我的回答中的链接 这对我来说是最好的方法,因为即使使用设置 runAsUser: 的 securityContext 以非特权方式运行 Pod 也可以工作【参考方案2】:

如果您无论如何都想添加用户,不管您可以使用 A kubernetes 原生方式实现相同的事情,那么 请改为在 Docker 映像中设置您的用户( Dockerfile 然后构建它)。

希望这会有所帮助。

【讨论】:

您好 ljaz,谢谢您的回答。我会尝试在功能中使用您的建议。【参考方案3】:

2019/03/18 更新

虽然不建议从 pod 的 yaml 中预先添加用户名和密码,但我只想澄清如何使用 yaml 文件中的命令和参数。最后,我使用以下 yaml 文件成功创建了用户名“user1”和密码“1234”。感谢大家的精彩回答,让我更加熟悉 k8s 关于 configMap、RBAC、容器的行为。

其实这个链接给了我一个关于如何使用command & args的参考

如何在 Kubernetes 的一个 yaml 文件中设置多个命令?

这是我最终的 yaml 文件内容:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: centos610-sp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: centos610-sp-v1
    spec:
      containers:
      - name: centos610-pod-v1
        image: centos-done:6.10
        env:
        - name: SSH_USER
          value: "user1"
        - name: SSH_SUDO
          value: "ALL=(ALL) NOPASSWD:ALL"
        - name: PASSWORD
          value: "password"
        command: ["/bin/bash", "-c"]
        args: ["useradd $(SSH_USER); service sshd restart; echo $(SSH_USER):1234 | chpasswd; tail -f /dev/null"]
        ports:
        - containerPort: 22
        resources:
          limits:
            cpu: "500m"
            memory: "1G"
---
apiVersion: v1
kind: Service
metadata:
  name: centos610-sp-v1
  labels:
    app: centos610-sp-v1
spec:
  selector:
    app: centos610-sp-v1
  ports:
  - port: 22
    protocol: TCP
    nodePort: 31022
  type: NodePort
---

【讨论】:

以上是关于创建 k8s pod 时如何添加用户名的主要内容,如果未能解决你的问题,请参考以下文章

k8s之pods

k8s的进阶--05

k8s之Label

k8s之Label

简洁实用轻松学会k8s的pod控制器DaemonSet(DS)

简洁实用轻松学会k8s的pod控制器DaemonSet(DS)