brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Aug 30. 2021

EKS 4탄-7. EKS-Ingress ALB-7/17

실습 4탄 =  7/17

<0>  인그래스 사용시 태그 설정은 필수이다.

<1>  실습1 - Ingress (ALB) 모드 실습 - 디플로이먼트 생성

<2>  실습2 - Ingress (ALB) 모드 실습 - 인그래스 생성

<3>  Ingress (ALB)  HTTP/HTTPS + ExternalDNS] 실습

<10> 다음편 인증,인가




<0>  인그래스 사용시 태그 설정은 필수이다.


인그래스는  ALB이다.  L7이다.

디플로이먼트  > 서비스  > 인그래스 순으로 생성



인그래스 ALB L7  사용자 접속 ?

인그래스 > 서비스 > Pod순으로  접속



https://aws.amazon.com/ko/blogs/containers/introducing-aws-load-balancer-controller/


ALB L7 서비스를 하려면 인그래스를 설정해야 한다!!

NLB는 인그래스가 없다.


IP mode는 ALB나 NLB나 서비스 어카운트가 필요하다. 

왜냐하면 Pod정보를 확인해야 하므로

태그 값도 필요하다.



1

Ingress ALB (L7)

L7처리 함.

인스턴스 모드로 하면 노드 포트로 들어와서 IPTable rule 적용됨.

IP 모드로 사용하면 Pod의 IP정보를 알려주고, Pod로 통신함.


2

Pod가 존재하는 서브넷에 파드가 필요함.

ALB 경우 서브넷에 tag(태그) 설정이 반드시 필요

미리 cloudformation 스택 서브넷에 태그 지정 필요


tag 내용 참고

https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-vpc-subnet-discovery/


https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-subnet-auto-discovery-alb/



3

필수 설정 태그1 내용

 # 퍼블릭서브넷

Key: 

kubernetes.io/role/elb 

Value: 1


필수 설정 태그2

# 프라이빗서브넷

Key: 

kubernetes.io/role/internal-elb 

Value: 1


# 태그 설정

aws ec2 create-tags --resources $SubnetID --tags "Key=kubernetes.io/role/elb,Value=1"


확인

AWS console에서 서브넷 > 태그 > kubernetes.io/role/elb   1 이 있는지 확인.


4

서브넷 tag 없을 때 - ALB 미생성 문제 발생 : Failed build model due to couldn't auto-discover subnets: unable to discover at least one subnet

kubectl describe ingress backend-ingress |grep Events: -A5





<1>  Ingress (ALB) 모드 실습 - 디플로이먼트 생성



1

디플로이먼트 3개

서비스 3개

인그레스 순으로 생성한다.


cat <<EOF | kubectl create -f -

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy1-websrv

spec:

  replicas: 2

  selector:

    matchLabels:

      app: websrv

  template:

    metadata:

      labels:

        app: websrv

    spec:

      containers:

      - name: pod-web

        image: nginx

---

apiVersion: v1

kind: Service

metadata:

  name: svc1-web

spec:

  ports:

    - name: web-port

      port: 9001

      targetPort: 80

  selector:

    app: websrv

  type: NodePort

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy2-guestsrv

spec:

  replicas: 2

  selector:

    matchLabels:

      app: guestsrv

  template:

    metadata:

      labels:

        app: guestsrv

    spec:

      containers:

      - name: pod-guest

        image: gcr.io/google-samples/kubernetes-bootcamp:v1

        ports:

        - containerPort: 8080

---

apiVersion: v1

kind: Service

metadata:

  name: svc2-guest

spec:

  ports:

    - name: guest-port

      port: 9002

      targetPort: 8080

  selector:

    app: guestsrv

  type: NodePort

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: deploy3-adminsrv

spec:

  replicas: 2

  selector:

    matchLabels:

      app: adminsrv

  template:

    metadata:

      labels:

        app: adminsrv

    spec:

      containers:

      - name: pod-admin

        image: k8s.gcr.io/echoserver:1.5

        ports:

        - containerPort: 8080

---

apiVersion: v1

kind: Service

metadata:

  name: svc3-admin

spec:

  ports:

    - name: admin-port

      port: 9003

      targetPort: 8080

  selector:

    app: adminsrv

  type: NodePort

EOF




참고 

https://aws-eks-web-application.workshop.aws/ko/60-ingress-controller/100-launch-alb.html




2

터미널2에서 모니터링 ?


watch -d kubectl get ingress,svc,ep,pod


kubectl get pod,svc,ep


NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE

service/kubernetes   ClusterIP   10.100.0.1       <none>        443/TCP          14m

service/svc1-web     NodePort    10.100.5.199     <none>        9001:31403/TCP   30s

service/svc2-guest   NodePort    10.100.25.225    <none>        9002:31937/TCP   30s

service/svc3-admin   NodePort    10.100.170.102   <none>        9003:31853/TCP   30s


NAME                   ENDPOINTS                              AGE

endpoints/kubernetes   192.168.1.27:443,192.168.2.121:443     14m

endpoints/svc1-web     192.168.1.11:80,192.168.2.207:80       30s

endpoints/svc2-guest   192.168.1.121:8080,192.168.2.64:8080   30s

endpoints/svc3-admin   192.168.1.55:8080,192.168.2.172:8080   30s



3

인그래스 생성  내용 확인 ?

//    kubernetes.io/ingress.class: alb

//     alb.ingress.kubernetes.io/target-type: ip   ip 모드, 직접 가도록 .


접속 ?

path: /guest

path: /admin

path: /





<2>  실습2 - Ingress (ALB) 모드 실습 - 인그래스 생성


 watch -d 'kubectl get ing,svc,ep'

NAME           CLASS    HOSTS   ADDRESS                                                                       PORTS   AGE

ingress.networking.k8s.io/ingress-alb   <none>   *       k8s-default-ingressa-9af0e6c6a0-1356801970.ap-southeast-1.elb.amazonaws.com   80      2m31s



1

rules (path) 설정 시 상세한 path 를 상단에 둘 것


인그래스 만들어 보자~



cat <<EOF | kubectl create -f -

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: "ingress-alb"

  annotations:

    kubernetes.io/ingress.class: alb

    alb.ingress.kubernetes.io/scheme: internet-facing

    alb.ingress.kubernetes.io/target-type: ip

spec:

  rules:

    - http:

        paths:

          - path: /guest

            pathType: Prefix

            backend:

              service:

                name: svc2-guest

                port:

                  number: 9002

          - path: /admin

            pathType: Prefix

            backend:  

              service:

                name: svc3-admin

                port:

                  number: 9003

          - path: /

            pathType: Prefix

            backend:

              service:

                name: "svc1-web"

                port:

                  number: 9001

EOF




2

// 사용자 접속 ?

 ALB > 인그래스 > 서비스 > Pod순으로  접속



3

kubectl get ingress

kubectl describe ingress ingress-alb

(10분후  ALB 생성됨)


(t6-admin@myeks:default) [root@myeks-host ~]# kubectl get ingress

NAME          CLASS    HOSTS   ADDRESS                                                                      PORTS   AGE

ingress-alb   <none>   *       k8s-default-ingressa-9af0e6c6a0-429478120.ap-northeast-2.elb.amazonaws.com   80      26s



4

# 다음 명령어 수행 결과를 웹 브라우저에 붙여넣어 확인합니다.


echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/guest


echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/admin


echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')



결과

(t6-admin@myeks:default) [root@myeks-host ~]# echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/guest

http://k8s-default-ingressa-9af0e6c6a0-429478120.ap-northeast-2.elb.amazonaws.com/guest


(t6-admin@myeks:default) [root@myeks-host ~]# echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/admin

http://k8s-default-ingressa-9af0e6c6a0-429478120.ap-northeast-2.elb.amazonaws.com/admin


(t6-admin@myeks:default) [root@myeks-host ~]# echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')

http://k8s-default-ingressa-9af0e6c6a0-429478120.ap-northeast-2.elb.amazonaws.com



5

aws console에서  

l4  동작 확인 ?

대상 그룹 확인 ?





6

사이트 3곳을  웹브라우저로 접속



7

삭제

kubectl delete ingress ingress-alb; kubectl delete svc svc3-admin svc2-guest svc1-web; kubectl delete deploy deploy3-adminsrv deploy2-guestsrv deploy1-websrv


kubectl delete ingress,deploy,svc --all






<3>  Ingress (ALB)  HTTP/HTTPS + ExternalDNS] 실습


// 추가 테스트 필요


1

공인도메인 소유, AWS Route53 도메인등록 상태, 버지니아 인증서 요청/발급 완료상태, 

ALB 가 위치한 리전의 인증서 요청/발급 완료상태, ExternalDNS 준비완료상태

Deploy 설정 상태



2

클러스터 네임 확인

echo $CLUSTER_NAME



3

사용 리전의 인증서 ARN 확인

CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`

echo $CERT_ARN



4

자신의 도메인 변수 지정

MyDomain=<자신의 도메인>

MyWeb=<각자편한웹서버이름>

MyDomain=in.xxxxxxxx.com

MyWeb=ingress



5


cat <<EOF | kubectl create -f -

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: "ingress-alb"

  annotations:

    kubernetes.io/ingress.class: alb

    alb.ingress.kubernetes.io/scheme: internet-facing

    alb.ingress.kubernetes.io/target-type: ip

    alb.ingress.kubernetes.io/backend-protocol: HTTP

    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'

    alb.ingress.kubernetes.io/certificate-arn: ${CERT_ARN}

    external-dns.alpha.kubernetes.io/hostname: "${MyWeb}.${MyDomain}"

spec:

  rules:

    - host: "${MyWeb}.${MyDomain}"

      http:

        paths:

          - path: /guest

            pathType: Prefix

            backend:

              service:

                name: svc2-guest

                port:

                  number: 9002

          - path: /admin

            pathType: Prefix

            backend:  

              service:

                name: svc3-admin

                port:

                  number: 9003

          - path: /

            pathType: Prefix

            backend:

              service:

                name: "svc1-web"

                port:

                  number: 9001

EOF





6

kubectl get ingress,svc,pod,ep

kubectl describe ingress ingress-alb


# (외부) 접속 테스트

curl -s http://<접속 도메인 주소>

curl -s -k https://<접속 도메인 주소>



7

# 삭제

kubectl delete ingress ingress-alb; kubectl delete svc svc3-admin svc2-guest svc1-web; kubectl delete deploy deploy3-adminsrv deploy2-guestsrv deploy1-websrv







<10> 다음은 인증,인가를 알아보자


https://brunch.co.kr/@topasvga/1877




감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari