본문 바로가기

k8s 실전 프로젝트/2. Application 빌드와 배포

eks클러스터 생성 및 ALB 사용하기

1. CloudFormation으로 기본 인프라 구성

2022.03.03 - [책) k8s 실전 프로젝트/1. EKS 환경구축] - 1. CloudFormation 으로 기본 환경 생성하기

 

1. CloudFormation 으로 기본 환경 생성하기

# 클라우드 포메이션 기반 기본 환경 세팅하기 1. 클라우드 포메이션으로 이동 후 스택 생성을 클릭하여 스택을 생성한다. 2. 템플릿 관련 옵션을 설정 후 생성을 진행 한다. 3. 업로드한 파일을

may9noy.tistory.com

2. EKS 클러스터 구축

- Bastion인 EC2 인스턴스에게 ControlPlane 자격 부여하기

eks 클러스터를 생성하고, 조회하기 위한 인스턴스에게 ControlPlane IAM 권한을 부여한다.

아래와 같이 권한을 부여한다.

권한 부여와 관련된 내용은 아래링크를 참조 한다.

링크 못찾음 찾으면 추가 해야함...

 

- EC2 인스턴스를 생성 후 아래와 같이 진행 한다. 단, EC2 인스턴스는 이전에 생성한 VPC(eks-work-VPC) 내에 존재 해야 한다.

- aws configure를 통해 사용자 자격증명을 한다. (aws cli 설치 필요, 인증이 완료되면 아래와 같이 설정 된다.)

- EC2 인스턴스 생성 후 eksctl version 으로 버전 조회

- eksctl을 다운 받는다.

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

- 다운받은 eksctl을 해당 경로로 옮긴다. → /usr/local/bin.

sudo mv /tmp/eksctl /usr/local/bin

정상적으로 실행이 되는지 버전을 체크한다.

eksctl version

3. k8s 클러스터 생성

파일명은 create-cluster.yaml 로 한다. Cluster는 private 환경에 위치해야 하므로 private 서브넷을 넣어준다.

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: "EKS-SEUNG-SEUNG-CLUSTER"
  region: ap-northeast-2
  version: "1.21"

vpc:
  subnets:
    private:
      ap-northeast-2a: { id: "subnet-111111111115f571d" }
      ap-northeast-2c: { id: "subnet-11111111111cecdd2" }

생성한 파일을 실행

eksctl create cluster -f create-cluster.yaml

정상적으로 설치가 되었다면 아래와 같은 메세제가 출력된다.

4. 생성한 클러스터 내에 데이터 플레인 생성하기 (노드 그룹 생성 안되면 콘솔에서 생성 하자...)

파일명은 create-nodegroup.yaml 로 한다. 파일의 내용은 아래와 같다. 노드그룹도 private 서브넷에 존재해야 하므로 private로 생성해 준다.

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: "EKS-SEUNG-SEUNG-CLUSTER"
  region: ap-northeast-2

vpc:
  id: "vpc-1111111111dfd6f21c"
  cidr: "192.168.0.0/16"
  subnets:
    private:
      ap-northeast-2a:
        id: "subnet-111111118315f571d"
        cidr: "192.168.64.0/18"
      ap-northeast-2c:
        id: "subnet-11111111111cecdd2"
        cidr: "192.168.128.0/18"

nodeGroups:
  - name: ng-1
    instanceType: t3.medium
    desiredCapacity: 3
    minSize: 2
    maxSize: 5

nodegroup 생성 명령어

eksctl create nodegroup -f create-nodegroup.yaml

정상적으로 생성이 되면 아래와 같은 메세지가 출력된다.

kubectl 설치 (신버전 설치 후 BastionHost를 재부팅 해줘야 정상 반영 된다.)

# 신버전
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.6/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

# 기본버전
sudo snap install kubectl --classic

kubectl get nodes 명령어로 정상적으로 노드가 생성이 됐는지 확인이 가능하다. 

NAME                                                 STATUS   ROLES    AGE   VERSION
ip-192-168-109-228.ap-northeast-2.compute.internal   Ready    <none>   68m   v1.21.5-eks-9017834
ip-192-168-150-118.ap-northeast-2.compute.internal   Ready    <none>   68m   v1.21.5-eks-9017834
ip-192-168-187-188.ap-northeast-2.compute.internal   Ready    <none>   68m   v1.21.5-eks-9017834

5. ALB 설정

- 자격증명 만들기

- 기본 명령어

eksctl utils associate-iam-oidc-provider \
    --region <region-code> \
    --cluster <your-cluster-name> \
    --approve

- 적용 명령어 (예시)

eksctl utils associate-iam-oidc-provider \
    --region ap-northeast-2 \
    --cluster EKS-SEUNG-SEUNG-CLUSTER \
    --approve

- ALB에 대한 정책 생성

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.1/docs/install/iam_policy.json

- 위에서 받은 json 파일을 이용하여 아래의 명령어를 실행

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam-policy.json

- 이미 존재하는 정책이라고 나오는 경우 아래와 같이 정책을 연결만 해주자.

아래는 예시이다.

aws iam attach-role-policy 
	--role-name <role이름> 
    --policy-arn arn:aws:iam::<계정번호>:policy/AWSLoadBalancerControllerIAMPolicy

aws iam attach-role-policy 
	--role-name eks-worker-role 
    --policy-arn arn:aws:iam::11111111111:policy/AWSLoadBalancerControllerIAMPolicy

6. 클러스터에 대한 서비스 어카운트 생성

- 기본 명령어

eksctl create iamserviceaccount \
--cluster=<cluster-name> \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve

- 적용 명령어 (예시)

eksctl create iamserviceaccount \
--cluster=EKS-SEUNG-SEUNG-CLUSTER \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::111111111111:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve

- cert-manager 설치

kubectl apply --validate=false -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml

- ALB controller 생성하기

wget https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.1/docs/install/v2_2_1_full.yaml

- 위의 파일을 다운 받은 후 vi나 vim 으로 v2_2_1_full.yaml 파일을 오픈한다.

- set nu 를 아래와 같이 입력하여 각 줄의 번호를 표시 한다.

- /cluster-name 을 입력하고, 아래와 같이 변경을 한다.

# cluster-name의 부분을 반드시 생성한 클러스터의 이름으로 변경 합니다.
apiVersion: apps/v1
kind: Deployment
. . . 
name: aws-load-balancer-controller
namespace: kube-system
spec:
    . . . 
    template:
        spec:
            containers:
                - args:
                    - --cluster-name=<INSERT_CLUSTER_NAME> # 798번째 줄

# 우리는 이전의 서비스 어카운트를 미리 생성했으므로 파일의 끝부분으로 이동하여 kind:ServiceAccount 부분을 모두 삭제 합니다.
# 547번째 줄
apiVersion: v1
kind: ServiceAccount

- 이제 ALB 컨트롤러를 설치 합니다.

kubectl apply -f v2_2_1_full.yaml

* 주의 사항 : cert-manager 관련 오브젝트들이 전부 설치가 된 후 ALB 컨트롤러를 실행해야 한다.

여기까지 수행하면 k8s 클러스터에 ingress를 위한 ALB Controller가 설치 되었다.

 

6. nginx 서비스 배포하여 ALB 적용 확인 하기

deployment → service → ingress 순으로 실행한다. 각 단계별로 정상적으로 실행 되었는지 확인하고 진행 한다.

 

- deployment

파일명: nginx-deployment.yaml

파일 내용 (예시)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 8
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

- service

파일명: nginx-service.yaml

파일 내용 (예시)

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: "/healthy"
spec:
  selector:
     app: nginx
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80

- ingress

파일명: nginx-ingress.yaml

파일 내용 (예시)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "nginx-service"
                port:
                  number: 8080

7. 생성된 서비스 확인

kubectl describe ingress nginx-ingress

- Address에 나와있는 주소가 실제 접속하는 주소라고 보면 된다.

- Address 주소를 복사하여 웹페이지에 붙여넣으면, 아래와 같이 nginx 화면을 볼 수 있다.

8. AWS 로드밸런서가 확인

AWS에서 ALB가 자동으로 생성되었나 확인한다.

리스너는 아래와 같이 고정 응답 반환 404를 하도록 두성 되어 있다.

- 이제 다양한 서비스를 eks-alb를 통해 실행 후 동작 과정을 살펴보자.

 

# 참고 사이트

https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-alb-ingress-controller-setup/

 

Amazon EKS의 Amazon EC2 노드 그룹에서 AWS 로드 밸런서 컨트롤러를 사용하여 ALB 설정

참고: cluster-name은 사용자의 클러스터 이름으로, region-name은 사용자의 AWS 리전으로, ca-thumbprint는 루트 CA 인증서의 지문으로 바꿉니다. 클러스터에서 oidc.eks.region-name.amazonaws.com과 함께 사용하는

aws.amazon.com