我正在尝试使用 kubectl run 命令从私有注册表中提取图像并从中运行命令。但我没有看到指定图像拉取机密的选项。看起来不可能将图像机密作为运行命令的一部分传递。
是否有任何替代选项来拉容器并使用 kubectl 运行命令?应在控制台上看到命令输出。同样,一旦命令完成,吊舱应该会死掉。
我正在尝试使用 kubectl run 命令从私有注册表中提取图像并从中运行命令。但我没有看到指定图像拉取机密的选项。看起来不可能将图像机密作为运行命令的一部分传递。
是否有任何替代选项来拉容器并使用 kubectl 运行命令?应在控制台上看到命令输出。同样,一旦命令完成,吊舱应该会死掉。
如果您指定正确,您可以使用覆盖,它最终是一个数组,这让我有点想明白,以下适用于至少 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"}] } } } }'
您可以docker-registry
按照@MarkO'Connor 链接中的说明创建密钥,然后将其添加到默认的 ServiceAccount。SA 代表 pod 执行操作,包括拉取它们的图像。
$ 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
通常,当您需要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
将起作用。
在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 nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
,但这与您可以使用的并没有太大区别kubectl create -f mypod.json
我认为您追求的不是 aPod
而是 a Job
,例如,如果您需要填充数据库,则可以创建一个容器来执行此操作,并将其作为作业而不是 pod 或副本集运行。
Kubectl run ...
创建部署or
作业`对象。当 pod 执行终止时,作业完成,您可以查看日志。
请尝试以下命令:
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"}]}}}}'