簡體   English   中英

如何將變量傳遞給 kubectl 部署?

[英]How do I pass a variable to a kubectl deployment?

我正在嘗試對大量部署的計算請求進行快速調整,而不是在結果證明我們需要稍微更改數字時必須獲得 PR 批准。 我需要能夠將一個變量傳遞給應用的 yaml 文件。

下面的例子。

外殼腳本:

#!/bin/bash

APPCENTER=(pa nyc co nc md sc mi)
for ac in "${APPCENTER[@]}"
do
  kubectl apply -f jobs-reqtweaks.yaml --env=APPCENTER=$ac
  kubectl apply -f queue-reqtweaks.yaml --env=APPCENTER=$ac
  kubectl apply -f web-reqtweaks.yaml --env=APPCENTER=$ac
done

YAML 部署文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: example-app
    app.kubernetes.io/managed-by: Helm
    appcenter: $APPCENTER
    chart: example-app-0.1.0
    component: deployment-name
    heritage: Tiller
    release: example-app-fb-feature-tp-1121-fb-pod-resizing
  name: $APPCENTER-deployment-name
  namespace: example-app-fb-feature-tp-1121-fb-pod-resizing
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: example-app
      appcenter: $APPCENTER
      chart: example-app-0.1.0
      component: deployment-name
      heritage: Tiller
      release: example-app-fb-feature-tp-1121-fb-pod-resizing
  template:
    metadata:
      labels:
        app: example-app
        appcenter: $APPCENTER
        chart: example-app-0.1.0
        component: deployment-name
        heritage: Tiller
        release: example-app-fb-feature-tp-1121-fb-pod-resizing
    spec:
      containers:
        name: deployment-name
        resources:
          limits:
            memory: "400Mi"
            cpu: "10m"
          requests:
            cpu: 11m
            memory: 641Mi

kubectl apply不接受--env標志( kubectl apply --help )。

您有多種選擇:

  1. sed -- 將 YAML 視為文本文件
  2. yq -- 將 YAML 視為 YAML

定義常量:

# The set of YAML files you want to change
FILES=(
  "jobs-reqtweaks.yaml"
  "queue-reqtweaks.yaml"
  "web-reqtweaks.yaml"
)

# The set of data-centers
APPCENTER=(pa nyc co nc md sc mi)

然后,要么使用sed

# Iterate over the data-centers
for ac in "${APPCENTER[@]}"
do
  # Iterate over the files
  for FILE in ${FILES[@]}
  do
    sed \
    --expression="s|\$APPCENTER|${ac}|g" \
    ${FILE}| kubectl apply --filename=-
  done
done

或使用yq

# Iterate over the data-centers
for ac in "${APPCENTER[@]}"
do
  # Iterate over the files
  for FILE in ${FILES[@]}
  do
    UPDATE="with(select(documentIndex==0)
    ; .metadata.labels.appcenter=\"${ac}\"
    | .metadata.name=\"${ac}-deployment-name\"
    | .spec.selector.matchLabels.appcenter=\"${ac}\"
    | .spec.template.metadata.labels.appcenter=\"${ac}\"
    )"
    yq eval "${UPDATE}" \
    ${FILE}| kubectl apply --filename=-
  done
done

您的腳本可以使用envsubst並且有效:

for i in pa nyc co nc md sc mi
do
  export APPCENTER=$i
  envsubst < your_sample_in_the_question.yaml | kubectl apply -f -
done

邊注:

...
spec:
 containers:
 - name: deployment-name
   resources:
     limits:
       memory: "400Mi"
       cpu: "10m"  # <-- This limit should be greater than requested.
     requests:
       cpu: 11m  # <-- ??
       memory: 641Mi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM