λͺ κ°μ ν¬λ, μλΉμ€, λ°°ν¬ λ±μ μ€ννλ kubernetes ν΄λ¬μ€ν°κ° μ£Όμ΄μ§λ©΄ μ ν΄λ¬μ€ν°μ μ μ©λ λ νμ¬ κ΅¬μ±μ λ€μ μμ±νλ νλ μ΄μμ νμΌ(yml νμ μ νΈ)μ μμ±νκ³ μΆμ΅λλ€.
μ μ¬μ© μ¬λ‘λ νλ‘λͺ¨μ μμ€ν μ λλ€. git repoμ yml νμΌλ‘ 'μ€ν νμΌ'μ΄ μμ§λ§ ν΄λ¬μ€ν°μ μ μ©νκΈ° μ μ μ¬λμ΄ λ³κ²½ μ¬νμ μΉμΈν μ μλλ‘ ν΄μΌ ν©λλ€.
μ΄λ₯Ό μννλ ν κ°μ§ λ°©λ²μ 'κ°λ°©ν 루ν' μμ€ν μ μ¬μ©νλ κ²μ λλ€. νκ·Έ λλ κΈ°ν λ©μ»€λμ¦μ μ¬μ©νμ¬ ν΄λ¬μ€ν°μ μ μ©λ λ²μ μ νμΈν λ€μ μ¬μ© κ°λ₯ν μ΅μ λ²μ μ λ°°ν¬λ μ΅μ λ²μ κ³Ό λΉκ΅ν μ μμ΅λλ€.
κ°λ°© 루ν μμ€ν μ λ¬Έμ λ νμΌ μΈλΆμμ λ³κ²½μ΄ μ΄λ£¨μ΄μ‘κ±°λ μ μ©λ λ³κ²½μ λ¬Έμ κ° μμ μ μλ€λ λ±μ λ¬Έμ λ₯Ό κ³ λ €νμ§ μλλ€λ κ²μ λλ€.
μ€ν μ€μΈ ν΄λ¬μ€ν°μμ 'λλ±ν' νμΌμ μΆμΆν μ μλ€λ©΄ μ μ©νλ €λ νμΌκ³Ό λΉκ΅ν μ μμ΅λλ€. μ΄κ²μ ν¨μ¬ λ κ°λ ₯ν 'νμ 루ν' μμ€ν μ λλ€. μ€μ λͺ©ν μνλ₯Ό μΆμ νμ§ λͺ»νλλΌλ λ³κ²½ μ¬νμ΄ μ μ©λ λ μ΄λ€ μΌμ΄ μΌμ΄λ μ§ μ ννκ² μ΄ν΄ν μ μμ΅λλ€.
kubectl apply -fμ κ°μ κ²μ΄ μλ€λ©΄
μ무λ μ΄κ²μ λν΄ μκ°μ΄ μμ΅λκΉ? μ°λ¦¬λ kubernetesλ₯Ό μ²μ μ¬μ©νμ§λ§ RedHat/Satellite rpm κΈ°λ° λ°°ν¬μ λν΄ μμμ μ€λͺ ν κΈ°λ₯μ λ§λ€μμΌλ―λ‘ K8μμ λ€μ λ§λ€κ³ μΆμ΅λλ€. λ¬Όλ‘ k8μλ μ€μΉλ ν¨ν€μ§ λ²μ λΏλ§ μλλΌ μΈνλΌ μμ²΄κ° λ³κ²½λ μ μλ 볡μ‘μ±μ΄ μμ΅λλ€!
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 μ€ν¬λ¦½νΈλ λ€μμΌλ‘ ν μ€νΈλμμ΅λλ€.
v1.16.3
18.04.3
OS4.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
κ°μ₯ μ μ©ν λκΈ
kubectl get po,deployment,rc,rs,ds,no,job -o yaml?