如何在使用 'kubectl run' 命令时传递图像拉密?
How to pass image pull secret while using 'kubectl run' command?
我正在尝试使用 kubectl 运行 命令从私有注册表中提取图像,然后 运行 从中提取命令。但我没有看到指定图像拉取秘密的选项。似乎无法将图像机密作为 运行 命令的一部分传递。
是否有任何替代选项来使用 kubectl 拉取容器和 运行 命令?命令输出应该可以在控制台上看到。同样,一旦命令完成,pod 就应该死掉。
您可以按照@MarkO'Connor 的 link 所述创建 docker-registry
机密,然后将其添加到默认 ServiceAccount。 SA 代表 pods 行事,包括提取他们的图像。
来自Adding ImagePullSecrets to a service account:
$ kubectl create secret docker-registry myregistrykey --docker-username=janedoe --docker-password=●●●●●●●●●●● --docker-email=jdoe@example.com
secret "myregistrykey" created
$ kubectl get serviceaccounts default -o yaml > ./sa.yaml
$ cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
resourceVersion: "243024"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
$ vi sa.yaml
[editor session not shown]
[delete line with key "resourceVersion"]
[add lines with "imagePullSecret:"]
$ cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: myregistrykey
$ kubectl replace serviceaccount default -f ./sa.yaml
现在,在当前命名空间中创建的任何新 pods 都会将其添加到其规范中:
spec:
imagePullSecrets:
- name: myregistrykey
据我所知你不能,但你可以使用 kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
,但这与你可以用 kubectl create -f mypod.json
做的事情没有太大区别
我认为您想要的不是 Pod
,而是 Job
,例如,如果您需要填充数据库,您可以创建一个容器来执行此操作,并且 运行 它作为一个作业而不是 pod 或副本集。
Kubectl run ...
创建部署or
job` 对象。当 pod 执行终止时作业完成,您可以检查日志。
如果你指定正确,你可以使用覆盖,它最后是一个数组,我花了一点时间才弄清楚,下面的工作至少适用于 1.6 的 Kubernetes:
--overrides='{ "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }'
例如
kubectl run -i -t hello-world --rm --generator=run-pod/v1 \
--image=eu.gcr.io/your-registry/hello-world \
--image-pull-policy="IfNotPresent" \
--overrides='{ "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }'
在 Windows 上,您可以执行 patch
,但由于它显示 JSON 错误,因此您必须执行此技巧(使用 PowerShell):
> $imgsec= '{"imagePullSecrets": [{"name": "myregistrykey"}]}' | ConvertTo-Json
> kubectl patch serviceaccount default -p $imgsec
另外,如果你想更新/附加 imagePullSecret ,那么你应该使用这样的东西:
> $imgsec= '[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"myregistrykey2"}}]' | ConvertTo-Json
> kubectl patch serviceaccount default --type='json' -p $imgsec
.
通常,当您需要 kubectl run
时,这是因为您正在测试一些临时的东西,在已经具有 docker 注册表秘密以访问私有注册表的命名空间中。因此,最简单的方法是编辑默认服务帐户,以在不存在 pull secret 时为其提供 pull secret(kubectl run
就是这种情况):
kubectl edit serviceaccount default
编辑将显示类似于此的内容:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2019-04-16T14:48:17Z"
name: default
namespace: integration-testing
resourceVersion: "60516585"
selfLink: /api/v1/namespaces/integration-testing/serviceaccounts/default
uid: ab7b767d-6056-11e9-bba8-0ecf3bdac4a0
secrets:
- name: default-token-4nnk4
只需附加一个 imagePullSecrets
:
imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>
所以它看起来像这样:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2019-04-16T14:48:17Z"
name: default
namespace: integration-testing
resourceVersion: "60516585"
selfLink: /api/v1/namespaces/integration-testing/serviceaccounts/default
uid: ab7b767d-6056-11e9-bba8-0ecf3bdac4a0
secrets:
- name: default-token-4nnk4
imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>
假设名称是 YOUR_PWD_SECRET
,那么这个秘密必须存在于 kubectl 上下文的命名空间中:
tooluser:/host $ kubectl get secret YOUR_PWD_SECRET
NAME TYPE DATA AGE
YOUR_PWD_SECRET kubernetes.io/dockerconfigjson 1 186d
如果它不存在,您必须创建它,从头开始或从另一个命名空间复制它(最好的方法是由 NicoKowe 在 上回答)。
使用保存您的 docker 注册表密码的秘密,该秘密位于将执行 kubectl run
的同一名称空间中,并且使用将秘密列为 imagePullSecrets 的默认服务帐户,kubectl run
会起作用。
请尝试以下命令:
kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1",
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
我已经通过
解决了问题
kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1",
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
因为 kubectl run
现在只部署一个 pod,正确的覆盖应该是:
kubectl run --image=your.private.registry/nginx nginx --overrides='{ "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'
我正在尝试使用 kubectl 运行 命令从私有注册表中提取图像,然后 运行 从中提取命令。但我没有看到指定图像拉取秘密的选项。似乎无法将图像机密作为 运行 命令的一部分传递。
是否有任何替代选项来使用 kubectl 拉取容器和 运行 命令?命令输出应该可以在控制台上看到。同样,一旦命令完成,pod 就应该死掉。
您可以按照@MarkO'Connor 的 link 所述创建 docker-registry
机密,然后将其添加到默认 ServiceAccount。 SA 代表 pods 行事,包括提取他们的图像。
来自Adding ImagePullSecrets to a service account:
$ kubectl create secret docker-registry myregistrykey --docker-username=janedoe --docker-password=●●●●●●●●●●● --docker-email=jdoe@example.com
secret "myregistrykey" created
$ kubectl get serviceaccounts default -o yaml > ./sa.yaml
$ cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
resourceVersion: "243024"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
$ vi sa.yaml
[editor session not shown]
[delete line with key "resourceVersion"]
[add lines with "imagePullSecret:"]
$ cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: myregistrykey
$ kubectl replace serviceaccount default -f ./sa.yaml
现在,在当前命名空间中创建的任何新 pods 都会将其添加到其规范中:
spec:
imagePullSecrets:
- name: myregistrykey
据我所知你不能,但你可以使用 kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
,但这与你可以用 kubectl create -f mypod.json
我认为您想要的不是 Pod
,而是 Job
,例如,如果您需要填充数据库,您可以创建一个容器来执行此操作,并且 运行 它作为一个作业而不是 pod 或副本集。
Kubectl run ...
创建部署or
job` 对象。当 pod 执行终止时作业完成,您可以检查日志。
如果你指定正确,你可以使用覆盖,它最后是一个数组,我花了一点时间才弄清楚,下面的工作至少适用于 1.6 的 Kubernetes:
--overrides='{ "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }'
例如
kubectl run -i -t hello-world --rm --generator=run-pod/v1 \
--image=eu.gcr.io/your-registry/hello-world \
--image-pull-policy="IfNotPresent" \
--overrides='{ "spec": { "template": { "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } } } }'
在 Windows 上,您可以执行 patch
,但由于它显示 JSON 错误,因此您必须执行此技巧(使用 PowerShell):
> $imgsec= '{"imagePullSecrets": [{"name": "myregistrykey"}]}' | ConvertTo-Json
> kubectl patch serviceaccount default -p $imgsec
另外,如果你想更新/附加 imagePullSecret ,那么你应该使用这样的东西:
> $imgsec= '[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"myregistrykey2"}}]' | ConvertTo-Json
> kubectl patch serviceaccount default --type='json' -p $imgsec
.
通常,当您需要 kubectl run
时,这是因为您正在测试一些临时的东西,在已经具有 docker 注册表秘密以访问私有注册表的命名空间中。因此,最简单的方法是编辑默认服务帐户,以在不存在 pull secret 时为其提供 pull secret(kubectl run
就是这种情况):
kubectl edit serviceaccount default
编辑将显示类似于此的内容:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2019-04-16T14:48:17Z"
name: default
namespace: integration-testing
resourceVersion: "60516585"
selfLink: /api/v1/namespaces/integration-testing/serviceaccounts/default
uid: ab7b767d-6056-11e9-bba8-0ecf3bdac4a0
secrets:
- name: default-token-4nnk4
只需附加一个 imagePullSecrets
:
imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>
所以它看起来像这样:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2019-04-16T14:48:17Z"
name: default
namespace: integration-testing
resourceVersion: "60516585"
selfLink: /api/v1/namespaces/integration-testing/serviceaccounts/default
uid: ab7b767d-6056-11e9-bba8-0ecf3bdac4a0
secrets:
- name: default-token-4nnk4
imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>
假设名称是 YOUR_PWD_SECRET
,那么这个秘密必须存在于 kubectl 上下文的命名空间中:
tooluser:/host $ kubectl get secret YOUR_PWD_SECRET
NAME TYPE DATA AGE
YOUR_PWD_SECRET kubernetes.io/dockerconfigjson 1 186d
如果它不存在,您必须创建它,从头开始或从另一个命名空间复制它(最好的方法是由 NicoKowe 在
使用保存您的 docker 注册表密码的秘密,该秘密位于将执行 kubectl run
的同一名称空间中,并且使用将秘密列为 imagePullSecrets 的默认服务帐户,kubectl run
会起作用。
请尝试以下命令:
kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1",
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
我已经通过
解决了问题kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1",
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
因为 kubectl run
现在只部署一个 pod,正确的覆盖应该是:
kubectl run --image=your.private.registry/nginx nginx --overrides='{ "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'