2024-12월 업데이트
AWS에서 EKS 클러스터 만들어 보자~
AWS EKS에서 Master는 AWS에서 관리한다.
우리는 WorkNode만 관리할 뿐이다.
1
디렉토리 이동
cd ~/environment
$ /home/ec2-user/environment 경로임
2
리전 변경 필요시
export AWS_REGION=ap-northeast-2
export AWS_REGION=us-east-1
export AWS_REGION=us-east-2
export AWS_REGION=us-west-1
export AWS_REGION=us-west-2
ap-northeast-2 = 서울
US East (N. Virginia) us-east-1
US East (Ohio) us-east-2
US West (N. California) us-west-1
US West (Oregon) us-west-2
echo ${AWS_REGION}
임의 IP블럭으로 만드는 예제이다.
// VPC 192.168.0.0/16
Subnet이 /19로 2개 또는 3개로 만들어진다.
# 최신 버전으로 설치하자. 1.31 로 변경!!! , 워커노드는 2개로
cat << EOF > eks-demo-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-demo # 생성할 EKS 클러스터명
region: ${AWS_REGION} # 클러스터를 생성할 리젼
version: "1.31"
vpc:
cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
managedNodeGroups:
- name: node-group # 클러스터의 노드 그룹명
instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입
desiredCapacity: 2 # 클러스터 워커 노드의 갯수
volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
iam:
withAddonPolicies:
imageBuilder: true # AWS ECR에 대한 권한 추가
albIngress: true # albIngress에 대한 권한 추가
cloudWatch: true # cloudWatch에 대한 권한 추가
autoScaler: true # auto scaling에 대한 권한 추가
cloudWatch:
clusterLogging:
enableTypes: ["*"]
EOF
3
AWS EKS는 비용이 발생 된다.
테스트후 반드시 삭제하도록 하자.
4
트라블 슈팅
# 서울리전 생성 실패
Resource handler returned message: "Volume of size 10GB is smaller than snapshot 'snap-0211153b22f46e9ca', expect size>= 20GB (Service: Eks, Status Code: 400, Request ID: c607159f-704f-46b2-9f0c-09d61f31caca)" (RequestToken: 14322f82-f6a8-a155-0ded-ccee0933e909, HandlerErrorCode: InvalidRequest)
- 설정 파일에서 20GB 으로 용량을 늘리자.
# us-east-1으로 할경우 아래와 같이 에러가 나온다.
"targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f (Service: AmazonEKS; Status Code: 400"
=> cloud9 disk 용량을 늘려야 한다.
sh resize.sh
5
Amazon EKS 설치
eksctl create cluster -f eks-demo-cluster.yaml
021-06-18 00:08:38 [✔] EKS cluster "eks-demo" in "us-west-1" region is ready
// 생성실패도 다시 생성해야 할때 ?
// vi eks-demo-cluster.yaml 해서 Cluster name을 eks-demo1으로 수정하면 계속 만들수 있음.
https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1
5
실패시 다른 리전에 설치법 ?
리전 수동으로 변경하도록 하자.
vi eks-demo-cluster.yaml
AWS_REGION=us-east-2
6
eks-demo 클러스터가 있는경우 수정하자.
eks-demo -> eks-demo1 으로 변경
eksctl create cluster -f eks-demo-cluster.yaml
vi eks-demo-cluster.yaml
version: "1.21" 을 version: "1.31" 로 변경
// 1.21은 더 이상 지원하지 않음.
[root@ip-172-31-40-122 ~]# more eks-demo-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-demo # 생성할 EKS 클러스터명
region: ap-northeast-2 # 클러스터를 생성할 리젼
version: "1.31"
vpc:
cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
managedNodeGroups:
- name: node-group # 클러스터의 노드 그룹명
instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입
desiredCapacity: 3 # 클러스터 워커 노드의 갯수
volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
iam:
withAddonPolicies:
imageBuilder: true # AWS ECR에 대한 권한 추가
albIngress: true # albIngress에 대한 권한 추가
cloudWatch: true # cloudWatch에 대한 권한 추가
autoScaler: true # auto scaling에 대한 권한 추가
cloudWatch:
clusterLogging:
enableTypes: ["*"]
1.31 버전으로 변경하자.
(30분 소요)
EKS cluster "eks-demo" in "ap-northeast-2" region is ready
7
클러스터 완료후 확인
k get nodes
[root@demo1 ~]# k get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-18-37.ap-northeast-2.compute.internal Ready <none> 2m56s v1.31.3-eks-375
ip-192-168-37-234.ap-northeast-2.compute.internal Ready <none> 2m55s v1.31.3-eks-375
ip-192-168-81-70.ap-northeast-2.compute.internal Ready <none> 2m56s v1.31.3-eks-375
kubectl get nodes
8
# AWS console에서 확인
서브넷 생성 확인
pulic subnet 3개
private subnet 3개
9
EKS 클러스터 확인 - eks-demo
EC2 확인- m5.large 서버 3대 생성됨. node용.
name:
eks-demo # 생성할 EKS 클러스터명
name:
node-group # 클러스터의 노드 그룹명
10
# 권한 확인
kubectl describe configmap -n kube-system aws-auth
[root@ip-172-31-16-102 ~]# kubectl describe configmap -n kube-system aws-auth
Name: aws-auth
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
mapRoles:
----
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::79xxxxxxxxx:role/eksctl-eks-demo1-nodegroup-node-g-NodeInstanceRole-OPMZXZF5T841
username: system:node:{{EC2PrivateDNSName}}
Events: <none>
[root@ip-172-31-16-102 ~]#
11
# 권한 확인
kubectl get configmap -n kube-system aws-auth
NAME DATA AGE
aws-auth 1 28m
12
# 권한 확인
cd .kube/
more config
[root@ip-172-31-95-110 .kube]# more config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJR3dpblY3aE9RJbX
server: https://031B4588D370EDB131E1B624B67BBB41.yl4.ap-northeast-2.eks.amazonaws.com
name: eks-demo1.ap-northeast-2.eksctl.io
contexts:
- context:
cluster: eks-demo1.ap-northeast-2.eksctl.io
user: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io
name: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io
current-context: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io
kind: Config
preferences: {}
users:
- name: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- eks
- get-token
- --output
- json
- --cluster-name
- eks-demo1
- --region
- ap-northeast-2
command: aws
env:
- name: AWS_STS_REGIONAL_ENDPOINTS
value: regional
provideClusterInfo: false
[root@ip-172-31-95-110 .kube]#
AWS는 3~4개 버전을 지원한다.
콘솔로 생성시 보안그룹등 허용이 필요하다. 비권장한다.
1
EKS
왼편 Amazon EKS > Clusters
1.31
2
role 필요
1
자원 삭제시 Autoscaling Group을 반드시 삭제하지.
오토 스케일링로 삭제하지 않고, EC2에서 서버 삭제하면 서버가 다시 생성되기 때문이다.
2
EC2도 없는지 확인 필수
3
EC2를 삭제 해도 Autoscaling 으로 다시 EC2가 생성되어 비용이 발생 할수도 있다.
반드시 EC2가 없는지 확인.
1
# 모니터링 하기 = 별도 터미널 하나 더 띠우기
watch -d kubectl get deploy,rs,svc,pods
watch -d kubectl get deploy,svc,pods
2
배포하기
kubens eks-sample-app
kubectl create namespace eks-sample-app
cat <<EOT > eks-sample-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: eks-sample-linux-deployment
namespace: eks-sample-app
labels:
app: eks-sample-linux-app
spec:
replicas: 3
selector:
matchLabels:
app: eks-sample-linux-app
template:
metadata:
labels:
app: eks-sample-linux-app
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- arm64
containers:
- name: nginx
image: public.ecr.aws/nginx/nginx:1.23
ports:
- name: http
containerPort: 80
imagePullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/os: linux
EOT
kubectl apply -f eks-sample-deployment.yaml
cat <<EOT > eks-sample-service.yaml
apiVersion: v1
kind: Service
metadata:
name: eks-sample-linux-service
namespace: eks-sample-app
labels:
app: eks-sample-linux-app
spec:
selector:
app: eks-sample-linux-app
ports:
- protocol: TCP
port: 80
targetPort: 80
EOT
kubectl apply -f eks-sample-service.yaml
kubectl get pods
https://aws.amazon.com/ko/getting-started/hands-on/deploy-kubernetes-app-amazon-eks/
https://brunch.co.kr/@topasvga/1653