如何在使用 '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 ... 创建部署orjob` 对象。当 pod 执行终止时作业完成,您可以检查日志。

Take a look here and here for the termination

如果你指定正确,你可以使用覆盖,它最后是一个数组,我花了一点时间才弄清楚,下面的工作至少适用于 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"}] } }'