创建 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:如果您无论如何都想添加用户,不管您可以使用 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 时如何添加用户名的主要内容,如果未能解决你的问题,请参考以下文章