brunch

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

실습 4탄 = 7/17

by Master Seo

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

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

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

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

<10> 다음편 인증,인가




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


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

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



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

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


520 alb-ip.png


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




감사합니다.

keyword
매거진의 이전글EKS 4탄-6. EKS,CLB, NLB-6/17