【问题标题】:Adding values in a YAML file via loop通过循环在 YAML 文件中添加值
【发布时间】:2022-02-01 01:51:46
【问题描述】:

作为 Kubernetes 资源定义的一部分,我想将某些 IP 列入白名单。 IP列表可以通过

找到
$ kubectl get nodes -o wide --no-headers | awk '{print $7}'
#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 宽 --no-headers | awk '{打印 $7}'

我该怎么做?我不想硬编码主机 IP,而是希望通过 bash 或 ansible 或任何其他更简洁的方式以编程方式包含。

提前致谢, 乙肝

【问题讨论】:

  • 请添加更多详细信息,完整的deployment 文件可能会有用。使用像yq 这样的工具不会那么难。
  • @java_enthu 已经提供了 3 个答案。它们中的任何一个有用吗?如果它解决了您的问题,请考虑接受答案 (stackoverflow.com/help/accepted-answer)。
  • @AndrewSkorkin 感谢您的“温柔提醒”:-)。

标签: bash kubernetes amazon-ec2 ansible ansible-facts


【解决方案1】:

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

  • 我们将子shell 放入[$(..)],因为loadBalancerSourceRanges 需要字符串数组
  • kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="InternalIP")]}"{.address}/32",{end}' - 从您的节点获取内部IP,将/32 添加到每个节点,因为loadBalancerSourceRanges 需要范围,将每个范围括在" 中,然后在每个值之间放置逗号。李>
  • sed 's/,*$//g' - 删除尾随逗号

使用 jsonpath 比 awk/cut 更好,因为我们不依赖 kubectl 列排序,并且只从 API 获取与我们相关的信息。

我同意 @Kaffe Myers 的观​​点,您应该尝试使用 kustomize 或 helm 或其他模板引擎,因为它们应该更适合这项工作。

【讨论】:

  • 这看起来不错。我会试一试。谢谢
【解决方案2】:

这是一个非常有用途的东西,你最好研究一下kustomize。话虽如此,您可以制作一个临时文件,在部署之前对其进行更改。

cp deployment.yaml temp.yaml
kubectl get nodes -o wide --no-headers |
    awk '{print $7}' |
    xargs -I{} sed -Ei "s/^(\s+)(loadBalancerSourceRanges:)/\1\2\n\1  - {}/" temp.yaml

kubectl apply -f temp.yaml

它查找 yaml 的 loadBalancerSourceRanges: 部分,它在“模板”上不应该有任何值,然后用 kubectl get nodes -o wide --no-headers | awk '{print $7}' 提供的任何值填充它。

【讨论】:

    【解决方案3】:

    您可以使用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 $6}')
    do
      yq -i '.loadBalancerSourceRanges += ["'${host}'"]' file.yaml
    done
    
    1. -i 参数是将更改应用到文件(如 sed)

    2. 如果 "loadBalancerSourceRanges""config" 内,您可以使用:".config.loadBalancerSourceRanges"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2011-11-07
      • 2014-05-31
      • 1970-01-01
      相关资源
      最近更新 更多