-
실습에 사용할 IDE 환경인 Cloud9 인스턴스를 생성합니다.
VPC setting에서 Cloudformation을 통해 생성된 Private-A 서브넷에 생성합니다.
-
Cloud9 인스턴스에 IAM Role 할당합니다.
실습에 필요한 권한을 위해 Cloudformation을 통해 생성된 Role을 할당합니다.
-
Temp Credential 제거합니다.
rm -vf ${HOME}/.aws/credentials
-
aws cli를 통해 알맞은 IAM Role이 설정되어 있는지 확인합니다.
aws sts get-caller-identity
-
kubectl 설치
# Kubectl 1.27 설치 sudo curl -o /usr/local/bin/kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl sudo chmod +x /usr/local/bin/kubectl kubectl version --short --client
-
awscli 업데이트
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install source ~/.bashrc aws --version
-
jq 설치
sudo yum -y install jq jq --version
-
eksctl 설치
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
-
kubectl 자동완성 설정
kubectl completion bash >> ~/.bash_completion . /etc/profile.d/bash_completion.sh . ~/.bash_completion
-
Account ID, Region 설정
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
-
k9s 설치
K9S_VERSION=$(curl -s https://api.github.com/repos/derailed/k9s/releases/latest | jq -r '.tag_name') curl -sL https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_amd64.tar.gz | sudo tar xfz - -C /usr/local/bin k9s
-
Bash profile 저장
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile aws configure set default.region ${AWS_REGION} aws configure get default.region
-
실습에 필요한 자료를 GitHub를 통해 Clone
git clone https://github.com/koDaegon/book-sample.git
-
Origin Remote 삭제
cd book-sample git remote -v git remote remove origin
eks/eks-cluster 파일음 참조하여 eksctl을 통해 EKS 클러스터를 배포합니다.
-
Cluster 이름 및 Private Subnet 값 변경을 배포 전 꼭 확인합니다.
apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: <CLUSTER_NAME> # 생성할 EKS 클러스터명 region: ap-northeast-2 # 클러스터를 생성할 리전 version: "1.27" vpc: subnets: private: ap-northeast-2a: { id: <Private-Subnet-id-1> } #Private Subnet A ID로 대체 ap-northeast-2c: { id: <Private-Subnet-id-2> } #Private Subnet C ID로 대체 managedNodeGroups: - name: node-group # 클러스터의 노드 그룹명 instanceType: m5.xlarge # 클러스터 워커 노드의 인스턴스 타입 desiredCapacity: 2 # 클러스터 워커 노드의 갯수 volumeSize: 30 # 클러스터 워커 노드의 EBS 용량 (단위: GiB) privateNetworking: true labels: nodegroup-type: "worker-node" iam: instanceRoleName: "role-eks-test-node" # 노드그룹 Role 이름 withAddonPolicies: imageBuilder: true # Amazon ECR에 대한 권한 추가 cloudWatch: true # cloudWatch에 대한 권한 추가 cloudWatch: clusterLogging: enableTypes: ["api", "audit", "authenticator", "controllerManager", "scheduler"] iam: withOIDC: true
-
eksctl을 이용해 EKS Cluster를 생성합니다.
Cluster 및 Nodegroup 생성에 15분 정도 소요됩니다.
cd eksctl eksctl create cluster -f eks-cluster.yaml
-
클러스터 및 노드 배포 확인 후 CLUSTER_NAME 설정합니다.
생성한 클러스터 이름을 추후 실습을 위해 환경변수에 등록
kubectl get nodes export CLUSTER_NAME=<CLUSTER_NAME>
-
IAM OIDC 생성 확인합니다.
aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text
-
IAM policy 생성합니다.
cd ~/environment curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
-
AWS Load Balancer Controller를 위한 ServiceAccount 생성합니다.
eksctl create iamserviceaccount \ --cluster ${CLUSTER_NAME} \ --namespace kube-system \ --name aws-load-balancer-controller \ --attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
-
eksctl을 통해 생성된 IAM Role 및 ServiceAccount를 확인합니다.
Cloudformation을 통해 해당 IAM Role로 바로 이동 가능합니다.
kubectl get sa aws-load-balancer-controller -n kube-system -o yaml
-
AWS LB controller를 위한 Cert-manager 설치합니다.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml kubectl get pods -n cert-manager
-
AWS LB controller yaml 파일 다운로드합니다.
wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.6.1/v2_6_1_full.yaml
-
다운로드 받은 파일(v2_6_1_full.yaml)에서 cluster-name을 현재 클러스터 이름으로 변경합니다. (line 854)
-
또한, eksctl을 통해서 이미 service account를 생성하였기 때문에 manifest 파일에서 Service account부분(line 595~603) 삭제 후 저장합니다.
-
AWS Load Balancer controller 파일을 배포 합니다.
kubectl apply -f v2_6_1_full.yaml
-
AWS Load Balancer Controller Add-on이 정상 배포되었는지 확인 합니다.
kubectl get deployment aws-load-balancer-controller -n kube-system
-
Describe 명령을 통해 자세한 속성 값을 확인 할 수 있습니다.
ALBPOD=$(kubectl get pod -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+") kubectl describe pod -n kube-system ${ALBPOD}
-
Ingress Test를 위해
./game-2048.yaml
파일에 Public Subnet ID 변경 합니다.--- apiVersion: v1 kind: Namespace metadata: name: game-2048 --- apiVersion: apps/v1 kind: Deployment metadata: namespace: game-2048 name: deployment-2048 spec: selector: matchLabels: app.kubernetes.io/name: app-2048 replicas: 2 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - image: public.ecr.aws/l6m2t8p7/docker-2048:latest imagePullPolicy: Always name: app-2048 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: namespace: game-2048 name: service-2048 spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app.kubernetes.io/name: app-2048 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: game-2048 name: ingress-2048 annotations: alb.ingress.kubernetes.io/ip-address-type: ipv4 alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=60 alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/subnets: <public_subnet_id_1>, <public_subnet_id_2> alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=30 alb.ingress.kubernetes.io/target-type: ip kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/backend-protocol: HTTP spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80
-
game-2048.yaml
파일을 배포합니다.cd book-sample kubectl apply -f game-2048.yaml
-
결과 화면
-
IngressClass 및 IngressClassParams 매니페스트를 다운로드 후 클러스터에 배포합니다.
curl -Lo v2_6_1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.6.1/v2_6_1_ingclass.yaml kubectl apply -f v2_6_1_ingclass.yaml
-
아래와 같이 game-2048.ymal 파일에 ingressClassName을 추가하여 매니페스트를 배포합니다.
-
ingress 배포 확인
kubectl get ingress ingress-2048 -n game-2048 -o yaml