실습

ClusterIP

  1. Deployment 생성

    cat <<'EOF' | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            volumeMounts:
            - name: html
              mountPath: /usr/share/nginx/html
          initContainers:
          - name: index
            image: curlimages/curl
            command:
            - "sh"
            - "-c"
            - "echo 'hello from $(POD_NAME), my ip is $(POD_IP)' > /data/index.html"
            volumeMounts:
            - name: html
              mountPath: /data
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumes:
          - name: html
            emptyDir: {}
    EOF
  2. Service 생성

    kubectl expose deployment nginx --port 80
  3. 생성된 Service 확인

    kubectl get svc nginx -o wide
  4. 생성된 Endpoint 확인

    kubectl get ep nginx
  5. 생성된 Pod의 IP주소 확인

    kubectl get pod -l app=nginx -o wide
  6. Endpoint에 타겟으로 등록되어 있는 Pod 목록 확인

    kubectl get ep nginx \
    -o jsonpath='{range .subsets[*].addresses[*]}{.targetRef.name}{"\t"}{.ip}{"\n"}{end}'
  7. 생성된 Deployment의 Replica 갯수를 6개로 조정

    kubectl scale deployment nginx --replicas=6
  8. 생성된 Pod의 IP주소 확인

    kubectl get pod -l app=nginx -o wide
  9. Endpoint에 타겟으로 등록되어 있는 Pod 목록 확인

    kubectl get ep nginx \
    -o jsonpath='{range .subsets[*].addresses[*]}{.targetRef.name}{"\t"}{.ip}{"\n"}{end}'
  10. Pod 생성

    kubectl run curl --image=nginx -- sleep 3600
  11. 위에서 생성한 Pod에서 Service 호출

    kubectl exec curl -- \
    bash -c "for i in {1..20};do curl -s $(kubectl get svc nginx -o=jsonpath='{.spec.clusterIP}');done"
  12. 새로운 터미널을 열고 kube-proxy 로그 확인 - 아래의 명령어를 입력하고 엔터키를 몇번 입력해서 간격을 만들어두면 새로운 로그를 좀 더 쉽게 알아볼수 있음

    kubectl -n kube-system logs ds/kube-proxy -f
  13. 기존 터미널로 돌아와서 생성된 Deployment의 Replica 갯수를 3개로 조정

    kubectl scale deployment nginx --replicas=3
  14. 다른 터미널로 이동해서 kube-proxy 로그 확인

  15. 새로운 터미널을 열고 한개의 Node로 Session Manager 연결

    aws ssm start-session --target \
    $(kubectl get node -o jsonpath='{.items[0].spec.providerID}{"\n"}' | grep -oE "i-[a-z0-9]+")
  16. Iptable의 모든 규칙 확인

    sudo iptables-save
  17. Iptable의 NAT 규칙 확인

    sudo iptables -L -t nat
  18. KUBE-SERVICES 규칙 확인

    sudo iptables -t nat -L KUBE-SERVICES -n  | column -t
  19. 생성된 Service의 Cluster IP로 연결된 규칙 값을 환경변수로 저장

    export SERVICE_CHAIN=$(sudo iptables -t nat -L KUBE-SERVICES -n  | column -t | grep "default/nginx" | grep -oE "^KUBE-SVC-[A-Z0-9]+")
    echo $SERVICE_CHAIN
  20. Service의 Cluster IP로 연결된 규칙의 상세내용 확인

    sudo iptables -t nat -L $SERVICE_CHAIN -n  | column -t
  21. 위의 명령어로 나온 결과중의 한개의 Chain 규칙 확인

    sudo iptables -t nat -L $(sudo iptables -t nat -L $SERVICE_CHAIN -n  | column -t | grep -oE "^KUBE-SEP-[A-Z0-9]+" | head -1) \
    -n  | column -t
  22. 첫번째 터미널로 이동해서 생성된 Pod의 IP주소 확인

    kubectl get pod -o wide -l app=nginx
  23. 생성된 Deployment의 Replica 갯수를 6개로 조정

    kubectl scale deployment nginx --replicas=6
  24. 두번째 터미널에서 kube-proxy 로그 확인

  25. 세번째 터미널로 이동해서 20번 명령어 재실행

  26. 첫번째 터미널로 이동해서 CoreDNS 설정 파일 확인

    kubectl -n kube-system get cm coredns -o yaml | yq e '.data' -
  27. log 플러그인 활성화 - https://coredns.io/plugins/log

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: kube-system
      labels:
        eks.amazonaws.com/component: coredns
        k8s-app: kube-dns
    data:
      Corefile: |
        .:53 {
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf
            cache 30
            loop
            reload
            loadbalance
            log
        }
    EOF
  28. CoreDNS Pod 재배포

    {
        kubectl -n kube-system scale deployment coredns --replicas=0
        sleep 60
        kubectl -n kube-system scale deployment coredns --replicas=2
        sleep 10
        kubectl -n kube-system get pod -l k8s-app=kube-dns
    }
  29. 두번째 터미널에서 CoreDNS 로그 확인

    kubectl -n kube-system logs deploy/coredns -f
  30. 첫번째 터미널로 이동해서 Pod안에 설정된 DNS 설정 파일 확인

    kubectl exec curl -- cat /etc/resolv.conf
  31. CoreDNS 주소 확인

    kubectl -n kube-system get svc kube-dns
  32. CURL 명령어로 Service 이름 호출

    kubectl exec curl -- curl -s nginx
  33. 두번째 터미널에서 CoreDNS 로그 확인 - 새로운 로그 출력되지 않으면 32번 명령어를 다시 수행

  34. 첫번째 터미널로 이동해서 새로운 Namespace 생성

    kubectl create ns web
  35. 생성한 Namespace 안에 Deployment 생성

    kubectl -n web create deployment httpd --image=httpd --port=80
  36. Service 생성

    kubectl -n web expose deployment httpd
  37. CURL 명령어로 Service 이름 호출

    kubectl exec curl -- curl -s httpd
  38. 두번째 터미널에서 CoreDNS 로그 확인 - 새로운 로그 출력되지 않으면 37번 명령어를 다시 수행

  39. CURL 명령어로 Service 호출 - service.namespace

    kubectl exec curl -- curl -s httpd.web
  40. CURL 명령어로 Service 호출 - service.namespace.svc

    kubectl exec curl -- curl -s httpd.web.svc
  41. CURL 명령어로 Service 호출 - service.namespace.svc.cluster

    kubectl exec curl -- curl -s httpd.web.svc.cluster
  42. CURL 명령어로 Service 호출 - FQDN

    kubectl exec curl -- curl -s httpd.web.svc.cluster.local
  43. 생성한 리소스 삭제

    {
        kubectl delete ns web
        kubectl delete pod curl
        kubectl delete svc nginx
        kubectl delete deploy nginx
    }

NodePort

  1. Deployment 생성

  2. Service 생성

  3. 생성된 Service 확인

  4. Node의 공인 IP 주소 확인

  5. 웹 브라우저를 열고 NODE_EXTERNAL_IP:NODEPORT 주소로 접속 시도 - 아래의 명령어로 주소 확인 가능

  6. 접속이 안될 경우에는 Node의 보안그룹 확인

  7. 보안그룹에 Service에 명시된 포트에 대한 인바운드 규칙이 없을 경우에 아래의 명령어로 규칙 추가

  8. 보안그룹에 인바운드 규칙이 추가되었는지 확인

  9. 웹 브라우저를 열고 NODE_EXTERNAL_IP:NODEPORT 주소로 접속 시도 - 아래의 명령어로 주소 확인 가능

  10. 새로운 터미널을 열고 한개의 Node로 Session Manager 연결

  11. Iptable의 모든 규칙 확인

  12. KUBE-SERVICES 규칙 확인

  13. KUBE-NODEPORTS 규칙 확인

  14. 생성된 Service의 NodePort로 연결된 규칙 값을 환경변수로 저장

  15. KUBE-SERVICES 규칙 중에서 NodePort로 연결된 규칙 확인

  16. 첫번째 터미널로 이동해서 Service의 Cluster IP 확인

  17. 다른 터미널로 이동해서 NodePort로 연결된 규칙의 상세내용 확인

  18. 위의 명령어로 나온 결과중의 한개의 Chain 규칙 확인

  19. 첫번째 터미널로 이동해서 생성된 Pod의 IP주소 확인

  20. 다른 터미널로 이동해서 Node에 열려있는 포트 정보 확인

  21. CURL 명령어로 Service 호출

  22. 첫번째 터미널로 이동해서 보안그룹에 추가한 인바운드 규칙 삭제

  23. 인바운드 규칙이 삭제되었는지 확인

  24. 생성한 리소스 삭제

LoadBalancer

  1. Deployment 생성

  2. Service 생성

  3. 생성된 Service 확인

  4. 생성된 Service 객체에 발생한 Event 확인

  5. 웹 브라우저를 열고 Service의 External IP 주소로 접속 - 아래의 명령어로 주소 확인 가능

  6. 생성된 Service 상세 내용 확인

  7. 생성된 ELB 이름 확인

  8. ELB 상세 내용 확인

  9. ELB의 Listener 설정 확인

  10. ELB의 보안그룹 확인

  11. 노드에 부여된 보안그룹에 ELB 보안그룹에 대한 새로운 인바운드 규칙이 추가 됐는지 확인

  12. 새로운 터미널을 열고 한개의 Node로 Session Manager 연결

  13. KUBE-NODEPORTS 규칙 확인

  14. 첫번째 터미널로 이동해서 생성한 리소스 삭제

Network Load Balancer

  1. Deployment 생성

  2. Pod 생성 확인

  3. Service 생성

  4. Service 상태 확인

  5. 생성된 ELB 상세 내용 확인

  6. Pod 생성

  7. Pod 생성 확인

  8. 생성한 Pod에서 NLB로 TCP 연결

  9. 연결에 성공했다는 메시지가 나오면 터미널에 아무 글자나 입력해서 응답이 오는지 확인

  10. 생성한 리소스 삭제

Kubectl Proxy & Port-forwarding

  1. Deployment 생성

  2. 생성된 Pod 확인

  3. Service 생성

  4. 생성된 Service 확인

  5. Kubectl proxy 구동

  6. 새로운 터미널을 열고 아래의 주소로 접근 시도

  7. 생성된 Pod 이름을 환경변수로 저장

  8. 아래의 주소로 접근 시도

  9. 첫번째 터미널로 이동해서 실행중인 kubectl proxy 프로세스 종료

  10. 생성된 Pod 이름을 환경변수로 저장

  11. 로컬포트를 Pod의 포트로 포워딩

  12. 다른 터미널로 이동해서 Pod에 배포된 NGINX 서버로 접근 시도

  13. 첫번째 터미널로 이동해서 실행중인 kubectl port-forward 프로세스 종료

  14. 로컬포트를 Service의 포트로 포워딩

  15. 다른 터미널로 이동해서 Service로 접근 시도

  16. 첫번째 터미널로 이동해서 실행중인 kubectl port-forward 프로세스 종료

  17. 생성한 리소스 삭제

ExternalName

  1. Service 생성

  2. Service 상태 확인

  3. Pod 생성

  4. 위에서 생성한 Service 호출

  5. 위에서 생성한 Service 호출 - 호스트 명시

  6. 위에서 생성한 Service 호출 - 호스트 명시하고 새로운 경로 호출

  7. 리소스 삭제

Last updated