Study_note
AEWS Study 1 주차 (eks 아키텍쳐) 본문
가시다님이 진행하는 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/
또한 위와 같이 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 클러스터에 대한 엑세스 제어를 구성합니다.
enabled를 false로 설정하였으므로, 클러스터에 대한 엑세스는 퍼블릭 서브넷에서 가능합니다.
vpc: EKS 클러스터의 VPC 구성을 설정합니다.
cidr를 사용하여 VPC CIDR을 설정했으며, clusterEndpoints를 사용하여 클러스터 API 서버의 엑세스를 구성했습니다.
publicAccess를 true로 설정하였으므로, 인터넷에서 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
'Terraform' 카테고리의 다른 글
AEWS Study 3 주차 (스토리지) (0) | 2023.05.11 |
---|---|
AEWS Study 2 주차 (네트워크) (0) | 2023.05.02 |
CloudWatch Agent 설치 및 원하는 지표 값 할당 (0) | 2023.04.19 |
Github Actions의 Self-hosted Runner (0) | 2023.04.04 |
[CICD] ArgoCD Project, Application, App of apps (0) | 2023.03.16 |