Kubernetes

[ Kans 3 Study - 6w ] 1.실습환경 구성

su''@ 2024. 10. 12. 23:10
CloudNetaStudy - Kubernets Networtk 3기 실습 스터디 게시글입니다.

 

실습 환경 : K8S v1.30.x - 현재 ingress-nginix controller 1.30.x까지 버전 호환 테스트 완료
  • VPC 1개(퍼블릭 서브넷 2개), EC2 인스턴스 4대 (Ubuntu 22.04 LTS, t3.medium - vCPU 2 , Mem 4)
    • CloudFormation 스택 실행 시 파라미터를 기입하면, 해당 정보가 반영되어 배포됩니다.
    • CloudFormation 에 EC2의 UserData 부분(Script 실행)으로 실습 환경에 필요한 기본 설정들이 자동으로 진행됩니다.
  • CloudFormation 스택 배포 ← 실행하는 PC에 aws cli 설치되어 있고, aws configure 자격증명 설정 상태.
    # YAML 파일 다운로드
    curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/kans/kans-6w.yaml
    
    # CloudFormation 스택 배포
    # aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region ap-northeast-2
    예시) aws cloudformation deploy --template-file kans-6w.yaml --stack-name mylab --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
    
    ## Tip. 인스턴스 타입 변경 : MyInstanceType=t3.xlarge (vCPU 4, Mem 16)
    예시) aws cloudformation deploy --template-file kans-6w.yaml --stack-name mylab --parameter-overrides MyInstanceType=t3.xlarge KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
    
    # CloudFormation 스택 배포 완료 후 작업용 EC2 IP 출력
    aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2
    
    # [모니터링] CloudFormation 스택 상태 : 생성 완료 확인
    while true; do 
      date
      AWS_PAGER="" aws cloudformation list-stacks \
        --stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \
        --query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \
        --output table
      sleep 1
    done
    
    # EC2 SSH 접속 : 바로 접속하지 말고, 3~5분 정도 후에 접속 할 것
    ssh -i ~/.ssh/kp-gasida.pem ubuntu@$(aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2)
    ...
    (⎈|default:N/A) root@k3s-s:~# <- kubeps 가 나오지 않을 경우 ssh logout 후 다시 ssh 접속 할 것!
     
    •  EC2 생성 수량 부족 실패 시 : 사용자 계정의 해당 리전에 EC2 최대 갯수 제한 일 경우, Service Quotas (EC2) 증설 요청으로 해결 - 링크 EC2 요청
      • Limit Type(EC2 Instances) ⇒ 서울 리전, All Standard (A, C, D, H, I, M, R, T, Z) Instances, New limit value(40 정도)
    • k3s : Lightweight Kubernetes. Easy to install, half the memory, all in a binary of less than 100 MB - Docs
      • rancher 회사에서 IoT 및 edge computing 디바이스 위에서도 동작할 수 있도록 만들어진 경량 k8s 입니다.
      • 장점 : 설치가 쉽다, 가볍다(etcd, cloud manager 등 무거운 컴포넌트 제거), 학습용 및 테스트 시 필요한 기능들은 대부분 탑재
      • K3s란 무엇인가요? 
        K3s는 다음과 같은 향상된 기능을 갖춘 완벽한 호환 Kubernetes 배포판입니다.
        • 단일 바이너리 또는 최소 컨테이너 이미지로 배포됩니다.
        • 기본 스토리지 백엔드로 sqlite3를 기반으로 하는 가벼운 데이터 저장소입니다. etcd3, MySQL, Postgres도 사용할 수 있습니다.
        • TLS와 옵션의 복잡성을 대부분 처리하는 간단한 런처로 포장되었습니다.
        • 가벼운 환경에서는 적절한 기본값을 사용하여 기본적으로 보안을 유지합니다.
        • 모든 Kubernetes 제어 평면 구성 요소의 작동은 단일 바이너리와 프로세스에 캡슐화되므로 K3는 인증서 배포와 같은 복잡한 클러스터 작업을 자동화하고 관리할 수 있습니다.
        • 외부 종속성은 최소화되었습니다. 유일한 요구 사항은 최신 커널과 cgroup 마운트입니다.
        • 간편한 "배터리 포함" 클러스터 생성을 위해 필요한 종속성을 패키지로 제공합니다.
          • containerd / cri-dockerd 컨테이너 런타임(CRI)
          • 플란넬 컨테이너 네트워크 인터페이스(CNI)
          • CoreDNS 클러스터 DNS
          • Traefik Ingress 컨트롤러
          • ServiceLB 로드 밸런서 컨트롤러
          • Kube-router 네트워크 정책 컨트롤러
          • 로컬 경로 프로비저너 영구 볼륨 컨트롤러
          • Spegel 분산 컨테이너 이미지 레지스트리 미러
          • 호스트 유틸리티(iptables, socat 등)
      • Architecture - Docs
        • 서버(Controlplane) 와 에이전트(Work nodes)
          • 서버 노드는 명령을 실행하는 호스트로 정의되며 k3s server, 제어 평면과 데이터 저장소 구성 요소는 K3에 의해 관리됩니다.
          • 에이전트 노드는 k3s agent데이터 저장소나 제어 평면 구성 요소 없이 명령을 실행하는 호스트로 정의됩니다.
          • 서버와 에이전트 모두 kubelet, 컨테이너 런타임, CNI를 실행합니다. 에이전트 없는 서버를 실행하는 방법에 대한 자세한 내용은 고급 옵션 설명서를 참조하세요.
          • Single-server Setup with an Embedded DB : 1대 K3S 서버(경량 DB = SQLite), 필요한 만큼의 K3S Agents(워커 노드들)
          • High-Availability K3s : EmbeddedDB, External DB
      • k3s 기본 정보 확인 : k8s v1.30.x → 현재 ingress-nginx controller 이 1.30.x 까지 버전 호환 테스트 완료 임 (‘24.10.6 일 기준)
        • (참고) k3s 설치 옵션 : aws cloudformation 에 ec2 에 userdata 로 실행되어 있음 - Docs , Server , Agent
          # Install k3s-server
          curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=" --disable=traefik"  sh -s - server --token kanstoken --cluster-cidr "172.16.0.0/16" --service-cidr "10.10.200.0/24" --write-kubeconfig-mode 644 
          
          # Install k3s-agent
          curl -sfL https://get.k3s.io | K3S_URL=https://192.168.10.10:6443 K3S_TOKEN=kanstoken  sh -s -

        • k3s 는 경량화를 위해서 k8s 와 다름
          # 노드 확인
          kubectl get node -owide
          NAME     STATUS   ROLES                  AGE   VERSION        INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
          k3s-s    Ready    control-plane,master   23m   v1.30.5+k3s1   192.168.10.10    <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.21-k3s2
          k3s-w1   Ready    <none>                 23m   v1.30.5+k3s1   192.168.10.101   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.21-k3s2
          k3s-w2   Ready    <none>                 23m   v1.30.5+k3s1   192.168.10.102   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.21-k3s2
          k3s-w3   Ready    <none>                 23m   v1.30.5+k3s1   192.168.10.103   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.21-k3s2
          
          # kubecolor alias 로 kc 설정 되어 있음
          kc describe node k3s-s  # Taints 없음
          kc describe node k3s-w1
          
          
          # 파드 확인
          kubectl get pod -n kube-system
          NAME                                      READY   STATUS    RESTARTS   AGE
          coredns-7b98449c4-jmhgk                   1/1     Running   0          21m
          local-path-provisioner-6795b5f9d8-w6h8s   1/1     Running   0          21m
          metrics-server-cdcc87586-m4ndt            1/1     Running   0          21m
          
          #
          kubectl top node
          kubectl top pod -A --sort-by='cpu'
          kubectl top pod -A --sort-by='memory'
          kubectl get storageclass
          
          
          # config 정보(위치) 확인
          kubectl get pod -v=6
          I1006 13:04:02.858105    4325 loader.go:395] Config loaded from file:  /etc/rancher/k3s/k3s.yaml
          I1006 13:04:02.872677    4325 round_trippers.go:553] GET https://127.0.0.1:6443/api/v1/namespaces/default/pods?limit=500 200 OK in 5 milliseconds
          No resources found in default namespace.
          
          cat /etc/rancher/k3s/k3s.yaml
          export | grep KUBECONFIG
          
          # 네트워크 정보 확인 : flannel CNI(vxlan mode), podCIDR
          ip -c addr
          ip -c route
          cat /run/flannel/subnet.env
          kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' ;echo
          kubectl describe node | grep -A3 Annotations
          brctl show
          
          # 서비스와 엔드포인트 확인
          kubectl get svc,ep -A
          
          
          # iptables 정보 확인
          iptables -t filter -S
          iptables -t nat -S
          iptables -t mangle -S
          
          # tcp listen 포트 정보 확인
          ss -tnlp