通过循环在 YAML 文件中添加值
Adding values in a YAML file via loop
作为 Kubernetes 资源定义的一部分,我想将某些 IP 列入白名单。 IP列表可以通过
找到
$ kubectl get nodes -o wide --no-headers | awk '{print }'
#This prints something like
51.52.215.214
18.170.74.10
.....
现在,
在 Kubernetes 部署文件中(比如 deployment.yaml),我想遍历这些值并将它们列入白名单。
我知道我们可以通过在 loadBalancerSourceRanges 下添加像
这样的白名单
#part of the deployment.yaml
loadBalancerSourceRanges
- 51.52.112.111
- 18.159.75.11
我想更新上面的 loadBalancerSourceRanges 以包含的输出
$ kubectl 获取节点 -o wide --no-headers | awk '{print $7}'
我该怎么做?我不想对主机 IP 进行硬编码,而是想通过 bash 或 ansible 或任何其他可能的清洁方式以编程方式包含。
提前致谢,
JE
这是一件非常 use-specific 的事情,你最好研究一下 kustomize。也就是说,您可以制作一个临时文件,您可以在部署前对其进行更改。
cp deployment.yaml temp.yaml
kubectl get nodes -o wide --no-headers |
awk '{print }' |
xargs -I{} sed -Ei "s/^(\s+)(loadBalancerSourceRanges:)/\n - {}/" temp.yaml
kubectl apply -f temp.yaml
它查找 yaml 的 loadBalancerSourceRanges:
部分,它在“模板”上不应该有任何值,然后用 kubectl get nodes -o wide --no-headers | awk '{print }'
提供的任何内容填充它。
loadBalancerSourceRanges
应该是服务的一部分,而不是部署
您可以使用以下 oneliner 动态修补您的服务:
kubectl patch service YOUR_SERVICE_NAME -p "{\"spec\":{\"loadBalancerSourceRanges\": [$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="InternalIP")]}"{.address}/32",{end}' | sed 's/,*$//g')]}}"
,您应该将 YOUR_SERVICE_NAME
替换为实际服务名称
解释一下这里发生了什么:
我们正在使用 kubectl patch
来修补现有资源,在我们的例子中 - spec.loadBalancerSourceRanges
.
- 我们将子外壳放在
[$(..)]
中,因为 loadBalancerSourceRanges
需要字符串数组
kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="InternalIP")]}"{.address}/32",{end}'
- 从您的节点获取 InternalIP,将 /32
添加到每个节点,因为 loadBalancerSourceRanges
需要 ranges,包含每个范围在 "
中,然后在每个值之间放置逗号。
sed 's/,*$//g'
- 删除尾随逗号
使用 jsonpath 比 awk/cut 更好,因为我们不依赖于 kubectl 列排序并且只从 API.
获取与我们相关的信息
我同意@Kaffe Myers 的观点,您应该尝试使用 kustomize 或 helm 或其他模板引擎,因为它们应该更适合这项工作。
您可以使用yq
# empty array if necessary
yq -i '.loadBalancerSourceRanges = []' file.yaml
# In my env (AWS EKS) the IP is field 6 (change if needed)
for host in $(kubectl get nodes -o wide --no-headers | awk '{print }')
do
yq -i '.loadBalancerSourceRanges += ["'${host}'"]' file.yaml
done
-i 参数是将更改应用到文件(类似于 sed)
如果"loadBalancerSourceRanges"在"config"里面,你可以使用:" .config.loadBalancerSourceRanges"
作为 Kubernetes 资源定义的一部分,我想将某些 IP 列入白名单。 IP列表可以通过
找到$ kubectl get nodes -o wide --no-headers | awk '{print }'
#This prints something like
51.52.215.214
18.170.74.10
.....
现在, 在 Kubernetes 部署文件中(比如 deployment.yaml),我想遍历这些值并将它们列入白名单。 我知道我们可以通过在 loadBalancerSourceRanges 下添加像
这样的白名单#part of the deployment.yaml
loadBalancerSourceRanges
- 51.52.112.111
- 18.159.75.11
我想更新上面的 loadBalancerSourceRanges 以包含的输出 $ kubectl 获取节点 -o wide --no-headers | awk '{print $7}'
我该怎么做?我不想对主机 IP 进行硬编码,而是想通过 bash 或 ansible 或任何其他可能的清洁方式以编程方式包含。
提前致谢, JE
这是一件非常 use-specific 的事情,你最好研究一下 kustomize。也就是说,您可以制作一个临时文件,您可以在部署前对其进行更改。
cp deployment.yaml temp.yaml
kubectl get nodes -o wide --no-headers |
awk '{print }' |
xargs -I{} sed -Ei "s/^(\s+)(loadBalancerSourceRanges:)/\n - {}/" temp.yaml
kubectl apply -f temp.yaml
它查找 yaml 的 loadBalancerSourceRanges:
部分,它在“模板”上不应该有任何值,然后用 kubectl get nodes -o wide --no-headers | awk '{print }'
提供的任何内容填充它。
loadBalancerSourceRanges
应该是服务的一部分,而不是部署
您可以使用以下 oneliner 动态修补您的服务:
kubectl patch service YOUR_SERVICE_NAME -p "{\"spec\":{\"loadBalancerSourceRanges\": [$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="InternalIP")]}"{.address}/32",{end}' | sed 's/,*$//g')]}}"
,您应该将 YOUR_SERVICE_NAME
替换为实际服务名称
解释一下这里发生了什么:
我们正在使用 kubectl patch
来修补现有资源,在我们的例子中 - spec.loadBalancerSourceRanges
.
- 我们将子外壳放在
[$(..)]
中,因为loadBalancerSourceRanges
需要字符串数组 kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="InternalIP")]}"{.address}/32",{end}'
- 从您的节点获取 InternalIP,将/32
添加到每个节点,因为loadBalancerSourceRanges
需要 ranges,包含每个范围在"
中,然后在每个值之间放置逗号。sed 's/,*$//g'
- 删除尾随逗号
使用 jsonpath 比 awk/cut 更好,因为我们不依赖于 kubectl 列排序并且只从 API.
获取与我们相关的信息我同意@Kaffe Myers 的观点,您应该尝试使用 kustomize 或 helm 或其他模板引擎,因为它们应该更适合这项工作。
您可以使用yq
# empty array if necessary
yq -i '.loadBalancerSourceRanges = []' file.yaml
# In my env (AWS EKS) the IP is field 6 (change if needed)
for host in $(kubectl get nodes -o wide --no-headers | awk '{print }')
do
yq -i '.loadBalancerSourceRanges += ["'${host}'"]' file.yaml
done
-i 参数是将更改应用到文件(类似于 sed)
如果"loadBalancerSourceRanges"在"config"里面,你可以使用:" .config.loadBalancerSourceRanges"