我需要将一个独立的补丁定义为 YAML。
更具体地说,我想执行以下操作:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "registry-my-registry"}]}'
问题是我不能使用kubectl patch
.我正在使用带有 flux 的 GitOps 工作流,而我要修补的资源是在 flux 之外创建的默认资源。
换句话说,我需要执行与上述命令相同的操作,但仅使用kubectl apply
:
kubectl apply patch.yaml
我无法弄清楚您是否可以定义这样的补丁。
关键是我无法预测新集群上默认秘密令牌的名称(因为名称是随机的,即default-token-uudge
(
- 从资源配置中设置和删除的字段将按
Kubectl apply
合并到资源中:- 如果资源已存在,则"应用"将通过合并 本地资源配置到远程资源
- 从资源配置中删除的字段将从远程资源中删除
您可以了解有关 Kubernetes Field Merge Semantics 的更多信息。
-
如果您的限制是不知道秘密
default-token-xxxxx
名称,没问题,只需将该字段排除在您的 yaml 之外即可。 -
只要 yaml 有足够的字段来标识目标资源(名称、种类、命名空间(,它就会添加/编辑您设置的字段。
-
我创建了一个集群(在本例中为 minikube,但它可以是任何集群(并检索了当前的默认服务帐户:
$ kubectl get serviceaccount default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2020-07-01T14:51:38Z"
name: default
namespace: default
resourceVersion: "330"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: a9e5ff4a-8bfb-466f-8873-58c2172a5d11
secrets:
- name: default-token-j6zx2
- 然后,我们创建一个yaml文件,其中包含要添加的内容:
$ cat add-image-pull-secrets.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
imagePullSecrets:
- name: registry-my-registry
- 现在我们申请并验证:
$ kubectl apply -f add-image-pull-secrets.yaml
serviceaccount/default configured
$ kubectl get serviceaccount default -o yaml
apiVersion: v1
imagePullSecrets:
- name: registry-my-registry
kind: ServiceAccount
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","imagePullSecrets":[{"name":"registry-my-registry2"}],"kind":"ServiceAccount","metadata":{"annotations":{},"name":"default","namespace":"default"}}
creationTimestamp: "2020-07-01T14:51:38Z"
name: default
namespace: default
resourceVersion: "2382"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: a9e5ff4a-8bfb-466f-8873-58c2172a5d11
secrets:
- name: default-token-j6zx2
如您所见,ImagePullPolicy 已添加到资源中。
我希望它符合您的需求。如果您有任何其他问题,请在评论中告诉我。
假设您的服务帐户 YAML 看起来像下面这样:
$ kubectl get sa demo -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: demo
namespace: default
secrets:
- name: default-token-uudge
现在,您要添加或更改该服务帐户的imagePullSecrets
。为此,请编辑 YAML 文件并添加imagePullSecrets
。
apiVersion: v1
kind: ServiceAccount
metadata:
name: demo
namespace: default
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: myregistrykey
最后,应用更改:
$ kubectl apply -f service-account.yaml