Application Gateway를 AKS 인그레스 컨트롤러로 사용하기에 이어지는 내용입니다.
참고
- Multi-cluster / Shared App Gateway - azure.github ( 추천 )
- AGIC Annotations - azure.github (추천)
- 다중 클러스터/공유 Application Gateway - Azure Docs
- Multi Gateways Single Cluster - azure.github
기본적으로 AGIC는 연결된 AppGW의 전체 소유권을 가정합니다. AGIC 버전 0.8.0 이상은 여러 AGIC가 하나의 AppGW를 공유할 수 있습니다.
(현재: 2021-06-15, ingress-azure-1.4.0)
AGIC가 설치되면 AppGW의 구성(receiver, rule, backend pool, 등)은 초기화 됩니다.
AGIC가 새로 설치 될 때마다 AppGW내용이 초기화 된다는 건 이미 배포 되어 있던 Ingress들에 영향이 있다는 뜻입니다.
새로운 AGIC가 설치 되더라도 이미 사용중인 AGIC에 영향을 미치지 않도록 하는
AzureIngressProhibitTargets 이라는 **k8s의 CRD(CustomResourceDefinition)**가 있습니다.
음... 글로 표현 하려니까 또 말이 꼬이는데요...
AGIC가 Multi-cluster와 shared AppGW를 지원한다는 내용은
아래 그림처럼 다수의 AGIC들이 하나의 AppGW를 공유해서 사용할 수 있다는 뜻입니다.
만약
- AGIC #1만 있다가 AGIC #2가 생기면서 AGIC #1에서 설정 했던 규칙들이 초기화 되거나
- AGIC #1, #2 가 있다가 #3가 생기면서 AGIC #1, #2의 내용들이 초기화 되면 안되겠죠
이렇게 새로운 AGIC가 생기더라도 이전에 설정되어 있는 AppGW의 값들을 보존하기 위해 AzureIngressProhibitedTarget 이 필요합니다.
이번 테스트로는 한 개의 AKS 클러스터에서 두 개 AGIC에 각 Prohibited Target을 설정하고 세 개의 샘플 앱이 구동되는지 확인해 보겠습니다.
AzureIngressProhibitedTarget 사용방법에 대해 딱히 설명된 자료가 없어서 어떤 용도로 어떻게 사용이 가능한지 알기 힘들었고, 그 과정에 알게 된 주요 내용입니다.
- AGIC 공유 사용 시 모든 Ingress들에 hostname 설정 필수 입니다.
- prohibit target 으로 보호할 수 있는 단위가 hostname 입니다.
- ingress에 spec.hostname이 있으면 AppGW 수신기는 multi-site로 동작합니다.
###그냥 한번 읽고 지나가면 좋습니다.
pod, service, ingress 같은것들은 k8s의 리소스 입니다.
k8s에서는 사용자가 필요로 하는 리소스를 자유롭게 생성할 수 있는 CustomResourceDefinition(CRD)을 제공합니다.
Azure 에서 AppGW와 AKS Cluster간 통신 및 설정할 수 있는 AGIC 관련 CRD들을 제작한 것이고
그 중 하나가 AzureIngressProhibitedTarget 입니다.
현재 상태 확인
Application Gateway를 AKS 인그레스 컨트롤러로 사용하기문서의 내용으로 실습중이시면 aks-helloworkd app이 배포되어 있는 상태 입니다.
kubectl get all -o wide
이전 테스트 앱 삭제
AGIC를 안정적으로 사용하기 위해서는 도메인 기반의 insgress설정이 필요합니다.
도메인 기반의 새로운 샘플 앱들을 배포하기 위해 이전에 배포되어 있는 샘플앱은 삭제 합니다.
aks-helloworld 앱을 배포 했던 yaml 파일로 해당 앱을 삭제 합니다.
yaml 준비
yaml 배포
kubectl delete -f agic_sample_pod.yaml
배포되어 있는 pod 확인
kubectl get all
포탈에서 AppGW 확인
아무것도 실행되지 않은 상태 입니다.
도메인 준비
AGIC 공유 기능을 안전하게 사용하기 위해서는 도메인 기반으로의 설정이 필요합니다.
테스트에 사용하기 위해 Application Gateway의 공용 IP 주소로 도메인 등록을 합니다.
도메인이 없는경우 hosts파일 수정
Windows 10 경로 : C:\Windows\System32\drivers\etc\hosts <- (관리자 권한으로 open)
도메인이 있는경우
첫 번째 샘플 앱 배포
yaml 준비
테스트 도메인(demo1.domain.com)을 spec.rules.host 필드에 입력했습니다.
yaml 배포
kubectl apply -f agic_shared_demo1.yaml
pod 확인
kubectl get all -o wide
AppGW 확인
브라우저에서 확인
테스트 도메인으로 demo1 앱에 접속이 잘 되고 있습니다.
AGIC shared 옵션 변경
AGIC의 shared 옵션 값 확인
AGIC 설치 할 때 사용된 helm-config.yaml파일의 shared 옵션 값이 false였구요
helm으로 shared 옵션 확인 해봐도 false 값입니다.
helm get values ingress-azure
AGIC 설치 시 사용했던 helm-config.yaml파일에서 shared 값을 true로 변경해 주고
default 네임스페이스만 감시 하도록 변경합니다.
사용된 helm-config.yaml
AzureIngressProhibitedTarget CRD 배포
변경된 옵션을 적용하기 전에 Prohibit target CRD를 먼저 설치 합니다.
azureingressprohibitedtargets 라는 k8s 커스텀 리소스가 배포되어 있는지 확인
kubectl get CustomResourceDefinition
저는 이미 설치가 되어 있었는데요. AKS 클러스터 생성 시 기본으로 설치가 되는 것 같습니다.
만약 CRD가 배포되어 있지 않으면 아래 커맨드로 배포 합니다.
kubectl apply -f <https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/ae695ef9bd05c8b708cedf6ff545595d0b7022dc/crds/AzureIngressProhibitedTarget.yaml>
어떻게 생겼는지 한번 구경해 봤습니다.
kubectl get crd
kubectl describe crd azureingressprohibitedtargets.appgw.ingress.k8s.io
AzureIngressProhibitedTarget이 생겼나 한번 확인해 봤습니다만
kubectl get AzureIngressProhibitedTarget
아직 생기지 않았습니다.
수정한 shared 옵션 적용
변경된 helm-config.yaml로 AGIC설정을 변경해 줍니다.
helm upgrade ingress-azure ^
--recreate-pods ^
-f helm-config.yaml ^
application-gateway-kubernetes-ingress/ingress-azure
Multi-cluster / Shared App Gateway 가 활성화 되었다 Prohibit Target 설정을 보고 수정해라 라네요. 어떤 설정인지 확인해 보겠습니다.
먼저 어떤 ProhibitTarget이 생겼나 확인 합니다.
kubectl get AzureIngressProhibitedTargets
prohibit-all-targets 이라는 AzureIngressProhibitedTarget이 생성 되었네요
prohibit-all-target은 어떤 제한을 갖고 있나 확인해 봅니다.
kubectl describe AzureIngressProhibitedTarget prohibit-all-targets
모든 것 (/*) 에 대해 업데이트 금지 설정을 갖고 있습니다.
이것은 AGIC 업데이트가 진행 되더라도 AppGW에는 어떤것도 반영하지 않겠다는 의미이고,
새로운 샘플 앱들을 정상적으로 구동 시키기 위해 두 번째 샘플앱 설치 할때 prohibit target 설정을 새로 해줄겁니다.
자 이제 helm에 shared 설정도 잘 적용이 되었는지 확인해 봅시다.
shared 옵션 수정 요청은 제가 제대로 했구요
helm get values ingress-azure
실제로 적용된 값도 확인해 봅니다.
helm get manifest ingress-azure
역시 잘 적용 되었구요, 아래쪽 내용을 살펴보니 AzureIngressProhibitedTarget도 확인할 수 있습니다.
demo 앱이 잘 살아 있는지 확인해 봅니다.
아직 잘 살아 있습니다.
두 번째 샘플 앱 배포
자 다시한번 기억을 더듬어서, 그림 한번 보시고
최종적으로는
- AppGW 하나로
- 두 개의 AGIC에서
- 세 개의 앱을 배포 할 거구요
이번에는 두 번째 앱(demo2)을 AGIC #1 에 배포할 겁니다.
그 전에 아주 아주 아주 중요한 백번을 강조해도 아깝지 않은 Prohibit 1 을 변경해주어야 합니다.
지금은 Prohibit 1 자리에 prohibit-all-targets 이 존재 합니다.
prohibit-all-targets이 있으면 AGIC #1에 새로운 Ingress들이 생기더라도 AppGW에 반영되지 않습니다. 절!대!로!
세 개 앱이 최종적인 설계 상으로 배포될 수 있도록 Prohibit 1 자리에
- 새로운 Prohibit target을 생성하고
- prohibit-all-targets은 삭제 해야 합니다.
새로운 prohibit target .yaml파일 준비
새로운 prohibit target을 만들고,
AppGW를 갱신할 때 demo3.domain.com는 건드리지 마라 라는 내용을 작성합니다.
apiVersion: appgw.ingress.k8s.io/v1
kind: AzureIngressProhibitedTarget
metadata:
name: prohibit-default-to-demo3
spec:
hostname: demo3.domain.com
새로운 prohibit target 배포
kubectl apply -f pt_default_demo3.yaml
배포 확인
kubectl get AzureIngressProhibitedTarget
prohibit-all-targets 제거 해야 새로운 앱들이 AppGW에 등록이 되는데요
prohibit-all-targets을 제거하면 AppGW가 초기화 되는 현상이 있습니다. 버그인 것으로 추측되지만 아주 고약한 상황을 만들고 있습니다.
허나 조금씩 변수를 주면서 반복적으로 테스트 하다보면 prohibit-all-targets이 삭제되어도 AppGW의 내용이 초기화 되지 않는 경우도 있지만 확실치는 않습니다.
prohibit-all-targets 삭제
kubectl delete azureingressprohibitedtarget prohibit-all-targets
배포된 prohibit target 확인
kubectl get AzureIngressProhibitedTarget
prohibit-all-target 제거 하니까 AppGW에 demo1의 설정이 사라졌네??
pod는 남아 있는데
kubectl get all -o wide
demo1 배포 했던 yaml파일로 pod 삭제 후 다시 배포
kubectl delete -f agic_shared_demo1.yaml
kubectl apply -f agic_shared_demo1.yaml
AppGW 설정도 다시 살아 났고 웹도 정상 접근 되고 있습니다.
가이드 문서에는 새로운 prohibit target을 생성하고 지워야 한다고 했었는데
나중에 prohibit-all-target 을 제거하지 않고 한번 더 테스트를 진행 해봐야 하겠네요
두 번째 앱을 배포할 준비는 모두 되었고 이제 배포해 봅니다.
yaml 준비
yaml 배포
kubectl apply -f agic_shared_demo2.yaml
AppGW 확인
웹 브라우저 확인
두 개 앱이 정상 실행 중입니다.
두 번째 AGIC 생성
자 여기까지는 워밍업이죠
이제 새로운 namespace에서 AGIC만들고, demo3 이라고 출력되는 App을 실행시켜 볼 건데요.
그전에 다시 그림한번 보고 갑시다.
지금까지 생성된 앱들은 모두 default namespace에서 진행 되었고, 앞으로 추가할 앱은 shared 라는 namespace에 배포합니다.
AGIC에 별칭을 설정하고 ingress 들의 annotation에 AGIC의 별칭을 입력하면 동일 namespace에서도 여러개의 AGIC 사용이 가능한 미리 보기 기능이 있습니다만.
아직 미리보기 기능 인데다가 딱히 필요할 것 같지도 않아서 namespace별로 AGIC를 분리해서 테스트 진행 되었습니다.
네임스페이스 생성
kubectl create ns shared
kubectl get ns
AGIC 생성
ingress-azure-shared 라는 AGIC를 shared 라는 네임스페이스에 생성합니다.
위에서 AGIC 업그레이드에 사용했던 shared 옵션이 켜 있는 helm-config.yaml에서
watchNamespace만 shared로 수정한 파일입니다.
반드시 AppGW의 정보와 SP 정보등을 갱신 해야 합니다.
배포
helm install ingress-azure-shared ^
-n shared ^
-f helm-config-shared.yaml ^
application-gateway-kubernetes-ingress/ingress-azure
자~~알 생성 되었구요
배포된 내용 확인
kubectl get all -n shared
shared namespace의 prohibit target도 확인해 봅니다.
kubectl get azureingressprohibitedtarget -n shared
여전히 모든 AppGW 설정을 금지하는 prohibit-all-targets이 생겼구요, 이 녀석도 새로운 prohibit target으로 교체 해주어야 합니다.
kubectl describe azureingressprohibitedtarget prohibit-all-targets -n shared
그 전에 demo1, demo2가 아직 잘 동작하고 있는지 확인해 봅니다.
아직 잘 동작하고 있군요
Prohibit Target 설정
두 번째 AGIC에 데모앱을 배포하기 전에 반드시 해야 할 것이 있죠~, prohibit target 설정을 해줘야 하죠
AGIC #2에는 prohibit target 두 개를 만들어 줄 겁니다.
- demo1.domain.com은 건드리지 마라
- demo2.domain.com은 건드리지 마라
prohibit target .yaml 파일 준비
.yaml 배포
kubectl apply -f pt_shared_demo1.yaml
kubectl apply -f pt_shared_demo2.yaml
배포 확인
kubectl get azureingressprohibitedtarget -n shared
prohibit-all-targets 제거
kubectl delete azureingressprohibitedtarget prohibit-all-targets -n shared
prohibit-all-targets 제거 하니까 AppGW에 이전 앱들(demo1, demo2)의 설정이 또 사라졌네요
- prohibit-all-targets이 있으면 ingress 배포해도 AppGW에 반영이 안되는데...
- 서비스 운영중에 새로운 AGIC가 필요하게 되면 무조건 서비스 중단이 필요하다는 건데...
- 하~ AGIC shared 기능 알면 알수록 못쓰는 기능 같은데...
demo1, demo2 pod 삭제 후 다시 배포
kubectl delete -f agic_shared_demo1.yaml
kubectl delete -f agic_shared_demo2.yaml
kubectl apply -f agic_shared_demo1.yaml
kubectl apply -f agic_shared_demo2.yaml
뭐지!!!! 몇 번의 반복 테스트 중인데
prohibit-all-targets 삭제 해도 AppGW 초기화 되지 않는 경우가 있네요
- pt_shared_demo1.yaml
- pt_shared_demo2.yaml
두 개 prohibit target 추가 후 prohibit-all-target이 있어도 괜찮은건가? 하는 물음을 해결하고자
- prohibit-all-target 삭제하지 않고
- agic_shared_demo3.yaml을 배포 했는데
- 역시나 pod는 배포 되지만 AppGW에 demo3이 셋팅이 안됨
- 역시 안되는구나 라는 결과를 얻고
- agic_shared_demo3.yaml을 삭제
- prohibit-all-target도 삭제
- 원래 대로라면 prohibit-all-target이 삭제되면서 AppGW 설정이 싹 날라가고
- demo1, demo2 을 새로 배포해야 했었는데
- 이게 왠일이야 그대로 남아 있어!!! 뭐야!!! 도대체 왜그러는거야.... ㅠ
당연히 브라우저에서도 잘 보이고!!!!!
게다가
- agic_shared_demo3.yaml 배포하면 완벽히 동작까지....
- AGIC Share 기능 자체가 아직 알파 버전인가?
두 개의 demo는 잘 실행 중이고
demo3 App 배포
이전에 배포 했던 앱과 동일하지만
- shared 라는 네임스페이스 지정
- 외부 포트는 9090
- AKS Ingress Demo Shared 라고 출력
되도록 수정된 앱을 배포 합니다.
yaml 준비
yaml 배포
kubectl apply -f agic_shared_demo3.yaml
배포된 내용 확인
kubectl get all -n shared
AppGW 확인
브라우저에서 앱 확인
드디어 AGIC공유 기능을 사용해서 3개의 어플리케이션이 동작하고 있습니다.
정말 징그럽게 제대로 정리된 문서가 없어서 많이 고생했습니다.
AGIC 설정 리서치 하면서 느낀점은
기획 없이 새로운 기능 만들면서 기존 기능들의 리펙토링 하지도 않고 그냥 그때그때 필요한거 우겨넣으면서 만들고 있는 느낌을 지울수가 없네요
prohibit target 과 같은 블랙 리스트성 제한기능이 아니라 화이트 리스트 격의 제한기능을 두는게 맞는거 같은데...
Multi-cluster 간 AppGW 공유도 테스트 해보면 좋았을건데
AGIC 정내미가 떨어져서 이제는 쳐다보기도 싫습니다 ...ㅜㅜ
만약 저에게 AGIC를 어떻게 사용하는게 좋겠냐고 묻는다면
- 왠만하면 nginx ingress 사용하시고
- 만약 속도가 엄청 중요한 프로젝트라면 AppGW 당 하나의 AGIC를 사용하시라고
권장하고 싶습니다.
아직은 쓸만한 기능이 아닌 듯 싶어요!
아래는 엄청난 삽질 중 기억해야 할만한 것만 기록해둔 내용입니다.
정말 오랜 삽질 끝에 AGIC 설정이 되어 간략하게 요점만 정리 해 두고 다시 반복학습 하면서 자세하게 정리 하겠습니다.
DNS 서버에 테스트용 레코드 3개를 등록해 줬습니다.
레코드에 등록된 IP는 AppGW의 IP 이구요
3개 웹 정상 구동 됩니다.
수신기에 MultiSite 설정 안되어 보이는 현상은 버그 입니다.
동일한 포트로 서비스 하기위해 MultiSite로 설정 되어야 하는데 AppGW의 수신기를 확인해보면
hostname지정되지 않고 동일한 포트(80)를 사용한다고 에러가 출력되지만 이것은 버그 입니다.
- 버그 관련 내용 Ingress.yaml이 multiSite 수신기를 생성하지 않습니다. - github.com/azure
- 호스트명 필드가 하나 였다가 hostname, hostnames 두 가지 방식으로 늘어 나면서 제대로 반영하지 못하는 버그 라는 글귀가 있었습니다.
실제로 cli로 appgw를 보면 hostnames에 호스트명은 설정되어 있고, 웹 사이트들도 잘 동작합니다.
가장많이 쌩고생 했던 AzureIngressProhibitedTarget yaml설정.... ㅜㅜ
테스트용 앱 yaml
AGIC config.yaml
'IT > Kubernetes' 카테고리의 다른 글
liveness probe, readiness probe 기능의 차이는? (0) | 2023.04.12 |
---|---|
상태 프로브(startup, liveness, readiness)란 무엇인가? (0) | 2023.04.12 |
하나의 AGIC에 여러 Ingress 사용이 가능한가? (multi-namespace) (0) | 2023.04.11 |
하나의 AGIC에 여러 Ingress 사용이 가능한가? (다른 포트 배포) (0) | 2023.04.11 |
Application Gateway를 AKS 인그레스 컨트롤러로 사용하기 (0) | 2023.04.11 |