Kubernetes: рдХреНрдпрд╛ рд╡рд╛рдИрдПрдордПрд▓ рдлрд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: kubernetes/kubernetes

рдПрдХ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЬреЛ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреЙрдбреНрд╕, рд╕реЗрд╡рд╛рдУрдВ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЗрддреНрдпрд╛рджрд┐ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдлрд╛рдЗрд▓реЗрдВ (рд╡рд╛рдИрдПрдордПрд▓ рдкреНрд░рд╛рд░реВрдк рдкрд╕рдВрджреАрджрд╛) рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдирдП рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдПрдХ рдкреНрд░рдЪрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЧрд┐рдЯ рд░реЗрдкреЛ рдореЗрдВ рд╡рд╛рдИрдПрдордПрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реА 'рд╕реНрдЯреИрдХ рдлрд╛рдЗрд▓реЗрдВ' рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдордиреБрд╖реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ 'рдУрдкрди рд▓реВрдк' рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдпрд╛ рдЕрдиреНрдп рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдирд╡реАрдирддрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред

рдУрдкрди-рд▓реВрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рдереЗ, рдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рдереАрдВ, рдЖрджрд┐ред

рдпрджрд┐ рдореИрдВ рдЪрд▓ рд░рд╣реЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ 'рд╕рдордХрдХреНрд╖' рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЙрдирдХреА рддреБрд▓рдирд╛ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмрд╣реБрдд рдордЬрдмреВрдд, 'рдХреНрд▓реЛрдЬреНрдб рд▓реВрдк' рдкреНрд░рдгрд╛рд▓реА рд╣реИ - рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХреНрд╖реНрдп рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЯреНрд░реИрдХ рдЦреЛ рджрд┐рдпрд╛ рд╣реЛред

рдЕрдЧрд░ Kubectl apply -f . рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рд╣реЛрддреА рддреЛ--рдбреНрд░рд╛рдИ-рд░рди, рдЬреЛ рдХреЗрд╡рд▓ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рдХрд╛рдо рднреА рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА https://github.com/kubernetes/kubernetes/issues/11488 рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рд╣рдо рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрдкрдиреЗ рд░реЗрдбрд╣реИрдЯ/рд╕реИрдЯреЗрд▓рд╛рдЗрдЯ рдЖрд░рдкреАрдПрдо-рдЖрдзрд╛рд░рд┐рдд рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдирд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ K8s рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдмреЗрд╢рдХ, k8s рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рд╣реА рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬ рд╕рдВрд╕реНрдХрд░рдг!

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

Kubectl рдкреАрдУ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди, рдЖрд░рд╕реА, рдЖрд░рдПрд╕, рдбреАрдПрд╕, рдирд╣реАрдВ, рдиреМрдХрд░реА-рдУ рдпрдорд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kubectl рдкреАрдУ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди, рдЖрд░рд╕реА, рдЖрд░рдПрд╕, рдбреАрдПрд╕, рдирд╣реАрдВ, рдиреМрдХрд░реА-рдУ рдпрдорд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?

рдЖрд╣ рд╣рд╛рдБ, рдмрд┐рд▓реНрдХреБрд▓! рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред рдпрд╣ рдореЗрд░реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред

рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ 'рдЕрдВрддрд┐рдо-рд▓рд╛рдЧреВ-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди' рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрдврд╝рдирд╛ рд╣реИ рдЬреЛ рдХреБрдмреЗрдХреНрдЯрд▓ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЧрд╛ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@dcowden рднреА рджреЗрдЦреЗрдВ kubectl get --export

рдЖрд╣ рдпрд╣ рдФрд░ рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж!

рдЕрдиреНрдп рдЙрддреНрддрд░реЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░, рдореИрдВ рдмреИрд╢ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реВрдВ:

for n in $(kubectl get -o=name pvc,configmap,serviceaccount,secret,ingress,service,deployment,statefulset,hpa,job,cronjob)
do
    mkdir -p $(dirname $n)
    kubectl get -o=yaml --export $n > $n.yaml
done

k8s 1.8

kubectl get all --export=true -o yaml

Google рд╕реЗ рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдкрд░, рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреА all рдореЗрдВ ingress , рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ --all-namespaces рднреА рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдЕрдиреНрдп рдирд╛рдорд╕реНрдерд╛рди рдбрдВрдк рдХрд░реЗрдВред

рд╕рдВрдмрдВрдзрд┐рдд: https://github.com/kubernetes/kubernetes/issues/42885 рдФрд░ https://github.com/kubernetes/kubernetes/pull/42954#issuecomment -285949856 рдЖрджрд┐ред

@alahijani . рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рднрд┐рдиреНрдирддрд╛

for n in $(kubectl get -o=name pvc,configmap,ingress,service,secret,deployment,statefulset,hpa,job,cronjob | grep -v 'secret/default-token')
do
    kubectl get -o=yaml --export $n > $(dirname $n)_$(basename $n).yaml
done

рдпрд╣ рдПрдХ рдЖрд╕рд╛рди kubectl apply -f рд▓рд┐рдП рд╕рднреА yaml рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рд╣реА dir рдореЗрдВ рд░рдЦрдирд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рд░рд╣рд╕реНрдп рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг: рд╕рднреА рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рд╕рднреА рдпрдорд▓ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ред рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред

  • рд▓рдЧрд╛рддрд╛рд░ рдорд╛рддреНрд░рд╛ рд╕рд╣рд┐рдд!
i=$((0))
for n in $(kubectl get -o=custom-columns=NAMESPACE:.metadata.namespace,KIND:.kind,NAME:.metadata.name pv,pvc,configmap,ingress,service,secret,deployment,statefulset,hpa,job,cronjob --all-namespaces | grep -v 'secrets/default-token')
do
    if (( $i < 1 )); then
        namespace=$n
        i=$(($i+1))
        if [[ "$namespace" == "PersistentVolume" ]]; then
            kind=$n
            i=$(($i+1))
        fi
    elif (( $i < 2 )); then
        kind=$n
        i=$(($i+1))
    elif (( $i < 3 )); then
        name=$n
        i=$((0))
        echo "saving ${namespace} ${kind} ${name}"
        if [[ "$namespace" != "NAMESPACE" ]]; then
            mkdir -p $namespace
            kubectl get $kind -o=yaml --export $name -n $namespace > $namespace/$kind.$name.yaml
        fi
    fi
done

рдФрд░ рдлрд┐рд░ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

path=$(pwd)
for n in $(ls -d */)
do
    echo "Creating namespace ${n:0:-1}"
    kubectl create namespace ${n:0:-1}

    for yaml in $(ls $path/$n)
    do
        echo -e "\t Importing $yaml"
        kubectl apply -f $path/$n$yaml -n ${n:0:-1}
    done

done

рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдЯреЛрдХрди рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреНрд╡реАрдХ:

#!/bin/env bash

## https://github.com/kubernetes/kubernetes/issues/24873#issuecomment-416189335

i=$((0))
for n in $(kubectl get -o=custom-columns=NAMESPACE:.metadata.namespace,KIND:.kind,NAME:.metadata.name pv,pvc,configmap,ingress,service,secret,deployment,statefulset,hpa,job,cronjob --all-namespaces | grep -v 'secrets/default-token')
do
    if (( $i < 1 )); then
        namespace=$n
        i=$(($i+1))
        if [[ "$namespace" == "PersistentVolume" ]]; then
            kind=$n
            i=$(($i+1))
        fi
    elif (( $i < 2 )); then
        kind=$n
        i=$(($i+1))
    elif (( $i < 3 )); then
        name=$n
        i=$((0))
        if [[ "$namespace" != "NAMESPACE" ]]; then
            mkdir -p $namespace

            yaml=$((kubectl get $kind -o=yaml $name -n $namespace ) 2>/dev/null)
            if [[ $kind != 'Secret' || $yaml != *"type: kubernetes.io/service-account-token"* ]]; then
                echo "Saving ${namespace}/${kind}.${name}.yaml"
                kubectl get $kind -o=yaml --export $name -n $namespace > $namespace/$kind.$name.yaml
            fi
        fi
    fi
done

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкреЙрд╡рд░реНрд╕рд╢реЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдПрдХ-рд▓рд╛рдЗрдирд░ рд╣реИ:
Foreach ($i in $(kubectl get -o=name pvc,configmap,ingress,service,secret,deployment,statefulset,hpa,job,cronjob)) {If($i -notmatch "default-token") {kubectl get -o=yaml --export $i | Out-File -filepath $($i.Replace("/", "-") + ".yaml")}}

@mrwulf @acondrat
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ grep -v 'secrets/default-token' рдХреЛ grep -v 'secret/default-token' рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
secrets рдореЗрд░реЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдореИрдВ Kubectl рдФрд░ k8s рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.2", GitCommit:"17c77c7898218073f14c8d573582e8d2313dc740", GitTreeState:"clean", BuildDate:"2018-10-24T06:54:59Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.5", GitCommit:"32ac1c9073b132b8ba18aa830f46b77dcceb0723", GitTreeState:"clean", BuildDate:"2018-06-21T11:34:22Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

@ 4m3ndy рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ! рдзрдиреНрдпрд╡рд╛рдж!

рдЕрд░реЗ рджреЛрд╕реНрддреЛрдВ рдиреЗ рдЗрд╕ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ yaml рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИред рдЗрди рдмреИрдХрдЕрдк рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ S3 рдмрдХреЗрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ: +1:
рдкрд░рд┐рд╡реЗрд╢-рдирд╡рд╛рдЪрд╛рд░/k8s-рдмреИрдХрдЕрдк

рдЙрджрд╛рд╣рд░рдг: pv yaml рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

kubectl get pv -o yaml --export | sed -e '/resourceVersion: "[0-9]\+"/d' -e '/uid: [a-z0-9-]\+/d' -e '/selfLink: [a-z0-9A-Z/]\+/d' -e '/status:/d' -e '/phase:/d' -e '/creationTimestamp:/d' > pvList.yaml

@xiaoping378
https://github.com/ambient-innovation/k8s-backup/blob/01c1bfe750136648fd91e14dd691ba39bb05f282/k8s-backup.sh#L38

рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреАрд╡реАрд╕реА рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреАрд╡реА рдХреЗ рд▓рд┐рдП yaml рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ, рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ

${HOME}/clusterstate/ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдлрд┐рд░ рдЪрд▓рд╛рдПрдБ:
kubectl cluster-info dump --all-namespaces --output-directory=${HOME}/clusterstate/ -o yaml
рдЖрдкрдХреА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдПрдВ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣реЛрдВрдЧреАред
.json рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдпрд╛рдиреА рдкрд░рд┐рдирд┐рдпреЛрдЬрди.json, рднреНрд░рд╛рдордХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ -o yaml рдзреНрд╡рдЬ yaml рдирд┐рд░реНрдпрд╛рдд рдмрдирд╛рдПрдЧрд╛ред

${HOME}/clusterstate/ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдлрд┐рд░ рдЪрд▓рд╛рдПрдБ:
kubectl cluster-info dump --all-namespaces --output-directory=${HOME}/clusterstate/ -o yaml
рдЖрдкрдХреА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдПрдВ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣реЛрдВрдЧреАред
.json рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдпрд╛рдиреА рдкрд░рд┐рдирд┐рдпреЛрдЬрди.json, рднреНрд░рд╛рдордХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ -o yaml рдзреНрд╡рдЬ yaml рдирд┐рд░реНрдпрд╛рдд рдмрдирд╛рдПрдЧрд╛ред

FYI рдХрд░реЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдбрд╝реА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП RAM рдХреА рдПрдХ рдЕрдЪреНрдЫреА рдорд╛рддреНрд░рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореЗрд░рд╛ 2GB RAM CLI рдЬрдВрдкрдмреЙрдХреНрд╕ VM рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ (рд╢рд╛рдпрдж 4 рдпрд╛ 8 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдХрд▓реНрдкрдирд╛ рд╣реИ):

fatal error: runtime: out of memory

runtime stack:
runtime.throw(0x1ab7c29, 0x16)
        /usr/local/go/src/runtime/panic.go:774 +0x72
runtime.sysMap(0xc068000000, 0x10000000, 0x2da7238)
        /usr/local/go/src/runtime/mem_linux.go:169 +0xc5
runtime.(*mheap).sysAlloc(0x2d8e9a0, 0x10000000, 0x0, 0x0)
        /usr/local/go/src/runtime/malloc.go:701 +0x1cd
runtime.(*mheap).grow(0x2d8e9a0, 0x8000, 0xffffffff)
        /usr/local/go/src/runtime/mheap.go:1255 +0xa3
runtime.(*mheap).allocSpanLocked(0x2d8e9a0, 0x8000, 0x2da7248, 0x42c7bc)
        /usr/local/go/src/runtime/mheap.go:1170 +0x266
runtime.(*mheap).alloc_m(0x2d8e9a0, 0x8000, 0x101, 0xc000103f18)
        /usr/local/go/src/runtime/mheap.go:1022 +0xc2

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝ рд▓рдЧрд╛рдИ рдФрд░ Kubectl рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреЛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛, рдпрд╣ рд▓рдЧрднрдЧ 4GB рдкрд░ рдЪрд░рдо рдкрд░ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ 8GB рд╣реИ!

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдбрдВрдк рдХреЗ рдХреБрд▓ рдЖрдЙрдЯрдкреБрдЯ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓реЙрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдХреБрдЫ рдкреЙрдб (рдЙрдирдореЗрдВ рд╕реЗ 90) 100 рдПрдордмреА рд╕реЗ рдЕрдзрд┐рдХ рдЖрдХрд╛рд░ рдХреЗ рд▓реЙрдЧ рдбрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдбрдВрдк рдХрдорд╛рдВрдб рд░реИрдо рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реЛ, рд╢рд╛рдпрдж рд░реИрдо рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧ рд▓рд┐рдЦрдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдХрдорд╛рдВрдб рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╕реНрдЯрд░ (рдПрдирдПрд╕, рдкрд░рд┐рдирд┐рдпреЛрдЬрди, рдПрд╕рд╡реАрд╕реА, рд░рд╣рд╕реНрдп, рдкреАрд╡реА рдкреАрд╡реАрд╕реА, рд╕реЗрдореА yaml рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдХрд╛
рдореИрдВрдиреЗ --export рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛ рдореЗрдВ yaml рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЧрд╛рдпрдм рд╣реИ рдФрд░ рдЕрдЧрд░ рдореИрдВ --export рдХреЗ рдмрд┐рдирд╛ рдмреИрдХрдЕрдк рд▓реЗрддрд╛ рд╣реВрдВ рддреЛ рдЗрд╕рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░рдЖрдИрдкреА рдЖрдИрдкреА , рдиреЛрдбрдкреЛрд░реНрдЯ рдкреЛрд░реНрдЯ , рд▓реЛрдбрдмреИрд▓реЗрдВрд╕рд░ рдЖрдИрдкреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдирдП рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ (рдХреНрд▓рд╕реНрдЯрд░рдЖрдИрдкреА рдФрд░ рд▓реЛрдбрдмреИрд▓реЗрдВрд╕рд░)ред
Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрд╕реНрдХрд░рдг 1.14 рдЖрдЧреЗ 1.15/16/17 (рдЬреАрд╕реАрдкреА gke рдпрд╛ AWS eks рдореЗрдВ рдмреИрдХрдЕрдк рд▓реЗрдиреЗ/рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕)ред

kubectl api-resources рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ k8s рдореЗрдВ рд╕рднреА рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ (yaml рдлрд╝рд╛рдЗрд▓реЗрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ:

#!/usr/bin/env bash

while read -r line
do
    output=$(kubectl get "$line" --all-namespaces -o yaml 2>/dev/null | grep '^items:')
    if ! grep -q "\[\]" <<< $output; then
        echo -e "\n======== "$line" manifests ========\n"
        kubectl get "$line" --all-namespaces -o yaml
    fi
done < <(kubectl api-resources | awk '{print $1}' | grep -v '^NAME')

рдКрдкрд░ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  • k8s v1.16.3
  • рдЙрдмрдВрдЯреВ рдмрд╛рдпреЛрдирд┐рдХ 18.04.3 рдУрдПрд╕
  • рдмреИрд╢ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрд╕реНрдХрд░рдг 4.4.20(1)-release (x86_64-pc-linux-gnu)

@vhosakot рдЖрдкрдХреА рд▓рд┐рдкрд┐ рдореЗрдВ рдЫреЛрдЯрд╛ рд╕рд░рд▓реАрдХрд░рдгред

рдЖрдк рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: kubectl api-resources | awk '{print $1}' | grep -v '^NAME'
рд╕рд╛рде рдореЗрдВ: kubectl api-resources -o name

#!/usr/bin/env bash

while read -r namespace
do
    echo "scanning namespace '${namespace}'"
    mkdir -p "${HOME}/cluster-backup/${namespace}"
    while read -r resource
    do
        echo "  scanning resource '${resource}'"
        mkdir -p "${HOME}/cluster-backup/${namespace}/${resource}"
        while read -r item
        do
            echo "    exporting item '${item}'"
            kubectl get "$resource" -n "$namespace" "$item" -o yaml > "${HOME}/cluster-backup/${namespace}/${resource}/$item.yaml"
        done < <(kubectl get "$resource" -n "$namespace" 2>&1 | tail -n +2 | awk '{print $1}')
    done < <(kubectl api-resources --namespaced=true 2>/dev/null | tail -n +2 | awk '{print $1}')
done < <(kubectl get namespaces | tail -n +2 | awk '{print $1}')

рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдмрдврд╝рд╛рдпрд╛ (рдФрд░ рдЗрд╕реЗ рдзреАрдорд╛ рдХрд░ рджрд┐рдпрд╛)ред рдпрд╣ рд╕рднреА рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рднреА рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ рдФрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо (рдбрдВрдк) рд╕рд╛рдл рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

#!/usr/bin/env bash
ROOT=${HOME}/clusterstate

while read -r resource
do
    echo "  scanning resource '${resource}'"
    while read -r namespace item x
    do
        mkdir -p "${ROOT}/${namespace}/${resource}"        
        echo "    exporting item '${namespace} ${item}'"
        kubectl get "$resource" -n "$namespace" "$item" -o yaml > "${ROOT}/${namespace}/${resource}/$item.yaml" &
    done < <(kubectl get "$resource" --all-namespaces 2>&1 | tail -n +2)
done < <(kubectl api-resources --namespaced=true 2>/dev/null | tail -n +2 | awk '{print $1}')

wait

@scones рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛

@ рдирд╛рдерди-рд╕реА . рдХреЗ рд╕рдорд╛рди
рдореИрдВрдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рд╕реВрдЪреА рд╕реЗ events рд╣рдЯрд╛ рджрд┐рдпрд╛

#!/usr/bin/env bash
ROOT=${HOME}/clusterstate
while read -r resource
do
    echo "  scanning resource '${resource}'"
    while read -r namespace item x
    do
        mkdir -p "${ROOT}/${namespace}/${resource}"        
        echo "    exporting item '${namespace} ${item}'"
        kubectl get "$resource" -n "$namespace" "$item" -o yaml > "${ROOT}/${namespace}/${resource}/$item.yaml" &
    done < <(kubectl get "$resource" --all-namespaces 2>&1  | tail -n +2)
done < <(kubectl api-resources --namespaced=true 2>/dev/null | grep -v "events" | tail -n +2 | awk '{print $1}')

wait
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

pwittrock picture pwittrock  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

theothermike picture theothermike  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ttripp picture ttripp  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

broady picture broady  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ddysher picture ddysher  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ