Kubernetes

Minikube

  1. EBS ๋ณผ๋ฅจ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ

    curl -s https://raw.githubusercontent.com/youngwjung/aws-tools/main/resize.sh \
    | bash /dev/stdin 30
  2. Minikube ์„ค์น˜

    {
        curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
        sudo install minikube-linux-amd64 /usr/local/bin/minikube
    }
  3. ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ

    minikube start
  4. ์‹คํ–‰์ค‘์ธ Pod ํ™•์ธ

    minikube kubectl -- get pod --all-namespaces
  5. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

    minikube kubectl -- run nginx --image=nginx
  6. ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ ์ƒ์„ฑ

    minikube kubectl -- expose pod nginx --port=80 --type=NodePort
  7. ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ ๋ฐ ํฌํŠธ ํ™•์ธ

    minikube service nginx
  8. ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋กœ ์ ‘์†๋˜๋Š”์ง€ ํ™•์ธ

    curl $(minikube service nginx --url)
  9. ํด๋Ÿฌ์Šคํ„ฐ ์‚ญ์ œ

    minikube delete

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ

  1. ์‹ค์Šต ํ™˜๊ฒฝ ์ƒ์„ฑ

    {
        cd ~/environment/container-labs
        git pull
        terraform init
        terraform apply --target=module.kubernetes --auto-approve
    }
  2. ์ธ์Šคํ„ด์Šค ์ •๋ณด ํ™•์ธ

    terraform show -json |\
    jq -r '.values.root_module.child_modules | .[].resources | .[] | select(.address | contains("module.kubernetes.aws_instance")) | .name + ": " + .values.public_ip'
  3. SSH ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

    terraform show -json |\
    jq -r '.values.root_module.child_modules | .[].resources | .[] | select(.address == "module.kubernetes.random_password.this").values.result'
  4. ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์ฒซ๋ฒˆ์งธ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋กœ ์‚ฌ์šฉํ•  ์ธ์Šคํ„ด์Šค๋กœ SSH ์—ฐ๊ฒฐ

    ssh root@CP_IP_ADDRESS
  5. ์‹œ์Šคํ…œ ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

    sudo apt update && sudo apt install -y \
    curl apt-transport-https vim git wget gnupg2 net-tools \
    software-properties-common lsb-release ca-certificates uidmap 
  6. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๊ตฌ๋™์— ํ•„์š”ํ•œ overlay์™€ br_netfilter ์ปค๋„ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

    {
        cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
    overlay
    br_netfilter
    EOF
    
        sudo modprobe overlay
        sudo modprobe br_netfilter
    }
  7. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๊ตฌ๋™์— ํ•„์š”ํ•œ ์ปค๋„ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •

    {
        cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
        sudo sysctl --system
    }
  8. containerd ์„ค์น˜

    {
        sudo mkdir -p /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt update && apt install -y containerd.io
        sudo containerd config default | tee /etc/containerd/config.toml
        sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
        sudo systemctl restart containerd
    }
  9. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ๋ฐ ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ค์น˜

    {
        curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
        echo "deb  http://apt.kubernetes.io/  kubernetes-xenial  main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
        sudo apt update && sudo apt install -y kubelet=1.28.1-00 kubeadm=1.28.1-00 kubectl=1.28.1-00
    }
  10. /etc/hosts ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ผ์ธ ์ถ”๊ฐ€ - CP_IP_ADDRESS๋Š” CP ๋…ธ๋“œ IP์ฃผ์†Œ

    CP_IP_ADDRESS k8scp

    ์˜ˆ๋ฅผ๋“ค์–ด CP์˜ IP์ฃผ์†Œ๊ฐ€ 123.45.67.89๋ผ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ž…๋ ฅ

    123.45.67.89 k8scp
  11. ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ

    cat << EOF | tee kubeadm-config.yaml
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: ClusterConfiguration
    kubernetesVersion: 1.28.1
    controlPlaneEndpoint: "k8scp:6443"
    networking:
      podSubnet: 192.168.0.0/16
    EOF
  12. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ ๊ตฌ์„ฑ

    kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.out
  13. kubeconfig ํŒŒ์ผ ๋ณต์‚ฌ

    {
        mkdir -p $HOME/.kube
        sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
    }
  14. kubeconfig ํŒŒ์ผ ํ™•์ธ

    cat ~/.kube/config
  15. ์‹คํ–‰์ค‘์ธ Pod ํ™•์ธ

    kubectl get pod --all-namespaces
  16. Pending ์ƒํƒœ์˜ Pod์˜ ์ƒ์„ธ๋‚ด์šฉ ํ™•์ธ

    kubectl describe pod \
    $(kubectl get pod -A --field-selector=status.phase=Pending -o=jsonpath='{.items[0].metadata.name}') \
    -n $(kubectl get pod -A --field-selector=status.phase=Pending -o=jsonpath='{.items[0].metadata.namespace}')
  17. ๋…ธ๋“œ ๋ชฉ๋ก ํ™•์ธ

    kubectl get node
  18. CP ๋…ธ๋“œ ์ƒํƒœ ํ™•์ธ

    kubectl describe node cp
  19. kubelet ๋กœ๊ทธ ํ™•์ธ

    sudo journalctl -u kubelet -n 10 --no-pager
  20. CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

    kubectl apply -f \
    https://raw.githubusercontent.com/youngwjung/lf-training/main/LFS458/v1.28.1/SOLUTIONS/s_03/cilium-cni.yaml
  21. ์‹คํ–‰์ค‘์ธ Pod ํ™•์ธ

    kubectl get pod -A
  22. CP ๋…ธ๋“œ ์ƒํƒœ ํ™•์ธ

    kubectl describe node cp
  23. kubectl ๋ช…๋ น์–ด์— ๋Œ€ํ•œ bash completion ์„ค์ •

    {
        echo 'source <(kubectl completion bash)' >>~/.bashrc
        source <(kubectl completion bash)
    }
  24. ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์›Œ์ปค ๋…ธ๋“œ๋กœ ์‚ฌ์šฉํ•  ์ธ์Šคํ„ด์Šค๋กœ SSH ์—ฐ๊ฒฐ

    ssh root@WORKER_IP_ADDRESS
  25. ์‹œ์Šคํ…œ ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

    sudo apt update && sudo apt install -y \
    curl apt-transport-https vim git wget gnupg2 net-tools \
    software-properties-common lsb-release ca-certificates uidmap 
  26. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๊ตฌ๋™์— ํ•„์š”ํ•œ overlay์™€ br_netfilter ์ปค๋„ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

    {
        cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
    overlay
    br_netfilter
    EOF
    
        sudo modprobe overlay
        sudo modprobe br_netfilter
    }
  27. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๊ตฌ๋™์— ํ•„์š”ํ•œ ์ปค๋„ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •

    {
        cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
        sudo sysctl --system
    }
  28. containerd ์„ค์น˜

    {
        sudo mkdir -p /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt update && apt install -y containerd.io
        sudo containerd config default | tee /etc/containerd/config.toml
        sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
        sudo systemctl restart containerd
    }
  29. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ๋ฐ ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ค์น˜

    {
        curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
        echo "deb  http://apt.kubernetes.io/  kubernetes-xenial  main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
        sudo apt update && sudo apt install -y kubelet=1.28.1-00 kubeadm=1.28.1-00 kubectl=1.28.1-00
    }
  30. /etc/hosts ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ผ์ธ ์ถ”๊ฐ€ - CP_IP_ADDRESS๋Š” CP ๋…ธ๋“œ IP์ฃผ์†Œ

    CP_IP_ADDRESS k8scp
  31. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  32. Worker ๋…ธ๋“œ ์กฐ์ธ ๋ช…๋ น์–ด ์ƒ์„ฑ

    kubeadm token create --print-join-command --ttl 0
  33. Worker ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™ํ•ด์„œ ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์˜จ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰

  34. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  35. ๋…ธ๋“œ ์ƒํƒœ ํ™•์ธ

    kubectl get no

์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

  1. Deployment ์ƒ์„ฑ

    kubectl create deployment nginx --image=nginx
  2. Deployment ์ƒํƒœ ํ™•์ธ

    kubectl get deploy
  3. Pod๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl get pod
  4. ์ƒ์„ฑ๋œ NGINX Deployment ์ƒํƒœ ์ƒ์„ธ ํ™•์ธ

    kubectl describe deployment nginx 
  5. ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ํ™•์ธ

    kubectl get events  --sort-by='.metadata.creationTimestamp'
  6. Deployment์— ์†ํ•˜๋Š” Pod ์‚ญ์ œ

    kubectl delete pod -l app=nginx
  7. Pod๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ

    kubectl get pod
  8. Service ์ƒ์„ฑ

    kubectl expose deploy nginx --port 80
  9. NGINX ์„œ๋น„์Šค ํ™•์ธ

    kubectl get svc nginx
  10. NGINX ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋œ Endpoints ํ™•์ธ

    kubectl get ep nginx
  11. ์‹คํ–‰์ค‘์ธ Pod์˜ IP ์ฃผ์†Œ ํ™•์ธ

    kubectl get pod -l app=nginx -o wide
  12. ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ ๋ฐ ํฌํŠธ ํ™•์ธ

    kubectl get svc nginx
  13. NGINX ์„œ๋น„์Šค์˜ ClusterIP์— HTTP ์š”์ฒญ

    curl $(kubectl get svc nginx -o=jsonpath='{.spec.clusterIP}')
  14. NGINX ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋œ Endpoints ์ฃผ์†Œ๋กœ HTTP ์š”์ฒญ

    curl $(kubectl get ep nginx -o=jsonpath='{.subsets[0].addresses[0].ip}:{.subsets[0].ports[0].port}')
  15. NGINX Deployment์˜ Replica ๊ฐฏ์ˆ˜๋ฅผ 3๊ฐœ๋กœ ๋ณ€๊ฒฝ

    kubectl scale deployment nginx --replicas=3
  16. Pod๊ฐ€ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ๋๋Š”์ง€ ํ™•์ธ

    kubectl get pod -l app=nginx -o wide
  17. NGINX ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋œ Endpoints ํ™•์ธ

    kubectl get ep nginx
  18. NGNIX ์„œ๋น„์Šค๋ฅผ NodePort ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ

    kubectl patch svc nginx --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'
  19. NGINX Service ์—”๋“œํฌ์ธํŠธ ๋ฐ ํฌํŠธ ํ™•์ธ

    kubectl get svc nginx
  20. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ANY_NODE_IP:SERVICE_NODE_PORT ๋กœ ์ ‘์†๋˜๋Š”์ง€ ํ™•์ธ - ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ฃผ์†Œ ํ™•์ธ ๊ฐ€๋Šฅ

    echo "$(curl -s ifconfig.io):$(kubectl get svc nginx -o=jsonpath='{.spec.ports[0].nodePort}')"
  21. NGINX Deployment์˜ Replica ๊ฐฏ์ˆ˜๋ฅผ 0๊ฐœ๋กœ ๋ณ€๊ฒฝ

    kubectl scale deployment nginx --replicas=0
  22. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ANY_NODE_IP:SERVICE_PORT ๋กœ ์ ‘์†๋˜๋Š”์ง€ ํ™•์ธ

  23. NGINX Deployment์˜ Replica ๊ฐฏ์ˆ˜๋ฅผ 2๊ฐœ๋กœ ๋ณ€๊ฒฝ

    kubectl scale deployment nginx --replicas=2
  24. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ANY_NODE_IP:SERVICE_PORT ๋กœ ์ ‘์†๋˜๋Š”์ง€ ํ™•์ธ

  25. ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

    {
        kubectl delete deployment nginx
        kubectl delete svc nginx
    }

๊ณ ๊ฐ€์šฉ์„ฑ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

  1. HAProxy๋กœ SSH ์ ‘์†

    ssh root@HAPROXY_IP_ADDRESS
  2. HAProxy ์„ค์น˜

    sudo apt update && sudo apt install -y haproxy
  3. HAProxy ์„ค์ •ํŒŒ์ผ /etc/haproxy/haproxy.cfg ์— ์•„๋ž˜์˜ ๋ผ์ธ๋“ค์„ ์ถ”๊ฐ€ - CP_IP_ADDRESS์— CP ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋ฅผ ๋„ฃ์œผ์„ธ์š”.

    frontend kubernetes-cp
       mode	tcp
       option tcplog
       bind *:6443
       default_backend kubernetes-cp-nodes
    
    backend kubernetes-cp-nodes
       mode tcp
       balance roundrobin
       server cp1 CP_IP_ADDRESS:6443 check  
    
    listen stats
         bind :9999
         mode http
         stats enable
         stats hide-version
         stats uri /stats
  4. HAProxy ๋ฐ๋ชฌ์„ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ์ƒํƒœ ํ™•์ธ

    {
        sudo systemctl restart haproxy
        sudo systemctl status haproxy --no-pager
    }
  5. CP ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  6. /etc/hosts ํŒŒ์ผ์—์„œ k8scp์— ์ง€์ •๋œ IP์ฃผ์†Œ๋ฅผ HAProxy IP ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ

    HAPROXY_IP_ADDRESS k8scp
  7. Worker ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  8. /etc/hosts ํŒŒ์ผ์—์„œ k8scp์— ์ง€์ •๋œ IP์ฃผ์†Œ๋ฅผ HAProxy IP ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ

    HAPROXY_IP_ADDRESS k8scp
  9. ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  HAPROXY_IP_ADDRESS:9999/stats ์ฃผ์†Œ๋กœ ์ ‘์†

  10. CP ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  11. kubectl ๋ช…๋ น์–ด๋กœ API ํ˜ธ์ถœ

    {
        kubectl get node
        kubectl get pod -A
    }
  12. HAProxy ํ†ต๊ณ„ ํŽ˜์ด์ง€๋ฅผ ๋ฆฌํ”„๋ ˆ์‹œํ•ด์„œ ํŠธ๋ž˜ํ”ฝ ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š”์ง€ ํ™•์ธ

  13. SecondCP๋กœ SSH ์ ‘์†

    ssh root@SECOND_CP_IP_ADDRESS
  14. ์‹œ์Šคํ…œ ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

    sudo apt update && sudo apt install -y \
    curl apt-transport-https vim git wget gnupg2 net-tools \
    software-properties-common lsb-release ca-certificates uidmap
  15. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์„ค์น˜

    {
        cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
    overlay
    br_netfilter
    EOF
    
        sudp modprobe overlay
        sudo modprobe br_netfilter
    
        cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
        sudo sysctl --system
        
        sudo mkdir -p /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt update && apt install -y containerd.io
        sudo containerd config default | tee /etc/containerd/config.toml
        sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
        sudo systemctl restart containerd
    }
  16. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜

    {
        curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
        echo "deb  http://apt.kubernetes.io/  kubernetes-xenial  main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
        sudo apt update && apt install -y kubelet=1.28.1-00 kubeadm=1.28.1-00 kubectl=1.28.1-00
    }
  17. /etc/hosts ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ผ์ธ ์ถ”๊ฐ€

    HAPROXY_IP_ADDRESS k8scp
  18. ThirdCP๋กœ SSH ์ ‘์†

    ssh root@THIRD_CP_IP_ADDRESS
  19. 14๋ฒˆ๋ถ€ํ„ฐ 17๋ฒˆ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰

  20. CP ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  21. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์กฐ์ธ ๋ช…๋ น์–ด ์ƒ์„ฑ

    echo "sudo kubeadm join k8scp:6443 --control-plane \
    --token $(sudo kubeadm token create) \
    --discovery-token-ca-cert-hash sha256:$(openssl x509 -pubkey \
    -in /etc/kubernetes/pki/ca.crt | openssl rsa \
    -pubin -outform der 2>/dev/null | openssl dgst \
    -sha256 -hex | grep -oE '[A-z0-9]+$') \
    --certificate-key $(sudo kubeadm init phase upload-certs --upload-certs| tail -1)" 
  22. ์œ„์—์„œ ์ƒ์„ฑํ•œ ๋ช…๋ น์–ด๋ฅผ SecondCP ๋…ธ๋“œ ๋ฐ ThirdCP ๋…ธ๋“œ์— ์‹คํ–‰

  23. HAProxy ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  24. HAProxy ์„ค์ •ํŒŒ์ผ /etc/haproxy/haproxy.cfg ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •

    ...
    ...
    backend kubernetes-cp-nodes
       mode tcp
       balance roundrobin
       server cp1 CP_IP_ADDRESS:6443 check
       server cp2 SECOND_CP_IP_ADDRESS:6443 check
       server cp3 THIRD_CP_IP_ADDRESS:6443 check
  25. HAProxy ๋ฐ๋ชฌ์„ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ์ƒํƒœ ํ™•์ธ

    {
        sudo systemctl restart haproxy
        sudo systemctl status haproxy --no-pager
    }
  26. ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  HAPROXY_IP_ADDRESS:9999/stats ์ฃผ์†Œ๋กœ ์ ‘์†ํ•ด์„œ ์œ„์—์„œ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ๋“ค์˜ ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ

  27. CP ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™

  28. Node ๋ชฉ๋ก ํ™•์ธ

    kubectl get node
  29. kubectl ๋ช…๋ น์–ด๋กœ ๋ช‡๊ฐ€์ง€ API ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•˜๊ณ  HAProxy ํ†ต๊ณ„์‚ฌ์ดํŠธ์—์„œ ๋กœ๋“œ๊ฐ€ ๋ถ„์‚ฐ๋˜๋Š”์ง€ ํ™•์ธ

    for i in {1..10}; do kubectl get pod; done

๊ณ ๊ฐ€์šฉ์„ฑ ํ…Œ์ŠคํŠธ

  1. ์‹คํ–‰์ค‘์ธ ETCD Pod ํ™•์ธ

    kubectl get pod -n kube-system -l component=etcd 
  2. ETCD Pod ๋กœ๊ทธ ํ™•์ธ

    kubectl -n kube-system logs etcd-secondcp | grep leader
  3. ์‹คํ–‰์ค‘์ธ ETCD Pod์˜ IP ์ฃผ์†Œ ํ™•์ธ

    kubectl get pod -n kube-system -l component=etcd -o wide 
  4. ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉค๋ฒ„ ๋ชฉ๋ก ํ™•์ธ

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl -w table \
    --endpoints localhost:2379 \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    member list
  5. ETCD ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„ ๋ชฉ๋ก์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ง€์ •

    {
        export ETCD_ENDPOINTS=$(kubectl -n kube-system exec -it etcd-cp -- \
        etcdctl -w json \
        --endpoints localhost:2379 \
        --cacert /etc/kubernetes/pki/etcd/ca.crt \
        --cert /etc/kubernetes/pki/etcd/server.crt \
        --key /etc/kubernetes/pki/etcd/server.key \
        member list \
        | jq -r '.members | map(.clientURLs[]) | join(",")')
        echo $ETCD_ENDPOINTS
    }
  6. ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ๋” ํ™•์ธ

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint status
  7. ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋ฉค๋ฒ„๋ณ„ ์ƒํƒœ ํ™•์ธ

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint health
  8. ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ๋” Pod๊ฐ€ ๋ฐฐํฌ๋œ ๋…ธ๋“œ์— ๊ฐ€์„œ kubelet ๋ฐ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์ •์ง€- CP ๋…ธ๋“œ์˜ ETCD๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๊ตฌ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ CP ๋…ธ๋“œ์— ๋ฐฐํฌ๋œ ETCD๊ฐ€ ๋ฆฌ๋”

    {
        sudo systemctl stop kubelet
        sudo crictl --runtime-endpoint=unix:///run/containerd/containerd.sock \
        stop $(sudo crictl --runtime-endpoint=unix:///run/containerd/containerd.sock ps -q)
        sudo systemctl stop containerd.service
    }
  9. ETCD Pod ๋กœ๊ทธ ํ™•์ธ

    kubectl -n kube-system logs etcd-secondcp | grep leader
  10. ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  HAPROXY_IP_ADDRESS:9999/stats ์ฃผ์†Œ๋กœ ์ ‘์†ํ•ด์„œ ์œ„์—์„œ ๋…ธ๋“œ๋“ค์˜ ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ

  11. ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint status
  12. ETCD ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ ๋ฉค๋ฒ„๋ณ„ ์ƒํƒœ ํ™•์ธ

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint health
  13. Node ์ƒํƒœ ํ™•์ธ

    kubectl get node
  14. CP ๋…ธ๋“œ์—์„œ kubelet ๋ฐ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์„ ์žฌ์‹คํ–‰

    {
        sudo systemctl start containerd.service
        sudo systemctl start kubelet
    }
  15. ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  HAPROXY_IP_ADDRESS:9999/stats ์ฃผ์†Œ๋กœ ์ ‘์†ํ•ด์„œ ์œ„์—์„œ ๋…ธ๋“œ๋“ค์˜ ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ

  16. ๋…ธ๋“œ ์ƒํƒœ ํ™•์ธ

    kubectl get node
  17. ๋ชจ๋“  Pod๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ

    kubectl get pod -A -o wide
  18. ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ๋”๊ฐ€ ๋‹ค์‹œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint status
  19. ETCD ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ ๋ฉค๋ฒ„๋ณ„ ์ƒํƒœ ํ™•์ธ

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint health
  20. Cloud9์— ์—ฐ๊ฒฐ๋œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™ํ•ด์„œ ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

    {
        cd ~/environment/container-labs
        terraform destroy --target=module.kubernetes --auto-approve
    }

Amazon EKS

  1. eksctl ์„ค์น˜

    {
        cd ~/environment
        curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
        sudo mv /tmp/eksctl /usr/local/bin
    }
  2. eksctl ๋ฒ„์ „ ํ™•์ธ

    eksctl version
  3. ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ IAM ์ž๊ฒฉ์ฆ๋ช… ํ™•์ธ

    aws sts get-caller-identity
  4. IAM ์ž๊ฒฉ์ฆ๋ช… ์„ค์ • - https://kubernetes.youngwjung.com/preparation/cloud9#cloud9

  5. EKS ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ

    eksctl create cluster \
    --name mycluster \
    --nodes-min=2 \
    --nodes-max=5 \
    --region ap-northeast-2
  6. kubectl ์„ค์น˜

    {
        curl -LO "https://dl.k8s.io/release/v1.27.1/bin/linux/amd64/kubectl"
        sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
        echo 'source <(kubectl completion bash)' >>~/.bashrc
        source <(kubectl completion bash)
    }
  7. Node ๋ชฉ๋ก ํ™•์ธ

    kubectl get node
  8. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ„์ „ ํ™•์ธ

    kubectl version --short
  9. Deployment ์ƒ์„ฑ

    kubectl create deployment nginx --image=nginx --replicas=3
  10. ์ƒ์„ฑ๋œ Pod ํ™•์ธ

    kubectl get po
  11. Service ์ƒ์„ฑ

    kubectl expose deployment nginx --port 80 --type LoadBalancer
  12. ์ƒ์„ฑ๋œ Service ํ™•์ธ

    kubectl get svc nginx
  13. ์ƒ์„ฑ๋œ ELB ์ฃผ์†Œ ํ™•์ธ

    kubectl get svc nginx \
    -o=jsonpath='{.status.loadBalancer.ingress[0].hostname}{"\n"}'
  14. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„์—์„œ ํ™•์ธํ•œ URL๋กœ ์ ‘์†

  15. ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

    {
        kubectl delete deploy nginx
        kubectl delete svc nginx
    }
  16. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ - https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#run-and-expose-php-apache-server

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: php-apache
    spec:
      selector:
        matchLabels:
          app: php-apache
      replicas: 1
      template:
        metadata:
          labels:
            app: php-apache
        spec:
          containers:
          - name: php-apache
            image: k8s.gcr.io/hpa-example
            ports:
            - containerPort: 80
            resources:
              limits:
                cpu: 2
              requests:
                cpu: 1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: php-apache
      labels:
        app: php-apache
    spec:
      ports:
      - port: 80
      selector:
        app: php-apache
    EOF
  17. Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    kubectl top pod -l app=php-apache
  18. Metrics Server ์„ค์น˜ - https://github.com/kubernetes-sigs/metrics-server#kubernetes-metrics-server

    kubectl apply -f \
    https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  19. Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    kubectl top pod -l app=php-apache
  20. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ถ€ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Pod ์ƒ์„ฑ

    kubectl create deploy load-generator \
    --image=busybox:1.28 \
    --replicas=10 \
    -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
  21. Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    kubectl top pod -l app=php-apache
  22. HPA ์ƒ์„ฑ

    kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=5
  23. ์œ„์—์„œ ์ƒ์„ฑํ•œ HPA ์ƒํƒœ ํ™•์ธ

    kubectl get hpa php-apache
  24. HPA ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง

    kubectl get hpa php-apache -w
  25. Ctrl+C๋ฅผ ์ž…๋ ฅํ•ด์„œ HPA ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ค‘์ง€ํ•˜๊ณ  Pod๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl get pod -l app=php-apache
  26. Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    kubectl top pod -l app=php-apache
  27. Pending ์ƒํƒœ์˜ Pod๊ฐ€ ์žˆ๋‹ค๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๊ทธ ์ด์œ ๋ฅผ ํ™•์ธ

    kubectl describe pod \
    $(kubectl get pod -o=jsonpath='{.items[?(@.status.phase=="Pending")].metadata.name}')
  28. Cluster Autoscaler ์„ค์น˜

    {
        export CLUSTER_NAME=$(kubectl get node \
        -o=jsonpath='{.items[0].metadata.labels.alpha\.eksctl\.io\/cluster-name}')
        export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
        export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query \
        "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='$CLUSTER_NAME']].AutoScalingGroupName" --output text)    
        
        eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 \
        --cluster=$CLUSTER_NAME --approve
        
        eksctl create iamserviceaccount \
        --cluster=$CLUSTER_NAME \
        --namespace=kube-system \
        --name=cluster-autoscaler \
        --attach-policy-arn=arn:aws:iam::aws:policy/AmazonEC2FullAccess \
        --override-existing-serviceaccounts \
        --approve \
        --region ap-northeast-2
        
        kubectl apply -f \
        https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
        
        kubectl -n kube-system patch deployment cluster-autoscaler --type=json \
        -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/command", "value": [
        "./cluster-autoscaler",
        "--v=4",
        "--stderrthreshold=info",
        "--cloud-provider=aws",
        "--skip-nodes-with-local-storage=false",
        "--expander=least-waste",
        "--node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/'${CLUSTER_NAME}'",
        "--balance-similar-node-groups",
        "--skip-nodes-with-system-pods=false"
        ]}]'
    }
  29. Cluster Autoscaler ๋กœ๊ทธ ํ™•์ธ

    kubectl -n kube-system logs deploy/cluster-autoscaler
  30. Pending ์ƒํƒœ์˜€๋˜ Pod๊ฐ€ ์ƒ์„ฑ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl get pod -l app=php-apache
  31. Node ๊ฐฏ์ˆ˜ ํ™•์ธ

    kubectl get node
  32. Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    kubectl top pod -l app=php-apache
  33. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ถ€ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Pod ์‚ญ์ œ

    kubectl delete deploy load-generator
  34. Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

    kubectl top pod -l app=php-apache
  35. HPA ์ƒํƒœ ํ™•์ธ

    kubectl get hpa php-apache
  36. HPA ์ƒ์„ธ ๋‚ด์šฉ ํ™•์ธ

    kubectl describe hpa php-apache
  37. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์ œ๋ณธ ๊ฐฏ์ˆ˜๋Š” 1๊ฐœ๋กœ ๊ฐ•์ œ ์ง€์ •

    kubectl scale deployment php-apache --replicas=1
  38. Pod๊ฐ€ ์‚ญ์ œ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl get pod -l app=php-apache
  39. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ญ์ œ

    kubectl delete deploy php-apache
  40. Pod๊ฐ€ ์‚ญ์ œ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    kubectl get pod -l app=php-apache
  41. Node๊ฐ€ ์‚ญ์ œ ๋˜๋Š”์ง€ ํ™•์ธ

    kubectl get node
  42. Cluster Autoscaler ๋กœ๊ทธ ํ™•์ธ

    kubectl -n kube-system logs deploy/cluster-autoscaler
  43. EKS ํด๋Ÿฌ์Šคํ„ฐ ์‚ญ์ œ

    eksctl delete cluster --name mycluster --region ap-northeast-2

Last updated