이 연재글은 EKS(Elastic Kubernetes Service) 실습의 5번째 글입니다.

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
연재글 이동[이전글] aws kubernetes cluster에 배포된 application에서 외부 서비스 접속 가능 여부 확인
[다음글] ArgoCD를 이용하여 kubernetes cluster에 배포하기(GitOps)