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

时间:2016-10-27 15:02:48

标签: kubernetes kubectl

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

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

7 个答案:

答案 0 :(得分:18)

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

来自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

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

spec:
  imagePullSecrets:
  - name: myregistrykey

答案 1 :(得分:12)

你可以使用覆盖,如果你指定它,它最后是一个数组,这让我有点想弄清楚,下面的工作至少是1.6的Kubernetes:

--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"}] } }'

答案 2 :(得分:6)

通常,当您需要kubectl时,是因为您正在测试一个临时的东西,而这个名字空间已经具有docker注册表秘密来访问私有注册表。因此,最简单的方法是编辑默认服务帐户,以在不存在拉锁秘密时为它提供拉锁秘密(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

说的名字是tooluser:/host $ kubectl get secret YOUR_PWD_SECRET NAME TYPE DATA AGE YOUR_PWD_SECRET kubernetes.io/dockerconfigjson 1 186d ,那么此秘密必须存在于kubectl上下文的名称空间中:

kubectl run

如果不存在,则必须从头创建或从另一个命名空间复制它(最好的方法是NicoKowe在https://stackoverflow.com/a/58235551/869951回答)。

使用一个秘密密钥来保存您的docker注册表密码,该秘密密钥将在执行kubectl run的同一名称空间中使用,并且使用默认服务帐户将该秘密密钥作为imagePullSecrets列出,{{1}}将起作用。

答案 3 :(得分:2)

据我所知你不能,但你可以使用kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }' ,但这与你使用kubectl create -f mypod.json

所做的不同

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

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

Take a look herehere for the termination

答案 4 :(得分:2)

在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

答案 5 :(得分:0)

请尝试以下命令:

kubectl run nginx--image=nginx --overrides='{"apiVersion": "apps/v1", 
"spec": {"template":{"spec":{"imagePullSecrets": [{"name": "secret-name"}]}}}}'

答案 6 :(得分:0)

我很喜欢这个问题 kubectl运行nginx--image = nginx --overrides ='{“ apiVersion”:“ apps / v1”, “ spec”:{“ template”:{“ spec”:{“ imagePullSecrets”:[{“ name”:“ secret-name”}]}}}}}'