명령 내릴 서버를 만들고, 신규 VPC로 클러스터를 만들고 , IP 모드로 서비스를 배포해보자~
<1> AWS 콘솔에서 aws-com5 EC2 1대 생성 (실습)
<2> eksctl , kubectl 툴 설치 (실습)
<3> 컨테이너 이미지 만들어보기 (선택)
<4> ECR에 컨테이너 이미지 올리기 (실습)
<5> 명령어 유틸로 k8s 클러스터 생성 (실습)
<6> 인그레스 컨트롤러 L7 만들기 (실습)
<7> kube-ops-view 설치로 가시성을 높여 보자 (실습)
<8> 인그레스 컨트롤러 L7 만들기 (실습)
<9> Cert-manager 설치 (실습)
<10> 배포 (실습)
<11> 삭제 (실습)
# 클러스터 이름
eksworkshop-eksctl
nodegroup3
<1> AWS 콘솔에서 aws-com5 EC2 1대 생성 (실습)
1
aws-com5 EC2 1대 생성
2
IAM > Roles > Create role > admin role을 생성 - seo-admin-role
3
Cloudformation 으로 EC2 생성 - 툴까지 설치 됨
https://brunch.co.kr/@topasvga/1814
<2> eksctl , kubectl 툴 설치
1
# EC2 로그인
# eksct 설치l = EKS 클러스터 생성하는 유틸
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv -v /tmp/eksctl /usr/local/bin
eksctl version
2
# kubectl 설치 = 쿠버네티스에 명령을 내리는 툴
쿠버네티스 마스터에 명령을 내릴때 사용한다. 리소스 만들때 사용하는 툴.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version
다운로드 사이트
https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/
3
# Install kubens kubectx
yum install -y git
git clone https://github.com/ahmetb/kubectx /opt/kubectx
ln -s /opt/kubectx/kubens /usr/local/bin/kubens
ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
4
# aws cli 업데이트
sudo pip install --upgrade awscli
aws --version
5
# json 지원
sudo yum install -y jq
# bash 지원
sudo yum install -y bash-completion
6
참고
툴 설치는 S3버킷에 스크립트를 올려놓고, 해당 스크립트를 다운로드하도록 하면 한 번에 설치할 수 있다.
# 디폴트 값 세팅
# 현재 리전을 기본 리전으로 지정
# 리전을 변수 저장 ?
# 방법1
export AWS_REGION=ap-northeast-2
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
aws configure get default.region
echo ${AWS_REGION}
# 방법2 (선택)
aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-2
Default output format [None]:
export AWS_REGION=$(aws configure get default.region)
echo "export AWS_REGION=$AWS_REGION" >> ~/.bashrc
echo $AWS_REGION
# 방법3 (선택)
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
aws configure get default.region
7
# account id 변수로 지정? (필수)
export ACCOUNT_ID=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.accountId')
export ACCOUNT_ID=33971
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
8
# 도커 이미지 빌듯이 용량 부족 이슈 해결을 위한 디스크 증설 (선택)
sh resize.sh
df -h
<3> 컨테이너 이미지 만들어보기 (선택)
1
yum install docker
mkdir -p ~/environment/
cd ~/environment/
2
# 컨테이너 이미지 만들기
cat << EOF > Dockerfile
FROM nginx:latest
RUN echo '<h1> test nginx web page </h1>' >> index.html
RUN cp /index.html /usr/share/nginx/html
EOF
# 확인
docker images
3
# 실행
# 8080 포트로 접속하면 80으로 연결한다.
docker run -p 8080:80 --name test-nginx test-image
4
# 새 터미널에서 도커 떠있는 것 확인
dicker ps
5
# 컨테이너 로그 확인
docker logs -f test-nginx
6
# 컨테이너 내부에 접속해
docker exec -it test-nginx /bin/bash
7
# 컨테이너 중지
docker stop test-nginx
8
# 컨테이너 삭제 (중지 상태인 컨테이너 삭제 가능)
docker rm test-nginx
9
# 컨테이너 이미지 삭제
docker rmi test-image
10
# 컨테이너 실습 더 해보기
<4> ECR에 컨테이너 이미지 올리기
1
# 소스 코드 받기
ls
2
# 레파지토리인 ecr 만들기
aws ecr create-repository \
--repository-name demo-flask-backend \
--image-scanning-configuration scanOnPush=true \
--region ${AWS_REGION}
3
확인
aws 콘솔 가서 ecr 만들어진 것 확인 (선택)
4
인증 토큰 가져와서 , 인증 토큰을 docker-login명령어로 전달.
사용이 이름을 aws로 명시, 인증하려는 목적지를 ECR로 한다.
# account id 변수로 지정? (필수)
export ACCOUNT_ID=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.accountId')
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
# 로그인
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
5
# 빌드
cd ~/environment/amazon-eks-flask
docker build -t demo-flask-backend .
6
# 태그 추가
docker tag demo-flask-backend:latest $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest
7
# docker push로 , 이미지를 레파지토리에 올리기
docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest
8
AWS 콘솔 > ECR에서 확인
9
컨테이너 실습 더 해보기
hello world도 ecr에 올려 보자
<5> k8s 클러스터 만들기
1
만드는 방법 4가지?
AWS 콘솔로 클릭 클릭
AWS Cloudformation , CDK로 생성
eksctl로 생성
테라폼 등으로 생성
2
여기서는 eksctl로 생성한다.
3
cd ~/environment
4
# 192.168.0.0/16 로 VPC 만들고, eks-demo 클러스터를 생성해 보자.
# 1.31 버전으로 설치한다. = 2024년 12월 최신 버전이다.
# 앞에 리전과 클러스터 이름이 중복되어 ap-northeast-1으로 변경함.
export AWS_REGION=ap-northeast-1
echo ${AWS_REGION}
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: 1 # 클러스터 워커 노드의 개수
volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
# ssh:
# enableSsm: true
iam:
withAddonPolicies:
imageBuilder: true # AWS ECR에 대한 권한 추가
# albIngress: true # albIngress에 대한 권한 추가
cloudWatch: true # cloudWatch에 대한 권한 추가
autoScaler: true # auto scaling에 대한 권한 추가
cloudWatch:
clusterLogging:
enableTypes: ["*"]
EOF
eksctl create cluster -f eks-demo-cluster.yaml
# VPC 새로 만들고 클러스터를 생성한다.
# 기존 있는 VPC에 설치하는 법은 따로 정리
# ssh는 막음
# 볼륨은 20 , 실무에서는 30 정도로.
5
# Cloud9 에서
// 아래 error는 cloud9에서 AWS Settings > Credentials> AWS managed temporry credentials 비활성화 안 했을 때 발생
// ssh 부분 주석처리 안 했을 때도 발생
2021-09-02 05:21:56 [✖] error describing stack: ExpiredToken: The security token included in the request is expired
status code: 403, request id: c7208776-f13c-4a52-b93b-adf63e9f5f30
// 잘못해서 클러스터 삭제 필요시 해야 하는것
ec2 > autoscaling 그룹을 반드시 삭제해야 인스턴스가 삭제 된다.
그렇지 않으면 다시 자동으로 EC2가 다시 생성 된다.
6
# 확인
kubectl get nodes
~/.kube/config에 클러스터 자격 증명이 더해진 것을 확인
<6> AWS 콘솔에서 node정보 보기 (선택)
1
AWS 콘솔 > EKS cluster > Overview에서 nodes가 보이는지 확인한다.
안 보인다.
cloud9에서 eks를 만들어서, 콘솔에서 보려면 console 크리 텐션을 클러스터에 추가해줘야 콘솔에서 보인다.
권한을 추가한다 ( 선택)
2
# cloud9 사용시
rolearn=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')
echo ${rolearn}
assumedrolename=$(echo ${rolearn} | awk -F/ '{print $(NF-1)}')
rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text)
3
# 매핑 생성 , EC2 사용시
eksctl create iamidentitymapping --cluster eks-demo --arn ${rolearn} --group system:masters --username admin
4
# 정보 확인
kubectl describe configmap -n kube-system aws-auth
5
콘솔 가서 확인
EKS > Clusters > Overview와 Workloads에 나오는지 확인
<7> kube-ops-view 설치로 가시성을 높여 보자 (선택)
# kube-ops-view 설정
https://brunch.co.kr/@topasvga/1653
<8> 인그레스 컨트롤러 L7 만들기
1
AWS Load Balancer Controller를 만들어 서비스를 외부에 노출하자.
2
ALB - 인그래스--서비스------Pod 순으로 통신된다.
3
AWS Load Balancer Controller 트래픽 모드는 2가지를 지원한다.
인스턴스 모드?
클러스터 내의 node를 대상으로 등록한다.
ALB > nodePort > Pod로 통신된다.
IP 모드?
클러스터 내의 pod를 대상으로 등록한다.
ALB > Pod로 통신한다.
효율적이다!!!
우리는 그래서 IP 모드를 사용한다.
EC2 > NLB > 대상그룹에 가면 대상 유형을 확인할 수 있다.
IP or 인스턴스
4
# 관리 폴더 만들기
cd ~/environment
mkdir -p manifests/alb-controller && cd manifests/alb-controller
5
IAM ODIC 생성 (OpenID Connect) 생성
클러스터 내 Pod 가 API , 외부 서비스와 인증하기 위해 사용되는 service account에 IAM role을 사용하기 위해 필요.
eksctl utils associate-iam-oidc-provider \
--region ${AWS_REGION} \
--cluster eks-demo \
--approve
6
확인
aws eks describe-cluster --name eks-demo --query "cluster.identity.oidc.issuer" --output text
aws iam list-open-id-connect-providers
aws iam list-open-id-connect-providers | grep 8A6E78112D7F1C4DC352B1B511DD13CF
7
로드 밸런서 컨트롤러에 부여할 iam policy 생성
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
8
서비스 어카운트 생성
eksctl create iamserviceaccount \
--cluster eks-demo \
--namespace kube-system \
--name aws-load-balancer-controller \
--attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve
참고
<9> Cert-manager 설치
1
쿠버네티스 클러스터 내에서 TLS인증서를 자동으로 프로비저닝 및 관리하는 오픈 소스
2
3
4
# 파일 수정
ServiceAccount yaml spec 부분 8줄을 없애줍니다
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: aws-load-balancer-controller
name: aws-load-balancer-controller
namespace: kube-system
5
클러스터 이름 수정
eks-demo로 변경
spec:
containers:
- args:
- --cluster-name=eks-demo # 생성한 클러스터 이름을 입력
- --ingress-class=alb
6
모니터링용 터미널 1
watch -d kubectl get pod,ds,svc,ep,deployment -A
kubectl get pod,ds,svc,ep,deployment -A
배포
kubectl apply -f v2_2_0_full.yaml
7
컨트롤러 실행 확인
kubectl get deployment -n kube-system aws-load-balancer-controller
8
서비스 어카운트 생성 확인
kubectl get sa aws-load-balancer-controller -n kube-system -o yaml
9
로그로 확인 (선택)
kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")
10
ALBPOD=$(kubectl get pod -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")
kubectl describe pod -n kube-system ${ALBPOD}
11
참고 자료
IP mode는 서비스 어카운트가 필요
<10> 배포
1
접속 순서
ALB > Ingress > Service > Pod
2
배포 순서
ECR > Deployment > Service > Ingress
L7 ALB 인그래스의 IP mode로 서비스해보자.
<11> 삭제
EC2 > Autoscaling 부터 삭제한다. 그래야 삭제한 EC2가 다시 생성되지 않는다.
Cloud formation 삭제한다.
VPC를 삭제한다.
LB를 삭제한다.
<30> (몰아보기) EKS 실습5
https://brunch.co.kr/@topasvga/1884
https://brunch.co.kr/@topasvga/1679
<20> 다음 2. Cloud9생성과 EKS생성
https://brunch.co.kr/@topasvga/1880