从文件或 json 修补配置映射
patch a configmap from file or with json
我想在 vagrant 部署期间从 aws-auth
编辑一个 configmap,让我的 vagrant 用户可以访问 EKS 集群。我需要将一个片段添加到现有的 aws-auth
configmap 中。我如何以编程方式执行此操作?
如果你做 kubectl edit -n kube-system configmap/aws-auth
你会得到
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::123:role/nodegroup-abc123
username: system:node:{{EC2PrivateDNSName}}
kind: ConfigMap
metadata:
creationTimestamp: "2019-05-30T03:00:18Z"
name: aws-auth
namespace: kube-system
resourceVersion: "19055217"
selfLink: /api/v1/namespaces/kube-system/configmaps/aws-auth
uid: 0000-0000-0000
我需要以某种方式在其中输入这个位。
mapUsers: |
- userarn: arn:aws:iam::123:user/sergeant-poopie-pants
username: sergeant-poopie-pants
groups:
- system:masters
我试过 cat <<EOF > {file} EOF
然后从文件打补丁。但该选项仅在 create
上下文中 patch
中不存在。
我还发现了这个:How to patch a ConfigMap in Kubernetes
但似乎没有用。或许我并没有真正理解所提出的解决方案。
有几种方法可以使事情自动化。直接的方式是 kubectl get configmap -o yaml ... > cm.yml && patch ... < cm.yml > cm2.yml && kubectl apply -f cm2.yml
或类似的方式。您可能希望使用解析和修改 YAML 数据的脚本而不是文字补丁来使其不那么脆弱。你也可以做类似 EDITOR="myeditscript" kubectl edit configmap ...
的事情,但那比我想做的更聪明。
首先,请注意 mapRoles
和 mapUsers
实际上被视为字符串,即使它是结构化数据 (yaml)。
虽然这个问题可以通过 jsonpatch 解决,但使用 jq
和 kubectl apply
会更容易:
kubectl get cm aws-auth -o json \
| jq --arg add "`cat add.yaml`" '.data.mapUsers = $add' \
| kubectl apply -f -
其中 add.yaml
是这样的(注意缺少额外的缩进):
- userarn: arn:aws:iam::123:user/sergeant-poopie-pants
username: sergeant-poopie-pants
groups:
- system:masters
另请参阅 https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html 了解更多信息。
这是一个 kubectl patch
用于修补 aws-auth
配置映射的单行代码:
kubectl patch configmap -n kube-system aws-auth -p '{"data":{"mapUsers":"[{\"userarn\": \"arn:aws:iam::0000000000000:user/john\", \"username\": \"john\", \"groups\": [\"system:masters\"]}]"}}'
我想在 vagrant 部署期间从 aws-auth
编辑一个 configmap,让我的 vagrant 用户可以访问 EKS 集群。我需要将一个片段添加到现有的 aws-auth
configmap 中。我如何以编程方式执行此操作?
如果你做 kubectl edit -n kube-system configmap/aws-auth
你会得到
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::123:role/nodegroup-abc123
username: system:node:{{EC2PrivateDNSName}}
kind: ConfigMap
metadata:
creationTimestamp: "2019-05-30T03:00:18Z"
name: aws-auth
namespace: kube-system
resourceVersion: "19055217"
selfLink: /api/v1/namespaces/kube-system/configmaps/aws-auth
uid: 0000-0000-0000
我需要以某种方式在其中输入这个位。
mapUsers: |
- userarn: arn:aws:iam::123:user/sergeant-poopie-pants
username: sergeant-poopie-pants
groups:
- system:masters
我试过 cat <<EOF > {file} EOF
然后从文件打补丁。但该选项仅在 create
上下文中 patch
中不存在。
我还发现了这个:How to patch a ConfigMap in Kubernetes
但似乎没有用。或许我并没有真正理解所提出的解决方案。
有几种方法可以使事情自动化。直接的方式是 kubectl get configmap -o yaml ... > cm.yml && patch ... < cm.yml > cm2.yml && kubectl apply -f cm2.yml
或类似的方式。您可能希望使用解析和修改 YAML 数据的脚本而不是文字补丁来使其不那么脆弱。你也可以做类似 EDITOR="myeditscript" kubectl edit configmap ...
的事情,但那比我想做的更聪明。
首先,请注意 mapRoles
和 mapUsers
实际上被视为字符串,即使它是结构化数据 (yaml)。
虽然这个问题可以通过 jsonpatch 解决,但使用 jq
和 kubectl apply
会更容易:
kubectl get cm aws-auth -o json \
| jq --arg add "`cat add.yaml`" '.data.mapUsers = $add' \
| kubectl apply -f -
其中 add.yaml
是这样的(注意缺少额外的缩进):
- userarn: arn:aws:iam::123:user/sergeant-poopie-pants
username: sergeant-poopie-pants
groups:
- system:masters
另请参阅 https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html 了解更多信息。
这是一个 kubectl patch
用于修补 aws-auth
配置映射的单行代码:
kubectl patch configmap -n kube-system aws-auth -p '{"data":{"mapUsers":"[{\"userarn\": \"arn:aws:iam::0000000000000:user/john\", \"username\": \"john\", \"groups\": [\"system:masters\"]}]"}}'