๐ eksctl ๊นํ
๐ eksctl ๊ณต์ ๋ฌธ์
๐ eksctl config file example
eksctl ์ค์น
curl --silent --location "<https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$>(uname -s)_arm64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
EKS ๊ตฌ์ฑ
eks ๋ ์๋ง์กด์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ด๋ฉฐ, eksctl ์ eks ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์ปค๋งจ๋ ํด
- eksctl ๊ณต์ ๋ฌธ์๋ ๊ต์ฅํ ์น์ ํ ํธ์ด๋ผ๊ณ ์๊ฐ
๐ก eksctl ์ EKS ๋ฅผ ์ํ ์ปค๋งจํธ ํด์ด๋ฏ๋ก aws configure ๊ฐ ๋ ์ํ์ฌ์ผ ํจ
aws ๋ก๊ทธ์ธ
aws configure
1. Using Config Files (๊ฐ์ฅ ๊ธฐ๋ณธ)
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: basic-cluster
region: eu-north-1
nodeGroups:
- name: ng-1
instanceType: m5.large
desiredCapacity: 10
volumeSize: 80
ssh:
allow: true # will use ~/.ssh/id_rsa.pub as the default ssh key
- name: ng-2
instanceType: m5.xlarge
desiredCapacity: 2
volumeSize: 100
ssh:
publicKeyPath: ~/.ssh/ec2_id_rsa.pub
- nodeGroups[0].ssh : ํค์ ์์น๋ฅผ ๋ช ์ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ~/.ssh/id_rsa.pub ์ ๋ฐ๋ผ๊ฐ
eksctl create cluster -f cluster.yaml
- 20~30๋ถ ์ ๋ ์์๋จ
์ดํ ์ญ์ ํ๊ธฐ
eksctl delete cluster -f cluster.yaml
2. VPC ์ง์ ํ๊ธฐ
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: non-eksctl-created-cluster
region: us-west-2
vpc:
id: "vpc-12345"
securityGroup: "sg-12345" # this is the ControlPlaneSecurityGroup
subnets:
private:
private1:
id: "subnet-12345"
private2:
id: "subnet-67890"
public:
public1:
id: "subnet-12345"
public2:
id: "subnet-67890"
nodeGroups:
...
3. ๋ค์ํ ๋ ธ๋๊ทธ๋ฃน์ ssh
managedNodeGroups:
- name: ng-1
instanceType: m5.large
desiredCapacity: 1
ssh: # import public key from file
publicKeyPath: ~/.ssh/id_rsa_tests.pub
- name: ng-2
instanceType: m5.large
desiredCapacity: 1
ssh: # use existing EC2 key
publicKeyName: ec2_dev_key
- name: ng-3
instanceType: m5.large
desiredCapacity: 1
ssh: # import inline public key
publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqZEdzvHnK/GVP8nLngRHu/GDi/3PeES7+Bx6l3koXn/Oi/UmM9/jcW5XGziZ/oe1cPJ777eZV7muEvXg5ZMQBrYxUtYCdvd8Rt6DIoSqDLsIPqbuuNlQoBHq/PU2IjpWnp/wrJQXMk94IIrGjY8QHfCnpuMENCucVaifgAhwyeyuO5KiqUmD8E0RmcsotHKBV9X8H5eqLXd8zMQaPl+Ub7j5PG+9KftQu0F/QhdFvpSLsHaxvBzA5nhIltjkaFcwGQnD1rpCM3+UnQE7Izoa5Yt1xoUWRwnF+L2TKovW7+bYQ1kxsuuiX149jXTCJDVjkYCqi7HkrXYqcC1sbsror someuser@hostname"
- name: ng-4
instanceType: m5.large
desiredCapacity: 1
ssh: # enable SSH using SSM
enableSsm: true
4. managed node group ๊ณผ unmanaged node group
EKS ๊ด๋ฆฌ ๋ ธ๋ ๊ทธ๋ฃน์ Amazon EKS ํด๋ฌ์คํฐ์ ๋ํด AWS์ ์ํด ๊ด๋ฆฌ๋๋ ์๋ ํ์ฅ ๊ทธ๋ฃน ๋ฐ ๊ด๋ จ EC2 ์ธ์คํด์ค์ ๋๋ค. ๊ฐ ๋ ธ๋ ๊ทธ๋ฃน์ Amazon EKS์ ์ต์ ํ๋ Amazon Linux 2 AMI๋ฅผ ์ฌ์ฉํฉ๋๋ค. Amazon EKS๋ ๋ ธ๋์ ๋ฒ๊ทธ ์์ ๋ฐ ๋ณด์ ํจ์น๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ต์ Kubernetes ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๊ฐ ๋ ธ๋ ๊ทธ๋ฃน์ ํด๋ฌ์คํฐ์ ๋ํด ๊ณ ๊ฐ์ฉ์ฑ(HA)์ ์ํด ์ฌ๋ฌ AWS VPC ๊ฐ์ฉ์ฑ ์์ญ ๋ฐ ์๋ธ๋ท์ ๊ฑธ์ณ ์๋ ์๋ ํ์ฅ ๊ทธ๋ฃน์ ์์ํฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก Amazon Linux 2 AMI ์ฌ์ฉ (๋ค๋ฅธ OS ๋ณ๊ฒฝ ๊ฐ๋ฅ)
- ์คํ ์ค์ผ์ผ๋ง์ ์ํจ
- eks console ์์ ๊ด๋ฆฌ ๊ฐ๋ฅ
- managed , unmanged ๋ชจ๋ ํ ํด๋ฌ์คํฐ ๋ด์์ ๊ตฌ์ฑ ๊ฐ๋ฅ ํ์ง๋ง unmanaged ๋ eks console ์ ์๋ณด์
# cluster.yaml
# A cluster with two managed nodegroups
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: managed-cluster
region: us-west-2
managedNodeGroups:
- name: managed-ng-1
minSize: 2
maxSize: 4
desiredCapacity: 3
volumeSize: 20
ssh:
allow: true
publicKeyPath: ~/.ssh/ec2_id_rsa.pub
# new feature for restricting SSH access to certain AWS security group IDs
sourceSecurityGroupIds: ["sg-00241fbb12c607007"]
labels: {role: worker}
tags:
nodegroup-role: worker
iam:
withAddonPolicies:
externalDNS: true
certManager: true
- name: managed-ng-2
instanceType: t2.large
minSize: 2
maxSize: 3
unmanaged node group
ekctl์์ --managed=false๋ฅผ ์ค์ ํ๊ฑฐ๋ nodeGroups ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๋ฆฌ๋์ง ์๋ ๋ ธ๋ ๊ทธ๋ฃน์ด ์์ฑ๋ฉ๋๋ค. ๊ด๋ฆฌ๋์ง ์๋ ๋ ธ๋ ๊ทธ๋ฃน์ EKS ์ฝ์์ ๋ํ๋์ง ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก EKS ๊ด๋ฆฌ ๋ ธ๋ ๊ทธ๋ฃน์ ๋ํด์๋ง ์ ์ ์์ต๋๋ค.
- config yaml ์์ managedNodeGroups ์ด๋ ๊ฒ ํ๋ฉด managed, nodeGroups ์ด๋ฉด unmanged
- eks console ์์ ๊ด๋ฆฌ ๋ถ๊ฐ๋ฅ
5. taint
taints:
- key: your.domain.com/db
value: "true"
effect: NoSchedule
- key: your.domain.com/production
value: "true"
effect: NoExecute
- ์ด๋ฐ์์ผ๋ก Node ์ taint ๋ฅผ ํ ์ ์๋ค.
- ๋ง์ฝ taint ๊ฐ ๊ฑธ๋ฆฐ ๋ ธ๋์ ํ๋๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด, toleration ์ค์ ์ ํ๋ ์คํ์ ๋ช ์ํด์ฃผ๋ฉด ๋จ
- ex) GPU ์ฌ์ฉํ๋ ๋ ธ๋์ gpu ํ ์ธํธ๋ฅผ ์ค์ ํ๊ณ , gpu ๊ฐ ํ์ํ ํ๋์ toleration ์ ํด์ค
6. Instance Selector
eksctl์ vCPU, ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๋ฆฌ์์ค ๊ธฐ์ค์ ๋ฐ๋ผ ์ธ์คํด์ค ์ ํ ๋ชฉ๋ก์ ์์ฑํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ EC2 ์ธ์คํด์ค ์ ํ๊ธฐ์ ํตํฉ๋ฉ๋๋ค. ์ธ์คํด์ค ์ ํ๊ธฐ ๊ธฐ์ค์ด ์ ๋ฌ๋๋ฉด ekctl์ ์ ๊ณต๋ ๊ธฐ์ค๊ณผ ์ผ์นํ๋ ์ธ์คํด์ค ์ ํ์ผ๋ก ์ค์ ๋ ์ธ์คํด์ค ์ ํ์ ์ฌ์ฉํ์ฌ ๋ ธ๋ ๊ทธ๋ฃน์ ์์ฑํฉ๋๋ค.
# instance-selector-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: cluster
region: us-west-2
nodeGroups:
- name: ng
instanceSelector:
vCPUs: 2
memory: "4" # 4 GiB, unit defaults to GiB
managedNodeGroups:
- name: mng
instanceSelector:
vCPUs: 2
memory: 2GiB #
cpuArchitecture: x86_64 # default value
7. Setting the node AMI Family
nodeGroups:
- name: ng1
instanceType: m5.large
amiFamily: AmazonLinux2
managedNodeGroups:
- name: m-ng-2
instanceType: m5.large
amiFamily: Ubuntu2004
8. Define Container Runtime
๐ containerd๋ ๋ฌด์์ด๊ณ ์ ์ค์ํ ๊น?
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: container-runtime-test
region: us-west-2
nodeGroups:
- name: ng-1
instanceType: m5.xlarge
desiredCapacity: 2
amiFamily: AmazonLinux2
containerRuntime: containerd
- ์ด ๊ฐ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก dockerd๋ก ์ค์ ๋์ง๋ง ๊ณง ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ ๊น ๋ด ์๊ธฐ๋ฅผ ํด๋ณด์๋ฉด,
์๋ฌด ์ปจํ ์ด๋๋ ์๋ณด์ธ๋ค. ๊ทธ ์ด์ ๋ 1.24 ๋ถํฐ๋ dockerd ๊ฐ ์๋ containerd ๋ก ๋์ํ๊ธฐ ๋๋ฌธ
๋ฐ๋ผ์ containerd ๋ฅผ ๋ณผ ์ ์๋ crictl ์ด๋ผ๋ ํจํค์ง๊ฐ ํ์ํฉ๋๋ค
- ์ฟ ๋ฒ๋คํฐ์ค์์๋ criํ์ค์ ์ค์ํ๋ ์ปจํ ์ด๋ ๋ฐํ์์ ํตํฉํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ํด crictl์ด๋ ๋ช ๋ น์ด ํด์ ์ ๊ณตํ๊ณ ์์ต๋๋ค
- crictl์ docker,ctr๊ณผ ๋ฌ๋ฆฌ cri๋ฅผ ์ค์ํ๋ ๋ชจ๋ ์ปจํ ์ด๋ ๋ฐํ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค
- ์ผ๋ฐ์ ์ธ ํจํค์ง ๋งค๋์ ๋ฅผ ํตํด kubeadm kubelet๋ฑ์ ์ค์นํ๋ค๋ฉด ์๋์ผ๋ก ์ค์น ๋์ด ์ง๋๋ค
vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
sudo crictl ps
sudo crictl pods
9. Additional Volume Mappings
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: dev-cluster
region: eu-north-1
managedNodeGroups:
- name: ng-1-workers
labels: { role: workers }
instanceType: m5.xlarge
desiredCapacity: 10
volumeSize: 80
additionalVolumes:
- volumeName: '/tmp/mount-1' # required
volumeSize: 80
volumeType: 'gp3'
volumeEncrypted: true
volumeKmsKeyID: 'id'
volumeIOPS: 3000
volumeThroughput: 125
- volumeName: '/tmp/mount-2' # required
volumeSize: 80
volumeType: 'gp2'
snapshotID: 'snapshot-id'
10. Networking
๊ธฐ๋ณธ์ ์ผ๋ก ekctl ํด๋ฌ์คํฐ ์์ฑ์ ํด๋ฌ์คํฐ์ ๋ํ ์ ์ฉ VPC๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์์ ์ ๋ณด์์ ๋น๋กฏํ ๋ค์ํ ์ด์ ๋ก ์ธํด ๊ธฐ์กด ๋ฆฌ์์ค์ ๋ํ ๊ฐ์ญ์ ํผํ๊ธฐ ์ํด ์ํ๋์ง๋ง ๊ธฐ์กด VPC์์ ๋ชจ๋ ์ค์ ์ ๊ฐ์งํ๋ ๊ฒ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ํ๋ฉ๋๋ค.
eksctl์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ VPC CIDR์ 192.168.0.0/16์ ๋๋ค. 8๊ฐ์ ์๋ธ๋ท(ํ๋ผ์ด๋น 3๊ฐ, ํผ๋ธ๋ฆญ 3๊ฐ, ์์ฝ 2๊ฐ)์ผ๋ก ๋๋ฉ๋๋ค. --allow-ssh๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด SSH ์ก์ธ์ค๊ฐ ๋นํ์ฑํ๋์ด ์ด๊ธฐ ๋ ธ๋ ๊ทธ๋ฃน์ด ๊ณต์ฉ ์๋ธ๋ท์ ์์ฑ๋ฉ๋๋ค. ๋ ธ๋ ๊ทธ๋ฃน์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํธ 1025 - 65535์์ ์ ์ด๋ถ ๋ณด์ ๊ทธ๋ฃน์ ์ธ๋ฐ์ด๋ ํธ๋ํฝ์ ํ์ฉํฉ๋๋ค.
11. Config file schema
๐ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ
์ธ๋ถ์์ EKS ๋ง์คํฐ ๋ ธ๋์ ์ ๊ทผํ๊ธฐ
aws configure ํ์ธ
aws sts get-caller-identity
kube config ์ ์ ์ฉ
aws eks --region ${region_name} update-kubeconfig --name ${cluster_name}