60

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

是否有任何替代选项来拉容器并使用 kubectl 运行命令?应在控制台上看到命令输出。同样,一旦命令完成,吊舱应该会死掉。

4

7 回答 7

50

如果您指定正确,您可以使用覆盖,它最终是一个数组,这让我有点想明白,以下适用于至少 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"}] } } } }'
于 2017-11-07T11:19:28.177 回答
32

您可以docker-registry按照@MarkO'Connor 链接中的说明创建密钥,然后将其添加到默认的 ServiceAccount。SA 代表 pod 执行操作,包括拉取它们的图像。

将 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

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

spec:
  imagePullSecrets:
  - name: myregistrykey
于 2016-11-17T03:15:54.837 回答
10

通常,当您需要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>

假设 name 是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 在https://stackoverflow.com/a/58235551/869951的回答)。

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

于 2020-01-31T23:14:22.690 回答
8

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

.

于 2018-11-26T12:50:03.167 回答
1

据我所知,您不能,但您可以使用kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }' ,但这与您可以使用的并没有太大区别kubectl create -f mypod.json

我认为您追求的不是 aPod而是 a Job,例如,如果您需要填充数据库,则可以创建一个容器来执行此操作,并将其作为作业而不是 pod 或副本集运行。

Kubectl run ...创建部署or作业`对象。当 pod 执行终止时,作业完成,您可以查看日志。

看看这里这里的终止

于 2016-11-18T14:56:49.760 回答
0

请尝试以下命令:

kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1", 
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
于 2020-03-31T09:20:28.577 回答
0

我已经解决了这个问题

kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1", 
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'
于 2020-10-22T14:52:37.400 回答