티스토리 뷰
EKS
>> 관리형 Kubernetes 서비스
# 만들어두면 계속 비용이 지출된다
● 대규모로 애플리케이션 실행
- 컨테이너화된 애플리케이션을 대규모로 배포하고 관리하는데 사용할 수 있는 오픈 소스 소프트웨어
- EC2 인스턴스의 클러스트를 관리 / 배포 / 유지 관리 및 스케일링의 프로세스를 통해 인스턴스에서 컨테이너를 실행
● 애플리케이션을 원활하게 이전
- 컨테이너화된 애플리케이션을 로컬 개발 시스템에서 클라우드의 프로덕션으로 이전
● 어디서든 실행
- 가용성이 뛰어난 kubernetes 클러스트 실행
실습
● 역할 생성
● EKS 의 보안그룹 생성
● EKS cluster 생성
● 프로메테우스는 설정 없이 간다
# 이후 작업은 모드 기본값으로 지정
● EKS 클러스터 생성된 이후 관리형 노드 그룹 추가 ( 관리형 ) / Fargate 중 선택 가능
Amazon EKS Pod 실행 IAM 역할 - Amazon EKS
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
● 역할 생성 후 신뢰 정책 편집
# 설명서 따라서 수정해준다
>> region-code / id / cluster 편집
Fargate 프로파일 구성
● 서브넷은 private 로 구성된다
● VM 하나를 onpremise 로 설정
# EC2 로 구성하는 것보다 비용 절감 가능
[vagrant@docker1 ~]$ PS1="onprem \w:$"
● 인스턴스 하나를 자격증명까지 실행한다
[ec2-user@ip-10-10-3-53 ~]$ aws sts get-caller-identity
{
"UserId": "ABDAGFED7TFQHTIOJFKKFQC",
"Account": "000011112222",
"Arn": "arn:aws:iam::000011112222:user/ecsadmin"
}
○ 자격 증명이 없다면 생성하여 인증
[ec2-user@ip-10-10-3-53 ~]$ aws configure
● kubectl 설치 후 클러스터 구성 ( onpremise 장비에도 설치 )
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html
kubectl 설치 또는 업데이트 - Amazon EKS
Amazon EKS 클러스터 제어 영역과 마이너 버전이 하나 다른 kubectl 버전을 사용해야 합니다. 예를 들어 1.28 kubectl 클라이언트는 Kubernetes 1.27, 1.28, 1.29 클러스터와 함께 작동합니다.
docs.aws.amazon.com
https://eksctl.io/usage/creating-and-managing-clusters/
Creating and managing clusters - eksctl
The official CLI for Amazon EKS
eksctl.io
cat cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: apps
region: ap-northeast-2
vpc:
id: "vpc-02906c8ffdf62bd59"
cidr: "10.10.0.0/16"
subnets:
private:
ap-northeast-2a:
id: "subnet-0e9fea9b6a57c7152"
cidr: "10.10.128.0/20"
ap-northeast-2c:
id: "subnet-0c4fa15e0c441e065"
cidr: "10.10.144.0/20"
nodeGroups:
- name: worker-nodes
instanceType: t3.medium
desiredCapacity: 2
minSize: 1
maxS
● onpremise 장비에 eks-cluster.yaml 생성
# t2 Type 은 2a / 2c만 되므로, 모두 가능하도록 t3으로 + kubernetes가 용량 많이 잡아먹으므로, medium 설정
# 컨테이너는 주로 private 네트워크에 생성하므로 true 설정
>> EC2 에서는 안해도 되지만, onpremise 장비는 다른 장비이므로, eksctl / awscli / kubectl 가 필요하다
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: webapps
region: ap-northeast-2
nodeGroups:
- name: worker
instanceType: t3.medium
desiredCapacity: 2
minSize: 1
maxSize: 3
ssh:
allow: false
privateNetworking: true
○ onpremise 장비에 aws cli 설치
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface
이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이
docs.aws.amazon.com
onprem ~/aws:$ aws --version
aws-cli/2.15.31 Python/3.11.8 Linux/3.10.0-1127.el7.x86_64 exe/x86_64.centos.7 prompt/off
● eksctl 설치
https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-eksctl.html
onprem ~/aws:$ eksctl version
0.174.0
● eks-cluster.yaml 실행 전에 자격증명
◇ IAM >> ecsadmin 계정 >> 액세스 키 2개까지 생성 가능하다
○ 삭제하고 새로 생성
>> 비밀번호가 설정되는데 파일 다운로드 하지 않는다면 보이지 않는다
● cluster 생성
# 시간이 걸린다
eksctl create cluster -f eks-cluster.yaml
# 지울 때에는 cloudformation 에서 삭제 + eksctl 로 설치했다면, 확실하게 지워줘야 한다
eksctl delete cluster -f eks-cluster.yaml
# docker 는 원래 있던 인스턴스
● master node 는 aws 가 관리해주므로 접속 불가하다
○ onpremise 장비는 접속이 불가능하다 ( cluster에 묶여 있지 않다 )
○ kubectl 자동완성 넣기
kubectl completion bash
>> source 에 넣어서 지금 자동완성 가능
source <(kubectl completion bash)
>> .bashrc 에 등록
onprem ~/aws:$ tail -n 1 ~/.bashrc
source <(kubectl completion bash)
● 테스트용 yaml 파일
>> apache.yaml >> 파드올리기
apiVersion: v1
kind: Pod
metadata:
name: apache-pod
labels:
app: myweb
spec:
containers:
- name: myweb-container
image: httpd:2.4
ports:
- containerPort: 80
>> 실행
kubectl apply -f apache.yaml
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
apache-pod 1/1 Running 0 6s 192.168.138.85 ip-192-168-138-115.ap-northeast-2.compute.internal <none> <none>
>> myweb-service.yaml 생성
apiVersion: v1
kind: Pod
metadata:
name: apache-pod
labels:
app: myweb
spec:
containers:
- name: myweb-container
image: httpd:2.4
ports:
- containerPort: 80
onprem ~/aws:$ cat myweb-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: myweb-service
spec:
ports:
- port: 8001
targetPort: 80
selector:
app: myweb
○ 실행 전, svc 라벨과 pod 라벨 확인
kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
apache-pod 1/1 Running 0 33s app=myweb
○ 서비스 제대로 올라갔다
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 62m
myweb-service ClusterIP 10.100.64.221 <none> 8001/TCP 12s
>> 엔드포인트까지 잘 찾았으나, 클러스터 IP 로 접속이 불가능하므로,
>>> 지금 onpremise 장비로 접속 불가
kubectl describe svc myweb-service
Name: myweb-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=myweb
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.100.64.221
IPs: 10.100.64.221
Port: <unset> 8001/TCP
TargetPort: 80/TCP
Endpoints: 192.168.138.85:80
Session Affinity: None
Events: <none>
○ 외부 접속을 위해서 svc 타입을 NodePort로 변경한다
---
apiVersion: v1
kind: Service
metadata:
name: myweb-service
spec:
ports:
- port: 8001
targetPort: 80
selector:
app: myweb
type: NodePort
○ port 변경되었다
onprem ~/aws:$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 65m
myweb-service NodePort 10.100.64.221 <none> 8001:30286/TCP 3m48s
◎ 하지만, eks 는 private 에 node 를 올리므로, port 가 변경되었지만 접속이 불가능하다
>>> 로드 밸런스로 접속을 해야한다
○ svc 의 타입을 LoadBalancer 로 변경
---
apiVersion: v1
kind: Service
metadata:
name: myweb-service
spec:
ports:
- port: 8001
targetPort: 80
selector:
app: myweb
type: LoadBalancer
>> 도메인 주소를 찾았다
# NodePort 에서 변경하였지만 여전히 Port가 존재한다
onprem ~/aws:$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 70m
myweb-service LoadBalancer 10.100.64.221 a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com 8001:30286/TCP 8m22s
# nslookup 명령어를 위해 설치
onprem ~/aws:$ sudo yum install -y bind-utils
● IP 를 찾을 수 있다
onprem ~/aws:$ nslookup a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com
Server: 10.0.2.3
Address: 10.0.2.3#53
Non-authoritative answer:
Name: a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com
Address: 15.164.18.5
Name: a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com
Address: 3.34.114.240
● NodePort 에서 변경하였지만, 그냥 포트로 접속한다
○ NodePort 입력하면 접속 안된다
# aws 자동완성 기능이 onpremise 장비에 없어서 불편할 때
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-completion.html
명령 완성 - AWS Command Line Interface
명령 완성 AWS Command Line Interface(AWS CLI)에는 Tab 키를 사용하여 부분적으로 입력된 명령을 완성할 수 있는 bash 호환 명령 완성 기능이 포함되어 있습니다. 이 기능은 대부분의 시스템에서 수동으로
docs.aws.amazon.com
'AWS' 카테고리의 다른 글
AWS - VPC 피어링 (0) | 2024.03.26 |
---|---|
AWS - VPC 엔드포인트 (0) | 2024.03.25 |
AWS - ECS (0) | 2024.03.21 |
AWS - 컨테이너 [ ECR ] (0) | 2024.03.21 |
AWS - CloudFormation (0) | 2024.03.20 |