使用'kubectl run'命令时如何传递图像拉秘密?

noo*_*rul 24 kubernetes kubectl

我正在尝试使用kubectl run命令从私有注册表中提取图像并从中运行命令.但我没有看到指定图像拉秘密的选项.看起来像是无法将图像密码作为运行命令的一部分传递.

是否有任何备用选项来拉动容器并使用kubectl运行命令?应在控制台上看到命令输出.一旦命令完成,pod应该死掉.

小智 23

你可以docker-registry按@ MarkO'Connor链接中的描述创建秘密,然后将其添加到默认的ServiceAccount.这是代表豆荚的SA,包括拉动它们的图像.

添加ImagePullSecrets到服务帐户:

$ 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
Run Code Online (Sandbox Code Playgroud)

现在,在当前命名空间中创建的任何新pod都会将其添加到其规范中:

spec:
  imagePullSecrets:
  - name: myregistrykey
Run Code Online (Sandbox Code Playgroud)

  • 更简单:`kubectl patch serviceaccount default -p'{"imagePullSecrets":[{"name":"myregistrykey"}]}'` (15认同)
  • @KostasDemiris`kubectl patch serviceaccount default -p'{"imagePullSecrets":[{"name":"myregistrykey"}]}'`应该工作 (4认同)

Elm*_*ber 18

你可以使用覆盖,如果你指定它是正确的,它最后是一个数组,我需要一点点弄清楚,下面的Kubernetes至少可以使用1.6:

--overrides='{ "apiVersion": "v1", "spec": { "imagePullSecrets": [{"name": "your-secret"}] } }'

例如

kubectl run -i -t hello-world --restart=Never --rm=true \ --image=eu.gcr.io/your-registry/hello-world \ --overrides='{ "apiVersion": "v1", "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'

  • 就我在 Azure 中的情况而言: `--overrides='{ "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'` (8认同)
  • 就我而言,它使用以下覆盖: `--overrides='{ "apiVersion": "apps/v1", "spec": { "template": { "spec": { "imagePullSecrets": [{"name ": "您的注册表秘密"}] } } } }'` (3认同)
  • 就我而言,“overrides”似乎需要是 pod 定义对象而不是部署定义对象。这意味着将对象展开两次: `--overrides='{ "apiVersion": "v1", "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'` (3认同)
  • 对于 Windows,您需要转义双引号(并删除两个单引号)。你会得到类似 `--overrides="{ \"apiVersion\": \"v1\", ...}] } }"` (2认同)

mar*_*tvz 9

由于kubectl run现在只部署一个 Pod,正确的覆盖是:

kubectl run --image=your.private.registry/nginx nginx --overrides='{ "spec": { "imagePullSecrets": [{"name": "your-registry-secret"}] } }'
Run Code Online (Sandbox Code Playgroud)


Par*_*dar 8

Windows 上,您可以执行patch,但是当它显示 JSON 错误时,您必须执行此技巧(使用 PowerShell):

> $imgsec=  '{"imagePullSecrets": [{"name": "myregistrykey"}]}' | ConvertTo-Json
> kubectl patch serviceaccount default -p $imgsec
Run Code Online (Sandbox Code Playgroud)

另外,如果你想更新/附加 imagePullSecret ,那么你应该使用这样的东西:

> $imgsec=  '[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"myregistrykey2"}}]' | ConvertTo-Json

> kubectl patch serviceaccount default --type='json' -p  $imgsec
Run Code Online (Sandbox Code Playgroud)

.


Oli*_*ver 8

通常,当您需要kubectl run它时,是因为您正在测试一些临时的东西,在一个已经拥有 docker 注册表秘密来访问私有注册表的命名空间中。因此,最简单的方法是编辑默认服务帐户,以在不存在 pull secret 时为其提供要使用的 pull secret(对于 来说就是这种情况kubectl run):

kubectl edit serviceaccount default
Run Code Online (Sandbox Code Playgroud)

编辑将显示与此类似的内容:

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
Run Code Online (Sandbox Code Playgroud)

只需附加一个imagePullSecrets

imagePullSecrets:
- name: <name-of-your-docker-registry-password-secret>
Run Code Online (Sandbox Code Playgroud)

所以它看起来像这样:

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>
Run Code Online (Sandbox Code Playgroud)

假设 name is YOUR_PWD_SECRET,那么这个秘密必须存在于 kubectl 上下文的命名空间中:

tooluser:/host $ kubectl get secret YOUR_PWD_SECRET
NAME              TYPE                             DATA   AGE
YOUR_PWD_SECRET   kubernetes.io/dockerconfigjson   1      186d
Run Code Online (Sandbox Code Playgroud)

如果它不存在,您必须创建它,从头开始或从另一个命名空间复制它(最好的方法是由 NicoKowe 在/sf/answers/4076488601/回答)。

使用保存您的 docker 注册表密码的秘密、kubectl run将执行的同一命名空间中的秘密,以及kubectl run将秘密列为 imagePullSecrets 的默认服务帐户,它将起作用。