通过循环在 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
  1. -i 参数是将更改应用到文件(类似于 sed)

  2. 如果"loadBalancerSourceRanges""config"里面,你可以使用:" .config.loadBalancerSourceRanges"