명령 내릴 서버를 만들고, 신규 VPC로 클러스터를 만들고 , IP 모드로 서비스를 배포해보자~
<1> AWS 콘솔에서 Cloud9 설치 - 명령을 내릴 서버 1대 생성
<2> 각종 명령어 툴 설치
<3> Cloud9에서 컨테이너 이미지 만들어보기 (선택)
<4> ECR에 컨테이너 이미지 올리기
<5> 명령어 유틸로 k8s 클러스터 생성
<6> 인그레스 컨트롤러 L7 만들기
<7> kube-ops-view 설치로 가시성을 높여 보자
<8> 인그레스 컨트롤러 L7 만들기
<9> Cert-manager 설치
<10> 배포
<11> 삭제
<20> 다음 2. Cloud9생성과 EKS생성
<30> (몰아보기) EKS 실습5
<1> AWS 콘솔에서 Cloud9 설치 - 명령을 내릴 서버 1대 생성
1
aws 콘솔 로그인 > 토쿄 or 싱가포르 or 서울 리전 선택 (어디든 상관없다)
VPC 마법사로 VPC 1개 - Public Subnet 1개 만든다.
Public Subnet에 Cloud9 생성한다.
2
순서는
admin role 생성, Cloud9 서버 생성, 명령어 툴 설치 , 권한 제공
3
admin role 생성 ?
IAM > Roles > Create role > admin role을 생성 - seo-admin-role
Cloud9 > k8s-admin > 생성, admin role을 해당 EC2 서버에 연결하기
3
Cloud9 서버 생성?
Cloud9에서
Cloud9 , 서버 1대 구축하는 것이다.
해당 서버에 role을 주거나 해당 서버에서 access-key를 설정해서 사용한다.
ec2 가서 admin-role을 ec2에 적용
해당 서버에서 명령을 내리기 위해, 각종 명령어 툴을 설치한다.
or
Cloudformation 으로 EC2 생성 - 툴까지 설치 됨
https://brunch.co.kr/@topasvga/1814
or
Cloud9 , EKS 까지 한번에 설치 - CloudFormation
4
기존 크리덴셜 적용 안되게 설정 변경하기
오른쪽 위 톱니바퀴 클릭 > AWS Settings > Credentials> AWS managed temporry credentials 비활성화 (빨간색이 보이도록 한다)
5
기존 크리덴셜 삭제
rm -vf ${HOME}/.aws/credentials
6
cloud9에서
aws sts get-caller-identity --query Arn
(적용한 role 나오면 정상)
<2> 각종 명령어 툴 설치
cloud9 서버에 각종 명령어 툴 설치하기
1
aws cli 업데이트
sudo pip install --upgrade awscli
aws --version
2
eksctl , 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
3
쿠버 네티스에 명령을 내리는 유틸
sudo chmod +x /usr/local/bin/kubectl
kubectl version --client=true --short=true
4
기타
json 지원
sudo yum install -y jq
bash 지원
sudo yum install -y bash-completion
5
참고
툴 설치는 S3버킷에 스크립트를 올려놓고, 해당 스크립트를 다운로드하도록 하면 한 번에 설치할 수 있다.
6
디폴트 값 세팅
현재 리전을 기본 리전으로 지정
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')
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
8
도커 이미지 빌듯이 용량 부족 이슈 해결을 위한 디스크 증설 (선택)
sh resize.sh
df -h
<3> Cloud9에서 컨테이너 이미지 만들어 보기 (선택)
1
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
실행
docker run -p 8080:80 --name test-nginx test-image
8080 포트로 접속하면 80으로 연결한다.
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로 한다.
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.28 버전으로 설치한다. = 2023년 12월 최신
cat << EOF > eks-demo-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-demo # 생성할 EKS 클러스터명
region: ${AWS_REGION} # 클러스터를 생성할 리젼
version: "1.28"
vpc:
cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
managedNodeGroups:
- name: node-group # 클러스터의 노드 그룹명
instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입
desiredCapacity: 3 # 클러스터 워커 노드의 개수
volumeSize: 10 # 클러스터 워커 노드의 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
// VPC 새로 만들고 클러스터를 생성한다.
// 기존 있는 VPC에 설치하는 법은 따로 정리
// ssh는 막음
// 볼륨은 10 , 실무에서는 30 정도로.
5
eksctl create cluster -f eks-demo-cluster.yaml
// 아래 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도 삭제해야 인스턴스가 삭제된다.
그렇지 않으면 다시 자동 생성됨
6
확인
kubectl get nodes
~/.kube/config에 클러스터 자격 증명이 더해진 것을 확인
<6> AWS 콘솔에서 node정보 보기 (선택)
1
AWS 콘솔 > EKS cluster > Overview에서 nodes가 보이는지 확인한다.
안 보인다.
cloud9에서 eks를 만들어서, 콘솔에서 보려면 console 크리 텐션을 클러스터에 추가해줘야 콘솔에서 보인다.
권한을 추가한다 ( 선택)
2
rolearn=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')
echo ${rolearn}
3
assumedrolename=$(echo ${rolearn} | awk -F/ '{print $(NF-1)}')
rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text)
4
매핑 생성
eksctl create iamidentitymapping --cluster eks-demo --arn ${rolearn} --group system:masters --username admin
5
정보 확인
kubectl describe configmap -n kube-system aws-auth
6
콘솔 가서 확인
EKS > Clusters > Overview와 Workloads에 나오는지 확인
<7> kube-ops-view 설치로 가시성을 높여 보자 (선택)
참고
https://brunch.co.kr/@topasvga/3239
1
Helm 설치
helm version --short
2
kube-ops-view 설치
helm install kube-ops-view stable/kube-ops-view --set service.type=LoadBalancer --set rbac.create=True
3
차트 설치 확인
helm list
(t6-admin@myeks:default) [root@myeks-host ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kube-ops-view default 1 2021-08-30 18:46 +09 KST deployed kube-ops-view-1.2.4 20.4.0
4
kubectl get svc kube-ops-view
(t6-admin@myeks:default) [root@myeks-host ~]# kubectl get svc kube-ops-view
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
CLB가 자동 생성된다.
(5분 소요)
5
웹브라우저로 접속
<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를 삭제한다.
<20> 다음 2. Cloud9생성과 EKS생성
https://brunch.co.kr/@topasvga/1880
<30> (몰아보기) EKS 실습5
https://brunch.co.kr/@topasvga/1884
https://brunch.co.kr/@topasvga/1679
감사합니다.