DevOps

EKS 따배

바이수 2024. 11. 30. 13:42

https://www.youtube.com/playlist?list=PLApuRlvrZKogRzF98XVC6_5KS40MBKU7M

  • 구성
  • VPC 예시)
    • VPC = 192.168.0.0/16   
      •    # 이범위 안에서 WorkerNode 및 POD 가 IP 를 할당받음. 
      •    # VPC 내의 각각에 subnet 으로 분리하여 할당하는게 더안전함.
    • ㄴ WorkerNode IP = [192.168.70.30 , 192.168.2.91 , 192.168.56.22]
    • ㄴ CNI(Container Bridge 자동설치) (kubeproxy 등등)    # recommended policies were found for "vpc-cni" addon
      • ㄴ POD IP = [192.168.x.x , 192.168.x.x , 192.168.x.x , 192.168.x.x , 192.168.x.x , 192.168.x.x]
  • EKS Storage
  • Aws Auth ConfigMap
    • AWS User/Group 인증정보를 -> K8S 으로 연결해줌
  • 설치
  • $ eksctl create cluster \
    		--name 이름 \
    		--version 1.31
    		--region ap-northeast-2 \
    		--with-oidc \
    		--nodegroup-name 그룹명 \
    		--zones ap-northeast-2a,ap-northeast-2c \
    		--nodes 2 \
    		--node-type t3.small \
    		--node-volume-size=20 \
    		--managed
    
    # node-type : 최소 t3.small 이상
    # vpc-nat-mode : kubernetes의 모든 outbound는 nat gateway를 통해 나가게 되는게 default option 은 single 이라 하나만 생성된다. 개발 환경에서는 상관없을거 같지만 운영에서는 각 subnet 마다 하나씩 만드는 HighAvailable 옵션을 사용한다.
    # node-private-networking : 해당 option 이 없으면 node group 이 public subnet 에 만들어진다. 보안을 위해 private subnet 에 만들어지도록 이 옵션을 사용한다.
  • ...
  • AWS LoadBalancer Controller (AWS Ingress Controller) 배포 
    • k8s 클러스터에 필요한 AWS ELB (NLB+ALB) 를 자동으로 관리해줌.
    • NLB (Network Load Balancer) :
      • k8s 서비스에 LoadBalancer Type 이 감지되면, NLB가 자동으로 생성됨.   # 이건 Ingress Controller 설치 없이도 됨
    • ALB (Application Load Balancer) :
      • k8s 리소스에 Ingress 가 감지되면, ALB가 자동으로 생성됨.
    • 즉, AWS 에 NLB 및 ALB 생성할 권한이 있는 Controller 를 POD 형태로 2개 띄워서~ 자동화게 되게함.
    • https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/lbc-helm.html
  • # eksctl을 사용하여 IAM 역할 생성
    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json
    mv iam_policy.json aws_lb_controller_policy.json
    
    aws iam create-policy \
        --policy-name AwsLbControllerPolicy \
        --policy-document file://aws_lb_controller_policy.json
    
    eksctl create iamserviceaccount \
      --cluster=클러스터명 \
      --namespace=kube-system \
      --name=aws-lb-controller-sa \
      --role-name AwsEksLbControllerRole \
      --attach-policy-arn=arn:aws:iam::입력:policy/AwsLbControllerPolicy \
      --approve
    eksctl get iamserviceaccount --cluster 클러스터명
    
    kubectl get sa -n kube-system
    kubectl describe -n kube-system sa aws-lb-controller-sa
    
    
    # AWS LoadBalancer Controller 설치
    helm repo add eks https://aws.github.io/eks-charts
    helm repo update eks
    
    helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
      -n kube-system \
      --set clusterName=클러스터명 \
      --set serviceAccount.create=false \
      --set serviceAccount.name=aws-lb-controller-sa
      
    kubectl get deployment -n kube-system aws-load-balancer-controller
    kubectl get pod -n kube-system
  • ...

 

https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR

  • Kustomize 예시
    • k8s-manifest-repo ->  base, overlays/dev 구조
    • base : k8s manifest 베이스가 위치한 ...
    • overlays : ...
    • # k8s-manifest-repo/overlays/dev/kustomization.yaml
      
      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      images:
      - name: ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/demo
        newName: ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/demo
        newTag: abcdefg
      
      resources:
      - ../../base
      
      patchesStrategicMerge:
      - deployment-patch.yaml
      - service-patch.yaml
    •  -patch.yaml 파일에 정의한 내용들은 배포 과정에서 kustomize 에 의해 자동으로 k8s manifest 에 반영.
  • Helm & CDK 예시
    • ...

 

%[부록] labels, selector, matchLabels

kind: Service
spec:
  selector: # matchLabels, matchExpresisons 가 없음!
    app: moelive-backend-pod # Service의 대상이되는 "POD의 Label"


kind: Deployment
spec:
  selector:
    matchLabels:
      app: moelive-backend-pod # Deployment의 대상이되는 "POD의 Label"
  template:
    metadata:
      labels:
        app: moelive-backend-pod # template == 해당 POD의 Label

 

-끝-