Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Study_note

AEWS Study 1 주차 (eks 아키텍쳐) 본문

Terraform

AEWS Study 1 주차 (eks 아키텍쳐)

Study_note 2023. 4. 28. 17:51

가시다님이 진행하는 pkos 스터디 이후 다시 한번 좋은 기회를 얻어 eks에 관한 AEWS Study를 참가하게 되었다.

 

스터디 진행 중 eks 설치 과정이나 기존 알고 있는 부분은 넘어가고 조금더 디테일한 부분들을 정리해본다.

 

eks 아키텍쳐

 

eks는 기본적으로 control plane을 매니지드 해주고있다.아래와 같이 control plane 컴포넌트는 2개의 노드로 구성되어 있다.api server, controller, scheduler가 하나의 노드로 구성되며 etcd만을 관리하는 노드로 구성되어있다.

 

etcd가 kubernetes에 스토리지 역할이기 때문에 다른 컴포너트에 오류에 종속되지 않게 etcd만 따로 관리를하는것 같다 해당 etcd 백업, 복원을 제공하며

분산 컴퓨팅 환경에서 서버가 몇 개 다운되어도 제대로 동작하는 State Machine Replication를 기반으로 제공하고 있다.

일반적으로 다중 etcd를 사용하면 쿼럼 기반의 라프트 알고리즘 형태로 리더 etcd를 선출하는 방법이며

이러한 모든 관리를 aws에서 해주기 때문에 매니지드 서비스를 많이 사용하는것 같다

 

etcd에 대한 rsm, laft 알고림즘 등 아래 블로그를 참조하면 자세하게 알 수 있다.

https://tech.kakao.com/2021/12/20/kubernetes-etcd/

 

Kubernetes 운영을 위한 etcd 기본 동작 원리의 이해

안녕하세요, 클라우드플랫폼팀 ted입니다. Container Cloud 관련 업무를 하고 계신 분이라면 모두 etcd[etsy d]를 한 번쯤은 들어보셨을 거라 생각합니다. 왜냐하면, 컨테이너 생태계에서 사실상 표준이

tech.kakao.com

또한 위와 같이 nlb와 elb를 사용하여 트래픽을 전달한다

(왜 nlb와 alb로 다르게 사용하는지 궁금했었는데 찾지는 못했다)

 

워커노드에 경우 매니지드 서비스가 아닌 클라이언트에 책임 영역으로 따로 kublet, kube-proxy 등 컴포넌트들을 따로 관리해줘야하며 워커노드가 생성되면 각각 노드에 대하여 eni가 생성되어 해당 eni로 master node에서 전송하는api를 받는다.

 

 

EKS Cluster Endpoint 접속 방법

 

접속 방법은 3가지로 구성되어있다.

Public : 제어부 → (EKS owned ENI) 워커노드 kubelet, 워커노드 → (퍼블릭 도메인) 제어부, 사용자 kubectl → (퍼블릭 도메인) 제어부

Public Private : 제어부 → (EKS owned ENI) 워커노드 kubelet, 워커노드 → (프라이빗 도메인, EKS owned ENI) 제어부, 사용자 kubectl → (퍼블릭 도메인) 제어부

Private : 제어부 → (EKS owned ENI) 워커노드 kubelet, 워커노드,사용자 kubectl → (프라이빗 도메인, EKS owned ENI) 제어부

 

일반적으로 엔드포인트를 Private  형태로 접근하는게 보안적으로 좋다

 

특정 고객사에서는 stg환경을 Public Private 으르 구성되어있어 vpc의 노드가 아닌 자체 서버에 클러스터 엔드포인트를 kube config파일에 context로 추가해 편하게 운영이 가능했어서 나쁘지는 않았었다.

확실히 보안적으로 취약할수록 운영은 편하긴한것 같다.

 

 

eksctl 사용하여 노드 그룹 생성

 

아래 yaml 파일은 eks 클러스터 생성 + 관리형노드그룹생성(이름, 인스턴스 타입, EBS볼륨사이즈, SSH접속허용) & 사용 가용영역(2a,2c) + VPC 대역 지정이 가능한 파일이다

apiVersion: eksctl.io/v1alpha5
availabilityZones:
- ap-northeast-2a
- ap-northeast-2c
cloudWatch:
  clusterLogging: {}
iam:
  vpcResourceControllerPolicy: true
  withOIDC: false
kind: ClusterConfig
kubernetesNetworkConfig:
  ipFamily: IPv4
managedNodeGroups:
- amiFamily: AmazonLinux2
  desiredCapacity: 2
  disableIMDSv1: false
  disablePodIMDS: false
  iam:
    withAddonPolicies:
      albIngress: false
      appMesh: false
      appMeshPreview: false
      autoScaler: false
      awsLoadBalancerController: false
      certManager: false
      cloudWatch: false
      ebs: false
      efs: false
      externalDNS: false
      fsx: false
      imageBuilder: false
      xRay: false
  instanceSelector: {}
  instanceType: t3.medium
  labels:
    alpha.eksctl.io/cluster-name: myeks
    alpha.eksctl.io/nodegroup-name: mynodegroup
  maxSize: 2
  minSize: 2
  name: mynodegroup
  privateNetworking: false
  releaseVersion: ""
  securityGroups:
    withLocal: null
    withShared: null
  ssh:
    allow: true
    publicKeyPath: ~/.ssh/id_rsa.pub
  tags:
    alpha.eksctl.io/nodegroup-name: mynodegroup
    alpha.eksctl.io/nodegroup-type: managed
  volumeIOPS: 3000
  volumeSize: 30
  volumeThroughput: 125
  volumeType: gp3
metadata:
  name: myeks
  region: ap-northeast-2
  version: "1.25"
privateCluster:
  enabled: false
  skipEndpointCreation: false
vpc:
  autoAllocateIPv6: false
  cidr: 172.20.0.0/16
  clusterEndpoints:
    privateAccess: false
    publicAccess: true
  manageSharedNodeSecurityGroupRules: true
  nat:
    gateway: Single
    
 ---

여기서 중요하게 보는 설정들은 다음과 같으며 그 외 설정들은 명시적으 확인 가능합니다.

 

vpcResourceControllerPolicy: VPC 리소스 컨트롤러에 필요한 IAM 정책이 활성화됩니다.
With OIDC: OIDC(OpenID Connect) 인증을 사용할지 여부를 지정합니다. 이 경우 false로 설정됩니다.

privateNetworking: 노드에 대해 개인 네트워킹을 사용할지 여부를 지정합니다. false로 설정됩니다.

Security Group: 노드에 대한 보안 그룹 구성 옵션을 지정합니다. 이 경우 로컬 및 공유 옵션이 모두 설정되지 않습니다.

ssh: 노드에 대한 SSH 구성 옵션을 지정합니다.

       이 경우 SSH 액세스를 허용했으며 ~/.ssh/id_rsa.pub에 공용 키가 지정되었습니다.

privateCluster: EKS 클러스터에 대한 엑세스 제어를 구성합니다.

                        enabledfalse로 설정하였으므로, 클러스터에 대한 엑세스는 퍼블릭 서브넷에서 가능합니다.

vpc: EKS 클러스터의 VPC 구성을 설정합니다.

       cidr를 사용하여 VPC CIDR을 설정했으며, clusterEndpoints를 사용하여 클러스터 API 서버의 엑세스를 구성했습니다.

        publicAccesstrue로 설정하였으므로, 인터넷에서 API 서버에 접근이 가능합니다.

 

 

add on

EKS는 모든 클러스터에 대해 Amazon VPC CNI plugin for Kubernetes, kube-proxy 및 CoreDNS와 같은 자체 관리형 추가 기능을 자동으로 설치합니다. 

add on에 IAM 권한이 필요한 경우 클러스터에 대한 IAMOpenID Connect(OIDC) 공급자가 있어야 합니다

 

vpc-cni

calico나 flannel 등 다양한 cni가 있지만 aws에서 제공하는 vpc-cni를 사용할 수도 있습니다.

vpc-cni를 사용할경우 타 cni와는 다른게 가상ip가 아닌 ip를 할당해서 eni에 대한 ip 개수 제한을 신경써야한다

이를 해결하기 위해서는 prefix-delegation-enabled를 사용하여 할당 가능 ip 설정 가능하다

AmazonEKS_CNI_Policy의 권한이 필요합니다.

해당 명령어를 통해 AmazonEKS_CNI_Policy권한을 IRSA로 생성 후 연결합니다.

eksctl create iamserviceaccount --name aws-node --namespace kube-system --cluster my-cluster --role-name "AmazonEKSVPCCNIRole" \
    --role-only --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy --approve

 

CoreDNS

파드로 보내지는 트래픽은 clusterip로 직접 통신하는것이 아니라 kubedns에 해당 클러스터 ip에 매핑되어있는 도메인 네임에 질의해서 파드에 대한 ip를 할당 받기 때문에 필수로 생성해야한다.

해당  add on에는 권한이 필요하지 않습니다.

 

kube-proxy

cluster ip 및 service는 iptable에 의해 관리되며 iptable은 kube-proxy에 의해서 관리되어져 필수로 생성해야한다

해당 add on에는 권한이 필요하지 않습니다.

 

기 외 ebs-csi-driver, guard duty agent 등 다양한 add on을 설치 할 수 있다.

 

해당 공식 문서 참고

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eks-add-ons.html

 

Amazon EKS 추가 기능 - Amazon EKS

Amazon EKS 추가 기능 추가 기능은 Kubernetes 애플리케이션에 대한 지원 운영 기능을 제공하는 소프트웨어이지만 애플리케이션에만 국한되지는 않습니다. 여기에는 기본 AWS 리소스를 사용하여 네트

docs.aws.amazon.com

 

Comments