<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 내용 참고
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
(t6-admin@myeks:default) [root@myeks-host ~]# echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/admin
(t6-admin@myeks:default) [root@myeks-host ~]# echo http://$(kubectl get ingress/ingress-alb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')
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
감사합니다.