- EKS(Elastic Kubernetes Service) 작업환경 구성하기
- ECR(Elastic Container Registry)에 Docker 이미지 배포하기
- EKS Cluster에 Docker Image 배포하기
- aws kubernetes cluster에 배포된 application에서 외부 서비스 접속 가능 여부 확인
- EKS에 ALB 적용하여 서비스 노출하기(Ingress Application Loadbalancer)
- ArgoCD를 이용하여 kubernetes cluster에 배포하기(GitOps)
EKS에서 ALB를 이용하고싶은 경우 alb-ingress-controller을 배포한 뒤, Ingress를 통해 사용할 alb에 대한 rule을 설정을 해주어야합니다.
Ingress는 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출합니다. 트래픽 라우팅은 Ingress 리소스에 정의된 규칙에 의해 컨트롤됩니다.
사전 체크 사항
eks cluster subnet에 아래 태그가 존재해야 합니다.
kubernetes.io/cluster/<cluster-name> = shared kubernetes.io/role/internal-elb = 1 # internal alb kubernetes.io/role/elb = 1 # internet-facing alb
for public alb
kubernetes.io/cluster/eks-cluster-demo-istio = shared kubernetes.io/role/elb = 1
for internal alb
kubernetes.io/cluster/eks-cluster-demo-mesh = shared kubernetes.io/role/internal-elb = 1
alb-ingress-controller 생성
아래 shell script를 실행하여 alb-ingress-controller를 생성합니다. shell script 내용중 아래 항목의 내용은 환경에 맞는 값으로 변경합니다.
CLUSTER_NAME=’eks-cluster-demo’ # 클러스터명
AWS_REGION=’ap-southeast-1′ # 클러스터 리젼
create_ingress_controller.sh
#/bin/bash echo '>>> CREATE ALBIngressControllerIAMPolicy ' aws iam create-policy \ --policy-name ALBIngressControllerIAMPolicy \ --policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/iam-policy.json echo '' echo '>>> Connecting ALBIngressControllerIAMPolicy To WorkerNode Role' NG_ROLE=`kubectl -n kube-system describe configmap aws-auth | grep rolearn` ACCOUNT=${NG_ROLE:24:12} WN_ROLE=${NG_ROLE:42} echo "ACCOUNT : $ACCOUNT" echo "WORKER NODE ROLE : $WN_ROLE" echo "NODE GROUP ROLE : $NG_ROLE" aws iam attach-role-policy \ --policy-arn arn:aws:iam::${ACCOUNT}:policy/ALBIngressControllerIAMPolicy \ --role-name ${WN_ROLE} echo '' echo '>>> Create ClusterRole for ALB Ingress Controller' kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/rbac-role.yaml echo '' echo '>>> Create ALB Ingress Controller' CLUSTER_NAME='eks-cluster-demo' # 클러스터명 AWS_REGION='ap-southeast-1' # 클러스터 리젼 VPC_ID=`eksctl get cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} --output json | jq -r '.[0].ResourcesVpcConfig.VpcId'` echo "CLUSTER NAME : $CLUSTER_NAME" echo "VPC ID : $VPC_ID" echo "AWS REGION : $AWS_REGION" echo '' echo '>>> Remove Old alb-ingress-controller.yaml file && New alb-ingress-controller.yaml file Download' rm -rf alb-ingress-controller.yaml* && curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/alb-ingress-controller.yaml && # alb-ingress-controller.yaml sed -i -e "s/# - --cluster-name=devCluster/- --cluster-name=$CLUSTER_NAME/g" alb-ingress-controller.yaml && sed -i -e "s/# - --aws-vpc-id=vpc-xxxxxx/- --aws-vpc-id=$VPC_ID/g" alb-ingress-controller.yaml && sed -i -e "s/# - --aws-region=us-west-1/- --aws-region=$AWS_REGION/g" alb-ingress-controller.yaml && kubectl apply -f ./alb-ingress-controller.yaml echo '>>> FINISH' sleep 5 echo '>>> Checking Create ALB Ingress Controller' kubectl get pods -n kube-system | grep alb
실행 및 확인
$ chmod +x create_ingress_controller.sh $ ./create_ingress_controller.sh $ kubectl get pods -n kube-system | grep alb alb-ingress-controller-6c84594ccc-gw6jd 1/1 Running 0 8h
Ingress alb 생성
rules 정보를 각자 환경에 맞도록 수정한 후 실행합니다.
ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: "ingress" annotations: kubernetes.io/ingress.class: alb # the value we set in alb-ingress-controller alb.ingress.kubernetes.io/scheme: internet-facing spec: rules: - http: paths: - path: /* backend: serviceName: "서비스명" servicePort: "서비스포트"
실행 및 확인
$ kubectl apply -f ingress.yaml $ kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE ingress external-lb * 211.2.110.52 80 59s