2017-04-24 37 views
4

正如我可以看到下面的頁面,我可以在一個Ingress中設置兩個或三個主機。 https://kubernetes.io/docs/concepts/services-networking/ingress/#name-based-virtual-hosting如何將新主機添加到kubernetes中的現有Ingress中?

但是,如何將新主機添加到現有的入口? 我嘗試了像應用程序或補丁這樣的命令,但沒有奏效。

有沒有人知道這個解決方案?

kubectl patch -f sample-ingress.yml -p ' 
    {"metadata": {"name": "sample-ingress"}, "spec": [{ 
    "host": "39500000.sample.com", 
    "http": {"paths": [{ 
     "backend": {"serviceName": "39500000", "servicePort": 8080} 
    }] 
    }}] 
}' 
The Ingress "sample-ingress" is invalid: spec.backend.serviceName: Required value 
+0

上面JSON是不夠的。 spec.rules是必需的。但是現有的內容被這個補丁覆蓋了,所以通過新的設置就清楚了。我不想替換但添加。 – masudak

回答

0

您可以編輯使用kubectl edit所以kubectl edit ing sample-ingress應該讓你改變當前進入的資源。

或者你可以嘗試kubectl get ing sample-ingress -o json,這將使你的sample-ingress當前狀態的JSON格式,粘貼此到文本編輯器會給你一個很好的基礎,用於創建一個清單,然後您可以kubectl replace -f

+0

'kubectl edit'需要手動修復,我想自動修復它。今年,我也認爲'kubectl get' - >'kubectl replace'會更好,但會導致「競爭狀態」。有時候我害怕並行替換錯過。 – masudak

1

這是我未編輯的bash解決方案。

如果有任何興趣,我可以重新寫這個讓它更易轉移。我會在腳本中留下意見來指導你。

#!/bin/bash 
# Update ingress with potential new hosts 
# REQUIREMENTS: [An existing ingress with at least one host, and jq installed on host] 
kubectl get ingress laravel-ingress -n=gitlab-ci -o json > original_json #CHANGE THIS VALUE TO QUERY YOUR EXISTING INGRESS 
existing_hosts=() 
exisiting_host_names=() 

# I pass 3 arguments into the script. The first 2 are potential new hosts (if they aren't in the ingress already, and the 3rd arg helps me build the service name) 
API_HOST=$1 
DASHBOARD_HOST=$2 
NAME=$3 

name="$NAME" 
potential_new_hosts=(
    "$API_HOST" 
    "$DASHBOARD_HOST" 
) 
new_hosts=() 

while read -r value 
do 
    existing_host_names+=("$value") 
done < <(cat original_json | jq ['.spec.rules[] | .host']) 

# Loop through potential new hosts and add any non-existing ones to a new array. 
for potential_new_host in "${potential_new_hosts[@]}"; do 
    i=0 
    for existing_host in "${existing_host_names[@]}"; do 
     if [[ "$existing_host" == "\"$potential_new_host\"," ]] ; then 
      i=1 
     fi 
    done 
    if [[ "$i" == 0 ]] ; then 
     # A non-existing host, add to an array 
     new_hosts+=("$potential_new_host") 
    fi 
done 

while read -r value2 
do 
    existing_hosts+=("$value2") 
done < <(cat original_json | jq ['.spec.rules[] | .']) 

# Enable for debugging 
#echo "Original json" 
#cat original_json 
#echo "Existing host names" 
#printf '%s\n' "${existing_host_names[@]}" 
#echo "New hosts" 
#printf '%s\n' "${new_hosts[@]}" 
#echo "Existing hosts before adding" 
#printf '%s\n' "${existing_hosts[@]}" 
#echo "Hosts after adding new ones" 
########  

# Begin building of hosts json to patch ingress with 
output_json="" 
for existing_host in "${existing_hosts[@]}"; do 
    output_json=("$output_json$existing_host") 
done 

# Truncate the last char in our json string (it's a ']', and we want to potentially add to this array for patching 
output_json=${output_json::-1} 

i=0 
for new_host in "${new_hosts[@]}"; do 
    # Add to our json object the new host names with my hard-coded config 
    output_json=("$output_json,{\"host\":\"$new_host\",\"http\":{ \"paths\": [{ \"backend\":{ \"serviceName\":\"$name-laravel-web\",\"servicePort\":80} } ]} }") 
i=1 
done 
printf '%s]\n' "$output_json" > new_json 

if [[ "$i" == 1 ]] ; then 
    echo "Ingress json has changed and should be updated." 
    echo "OLD:" 
    cat original_json 
    echo "PATCH: \"spec\": {\"rules\": $output_json]}" 
    kubectl patch ingress laravel-ingress -n=gitlab-ci -p="\"spec\": {\"rules\": $output_json]}" 
else 
    echo "Ingress json has not changed and will not be updated." 
fi 

編輯(固定錯誤和換算成每腳本執行單個主機)

#!/bin/bash 
# Update ingress with potential new host 
NEW_HOST=$1 
INGRESS_NAME=$2 
SERVICE_NAME=$3 

echo "Running update-ingress for New host: $NEW_HOST, ingress: $INGRESS_NAME, service: $SERVICE_NAME" 
echo " Downloading existing ingress config" 
kubectl get ingress "$INGRESS_NAME" -n=gitlab-ci -o json > original_json 
existing_hosts=() 
exisiting_host_names=() 

echo " $ kubectl get ingress $INGRESS_NAME -n=gitlab-ci -o json > original json && cat original_json" 
cat original_json 

name="$SERVICE_NAME" 
potential_new_host="$NEW_HOST" 
new_hosts=() 

echo "Looping through json values1" 
cat original_json | jq ['.spec.rules[] | .host'] 
for value in $(cat original_json | jq ['.spec.rules[] | .host']); 
do 
    # Replace all commas with "" 
    value=${value/,/""} 
    existing_host_names+=("$value") 
    echo "Looping v1: value:$value" 
    #printf 'Array: %s' "${existing_host_names[*]}" 
done 
echo "Right after values1" 
i=0 
for existing_host in "${existing_host_names[@]}"; do 
    echo "Looping through existing host: $existing_host == $potential_new_host" 
    if [[ "$existing_host" == "\"$potential_new_host\"" ]] ; then 
     i=1 
    fi 
done 
if [[ "$i" == 0 ]] ; then 
    new_hosts+=("$potential_new_host") 
fi 

echo "Looping through json values2" 
for value2 in $(cat original_json | jq ['.spec.rules[] | .']); 
do 
    existing_hosts+=("$value2") 
    #echo "existing host! $values2" 
    #printf 'Array: %s' "{existing_hosts[*]}" 
done 

echo "Original json" 
#cat original_json 

echo "Existing host names" 
printf '%s\n' "${existing_host_names[@]}" 
echo "New hosts" 
printf '%s\n' "${new_hosts[@]}" 
echo "Existing hosts before adding" 
printf '%s\n' "${existing_hosts[@]}" 
echo "Hosts after adding new ones" 

output_json="" 
for existing_host in "${existing_hosts[@]}"; do 
    output_json=("$output_json$existing_host") 
done 

output_json=${output_json::-1} 

i=0 
for new_host in "${new_hosts[@]}"; do 
    output_json=("$output_json,{\"host\":\"$new_host\",\"http\":{ \"paths\": [{ \"backend\":{ \"serviceName\":\"$SERVICE_NAME-laravel-web\",\"servicePort\":80} }, { \"backend\":{ \"serviceName\":\"$SERVICE_NAME-laravel-web\",\"servicePort\":443} } ]} }") 
i=1 
done 
printf '%s]\n' "$output_json" > new_json 

if [[ "$i" == 1 ]] ; then 
    echo "Ingress json has changed and should be updated." 
    echo "OLD:" 
    cat original_json 
    echo "PATCH: \"spec\": {\"rules\": $output_json]}" 
    kubectl patch ingress "$INGRESS_NAME" -n=gitlab-ci -p="\"spec\": {\"rules\": $output_json]}" 
else 
    echo "Ingress json has not changed and will not be updated." 
fi 
+0

這應該是公認的答案 – xxstevenxo

相關問題