Kubernetes: κΈ°μ‘΄ ν΄λŸ¬μŠ€ν„°λ₯Ό 생성할 yml νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2016λ…„ 04μ›” 27일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: kubernetes/kubernetes

λͺ‡ 개의 ν¬λ“œ, μ„œλΉ„μŠ€, 배포 등을 μ‹€ν–‰ν•˜λŠ” kubernetes ν΄λŸ¬μŠ€ν„°κ°€ 주어지면 μƒˆ ν΄λŸ¬μŠ€ν„°μ— 적용될 λ•Œ ν˜„μž¬ ꡬ성을 λ‹€μ‹œ μƒμ„±ν•˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 파일(yml ν˜•μ‹ μ„ ν˜Έ)을 μƒμ„±ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

제 μ‚¬μš© μ‚¬λ‘€λŠ” ν”„λ‘œλͺ¨μ…˜ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. git repo에 yml 파일둜 'μŠ€νƒ 파일'이 μžˆμ§€λ§Œ ν΄λŸ¬μŠ€ν„°μ— μ μš©ν•˜κΈ° 전에 μ‚¬λžŒμ΄ λ³€κ²½ 사항을 μŠΉμΈν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•œ 가지 방법은 'κ°œλ°©ν˜• 루프' μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. νƒœκ·Έ λ˜λŠ” 기타 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜μ—¬ ν΄λŸ¬μŠ€ν„°μ— 적용된 버전을 ν™•μΈν•œ λ‹€μŒ μ‚¬μš© κ°€λŠ₯ν•œ μ΅œμ‹  버전을 배포된 μ΅œμ‹  버전과 비ꡐ할 수 μžˆμŠ΅λ‹ˆλ‹€.

개방 루프 μ‹œμŠ€ν…œμ˜ λ¬Έμ œλŠ” 파일 μ™ΈλΆ€μ—μ„œ 변경이 μ΄λ£¨μ–΄μ‘Œκ±°λ‚˜ 적용된 변경에 λ¬Έμ œκ°€ μžˆμ„ 수 μžˆλ‹€λŠ” λ“±μ˜ 문제λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ‹€ν–‰ 쀑인 ν΄λŸ¬μŠ€ν„°μ—μ„œ 'λ™λ“±ν•œ' νŒŒμΌμ„ μΆ”μΆœν•  수 μžˆλ‹€λ©΄ μ μš©ν•˜λ €λŠ” 파일과 비ꡐ할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 훨씬 더 κ°•λ ₯ν•œ '폐쇄 루프' μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. μ‹€μ œ λͺ©ν‘œ μƒνƒœλ₯Ό μΆ”μ ν•˜μ§€ λͺ»ν•˜λ”라도 λ³€κ²½ 사항이 적용될 λ•Œ μ–΄λ–€ 일이 일어날지 μ •ν™•ν•˜κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

kubectl apply -f와 같은 것이 μžˆλ‹€λ©΄--dry-run은 μ‹€μ œλ‘œ 변경을 μˆ˜ν–‰ν•˜λŠ” λŒ€μ‹  μˆ˜ν–‰λ  λ³€κ²½ μ‚¬ν•­λ§Œ λ‚˜μ—΄ν•©λ‹ˆλ‹€. μ΄λŠ” 문제 https://github.com/kubernetes/kubernetes/issues/11488 μ—μ„œ 이미 λ…Όμ˜ μ€‘μž…λ‹ˆλ‹€.

아무도 이것에 λŒ€ν•΄ 생각이 μžˆμŠ΅λ‹ˆκΉŒ? μš°λ¦¬λŠ” kubernetesλ₯Ό 처음 μ‚¬μš©ν•˜μ§€λ§Œ RedHat/Satellite rpm 기반 배포에 λŒ€ν•΄ μœ„μ—μ„œ μ„€λͺ…ν•œ κΈ°λŠ₯을 λ§Œλ“€μ—ˆμœΌλ―€λ‘œ K8μ—μ„œ λ‹€μ‹œ λ§Œλ“€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  k8μ—λŠ” μ„€μΉ˜λœ νŒ¨ν‚€μ§€ λ²„μ „λΏλ§Œ μ•„λ‹ˆλΌ 인프라 μžμ²΄κ°€ 변경될 수 μžˆλŠ” λ³΅μž‘μ„±μ΄ μžˆμŠ΅λ‹ˆλ‹€!

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

kubectl get po,deployment,rc,rs,ds,no,job -o yaml?

λͺ¨λ“  24 λŒ“κΈ€

kubectl get po,deployment,rc,rs,ds,no,job -o yaml?

μ•„ 물둠이죠! 이것은 μž‘λ™ν•˜μ§€λ§Œ λ‚΄κ°€ 찾던 것이 μ•„λ‹™λ‹ˆλ‹€. λ‚΄ μ§ˆλ¬Έμ— λŒ€λ‹΅ν•˜μ§€λ§Œ λ‚΄κ°€ μ‚¬μš©ν•œ 파일과 μΌμΉ˜ν•˜λŠ” νŒŒμΌμ€ μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이 μ§ˆλ¬Έμ— λŒ€ν•œ 닡이 kubectl이 μΆ”κ°€ν•œ 'last-applied-configuration' 주석을 μ½λŠ” κ²ƒμž„μ„ λ°°μ› λ‹€. 이것은 ꡬ성을 μƒμ„±ν•˜λŠ” 데 μ‚¬μš©λœ νŒŒμΌμ„ μ œκ³΅ν•©λ‹ˆλ‹€.

@dcowden 은 λ˜ν•œ kubectl get --exportλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ•„ 그게 더 λ‚«λ‹€! 감사 ν•΄μš”!

λ‹€λ₯Έ 닡변을 κ²°ν•©ν•˜λ©΄ 이것이 λ‚΄κ°€ bash에 λŒ€ν•΄ 생각해 λ‚Έ κ²ƒμž…λ‹ˆλ‹€.

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 νŒŒμΌμ„ κ°–λŠ” κ²ƒμž…λ‹ˆλ‹€. 내보낼 수 μ—†λŠ” κΈ°λ³Έ μ„œλΉ„μŠ€ 계정 비밀도 μ œμ™Έλ©λ‹ˆλ‹€.

λ‹€λ₯Έ 버전: λͺ¨λ“  λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ λͺ¨λ“  yaml 내보내기. 각 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•΄ 디렉토리가 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

  • 영ꡬ λ³Όλ₯¨ 포함!
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

Windows Powershellμ—μ„œ μž‘μ—…ν•˜λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ λ‹€μŒμ€ ν•œ μ€„μ§œλ¦¬μž…λ‹ˆλ‹€.
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-backup

예: 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

이 μŠ€ν¬λ¦½νŠΈλŠ” 각 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•œ λͺ¨λ“  pvcλ₯Ό μƒμ„±ν•œ λ‹€μŒ 각 pv에 λŒ€ν•œ yaml νŒŒμΌμ„ 내보내야 ν•©λ‹ˆλ‹€.

${HOME}/clusterstate/ 폴더λ₯Ό λ§Œλ“€κ³  λ‹€μŒμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.
kubectl cluster-info dump --all-namespaces --output-directory=${HOME}/clusterstate/ -o yaml
λͺ¨λ“  μ—”ν„°ν‹°λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— ν•΄λ‹Ήν•˜λŠ” λ³„λ„μ˜ 폴더 ꡬ쑰에 μžˆμŠ΅λ‹ˆλ‹€.
-o yaml ν”Œλž˜κ·Έκ°€ yaml 내보내기λ₯Ό μƒμ„±ν•˜λ―€λ‘œ .json ν™•μž₯(예: deployments.json)은 μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

${HOME}/clusterstate/ 폴더λ₯Ό λ§Œλ“€κ³  λ‹€μŒμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.
kubectl cluster-info dump --all-namespaces --output-directory=${HOME}/clusterstate/ -o yaml
λͺ¨λ“  μ—”ν„°ν‹°λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— ν•΄λ‹Ήν•˜λŠ” λ³„λ„μ˜ 폴더 ꡬ쑰에 μžˆμŠ΅λ‹ˆλ‹€.
-o yaml ν”Œλž˜κ·Έκ°€ yaml 내보내기λ₯Ό μƒμ„±ν•˜λ―€λ‘œ .json ν™•μž₯(예: deployments.json)은 μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

참고둜, λŒ€κ·œλͺ¨ λ°°ν¬μ—λŠ” μƒλ‹Ήν•œ μ–‘μ˜ 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개)λŠ” 크기가 100MBκ°€ λ„˜λŠ” 둜그λ₯Ό 내보내고 μžˆμŠ΅λ‹ˆλ‹€. 이것은 dump λͺ…령이 λ””μŠ€ν¬μ— κΈ°λ‘ν•˜λŠ” λ™μ•ˆμ—λ„ RAM에 λͺ¨λ“  것을 μ €μž₯ν•˜κ³  μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ•„λ§ˆλ„ 둜그 μ“°κΈ°κ°€ μ™„λ£Œλ˜λ©΄ RAM을 μ§€μš°λ„λ‘ μ΅œμ ν™”λ  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

λˆ„κ΅¬λ“ μ§€ λͺ¨λ“  정보와 ν•¨κ»˜ ν΄λŸ¬μŠ€ν„°(ns, 배포, svc, secrets, pv pvc, cm yaml 파일만 포함)λ₯Ό λ°±μ—…ν•˜κ³  μƒˆ ν΄λŸ¬μŠ€ν„°μ—μ„œ 볡원할 λͺ…λ Ήμ΄λ‚˜ 슀크립트λ₯Ό μ•Œλ €μ€„ 수 μžˆμŠ΅λ‹ˆκΉŒ?
--export λͺ…λ ΉμœΌλ‘œ μ‹œλ„ν–ˆμ§€λ§Œ μ„œλΉ„μŠ€μ—μ„œ μ„œλΉ„μŠ€μ˜ yaml 파일 이름이 λˆ„λ½λ˜μ—ˆμœΌλ©° --export 없이 λ°±μ—…ν•˜λ©΄ clusterIP IP , nodePort 포트 , loadBalancer IPκ°€ ν¬ν•¨λ˜μ–΄ μƒˆ ν΄λŸ¬μŠ€ν„°μ— 배포할 수 μ—†μŠ΅λ‹ˆλ‹€. λΆˆλ³€(clusterIP 및 loadBalancer)μž…λ‹ˆλ‹€.
kubernetes ν΄λŸ¬μŠ€ν„° 버전 1.14 이상 1.15/16/17(GCP gke λ˜λŠ” AWS eksμ—μ„œ λ°±μ—…/볡원 μ‹œλ„).

kubectl api-resources 덕뢄에! λ‹€μŒ bash 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ 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')

μœ„μ˜ bash μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒμœΌλ‘œ ν…ŒμŠ€νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • k8s v1.16.3
  • μš°λΆ„νˆ¬ λ°”μ΄μ˜€λ‹‰ 18.04.3 OS
  • bash 버전 버전 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μ—μ„œ μ˜κ°μ„

@nathan-c와 동일
였λ₯˜λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•΄ λ¦¬μ†ŒμŠ€ λͺ©λ‘μ—μ„œ 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 λ“±κΈ‰