Application Gateway 수신 컨트롤러에 대한 주석
임의의 키/값 쌍으로 Kubernetes Ingress 리소스에 주석을 추가할 수 있습니다. AGIC(Application Gateway 수신 컨트롤러)는 주석을 사용하여 수신 YAML을 통해 구성할 수 없는 Azure Application Gateway 기능을 프로그래밍합니다. 수신 주석은 수신 리소스에서 파생된 모든 HTTP 설정, 백 엔드 풀 및 수신기에 적용됩니다.
팁
컨테이너용 Application Gateway란?도 참조하세요.
지원되는 주석 목록
AGIC가 Ingress 리소스를 관찰하려면 리소스에 kubernetes.io/ingress.class: azure/application-gateway
주석을 추가해야 합니다.
백 엔드 경로 접두사
다음 주석은 Ingress 리소스에 지정된 백 엔드 경로를 지정된 접두사로 다시 쓸 수 있도록 합니다. 이를 사용하면 Ingress 리소스에서 서비스를 노출하는 데 사용하는 엔드포인트 이름과 다른 엔드포인트를 가진 서비스를 노출할 수 있습니다.
사용
appgw.ingress.kubernetes.io/backend-path-prefix: <path prefix>
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-bkprefix
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/backend-path-prefix: "/test/"
spec:
rules:
- http:
paths:
- path: /hello/
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 80
이전 예에서는 appgw.ingress.kubernetes.io/backend-path-prefix: "/test/"
라는 주석이 있는 go-server-ingress-bkprefix
라는 이름의 Ingress 리소스를 정의합니다. 주석은 /hello
에서 /test/
까지의 경로에 대해 경로 접두사를 재정의하는 HTTP 설정을 만들도록 Application Gateway에 지시합니다.
이 예에서는 규칙을 하나만 정의합니다. 그러나 주석은 전체 Ingress 리소스에 적용됩니다. 따라서 여러 규칙을 정의하는 경우 지정된 각 경로에 대한 백 엔드 경로 접두사를 설정합니다. 다른 경로 접두사를 사용하여 다른 규칙을 원하는 경우(동일한 서비스에 대해서도) 다른 Ingress 리소스를 정의해야 합니다.
백 엔드 호스트 이름
다음 주석을 사용하여 Application Gateway가 Pod와 통신하는 동안 사용해야 하는 호스트 이름을 지정합니다.
사용
appgw.ingress.kubernetes.io/backend-hostname: "internal.example.com"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-timeout
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/backend-hostname: "internal.example.com"
spec:
rules:
- http:
paths:
- path: /hello/
backend:
service:
name: store-service
port:
number: 80
pathType: Exact
사용자 지정 상태 프로브
백 엔드 주소 풀에 사용자 지정 상태 프로브를 보내도록 Application Gateway를 구성할 수 있습니다. 다음 주석이 있는 경우 Kubernetes 수신 컨트롤러는 백 엔드 애플리케이션을 모니터링하기 위한 사용자 지정 프로브를 만듭니다. 그런 다음 컨트롤러는 변경 내용을 Application Gateway에 적용합니다.
health-probe-hostname
: 이 주석은 상태 프로브에서 사용자 지정 호스트 이름을 허용합니다.health-probe-port
: 이 주석은 상태 프로브에 대한 사용자 지정 포트를 구성합니다.health-probe-path
: 이 주석은 상태 프로브의 경로를 정의합니다.health-probe-status-code
: 이 주석을 사용하면 상태 프로브가 다른 HTTP 상태 코드를 수락할 수 있습니다.health-probe-interval
: 이 주석은 상태 프로브가 실행되는 간격을 정의합니다.health-probe-timeout
: 이 주석은 프로브가 실패하기 전에 상태 프로브가 응답을 기다리는 시간을 정의합니다.health-probe-unhealthy-threshold
: 이 주석은 백 엔드가 비정상으로 표시될 수 있도록 실패해야 하는 상태 프로브 수를 정의합니다.
사용
appgw.ingress.kubernetes.io/health-probe-hostname: "contoso.com"
appgw.ingress.kubernetes.io/health-probe-port: 80
appgw.ingress.kubernetes.io/health-probe-path: "/"
appgw.ingress.kubernetes.io/health-probe-status-code: "100-599"
appgw.ingress.kubernetes.io/health-probe-interval: 30
appgw.ingress.kubernetes.io/health-probe-timeout: 30
appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold: 2
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/health-probe-hostname: "contoso.com"
appgw.ingress.kubernetes.io/health-probe-port: 81
appgw.ingress.kubernetes.io/health-probe-path: "/probepath"
appgw.ingress.kubernetes.io/health-probe-status-code: "100-599"
appgw.ingress.kubernetes.io/health-probe-interval: 31
appgw.ingress.kubernetes.io/health-probe-timeout: 31
appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold: 2
spec:
rules:
- http:
paths:
- path: /
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 80
TLS 리디렉션
HTTP URL을 HTTPS 대응 항목으로 자동 리디렉션하도록 Application Gateway를 구성할 수 있습니다. 이 주석이 있고 TLS가 올바르게 구성된 경우 Kubernetes 수신 컨트롤러는 리디렉션 구성을 포함하는 라우팅 규칙을 만듭니다. 그런 다음 컨트롤러는 변경 내용을 Application Gateway 인스턴스에 적용합니다. 만들어진 리디렉션은 HTTP 301 Moved Permanently
입니다.
사용
appgw.ingress.kubernetes.io/ssl-redirect: "true"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-redirect
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- www.contoso.com
secretName: testsecret-tls
rules:
- host: www.contoso.com
http:
paths:
- backend:
service:
name: websocket-repeater
port:
number: 80
연결 드레이닝
연결 드레이닝을 사용하려면 다음 주석을 사용합니다.
connection-draining
: 이 주석은 연결 드레이닝을 사용하도록 설정할지 여부를 지정합니다.connection-draining-timeout
: 이 주석은 Application Gateway가 드레이닝 백 엔드 엔드포인트에 대한 요청을 종료하는 시간 제한을 지정합니다.
사용
appgw.ingress.kubernetes.io/connection-draining: "true"
appgw.ingress.kubernetes.io/connection-draining-timeout: "60"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-drain
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/connection-draining: "true"
appgw.ingress.kubernetes.io/connection-draining-timeout: "60"
spec:
rules:
- http:
paths:
- path: /hello/
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 80
쿠키 기반 선호도
쿠키 기반 선호도를 사용하도록 설정하려면 다음 주석을 사용합니다.
사용
appgw.ingress.kubernetes.io/cookie-based-affinity: "true"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-affinity
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/cookie-based-affinity: "true"
spec:
rules:
- http:
paths:
- path: /hello/
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 80
Request Timeout
다음 주석을 사용하여 요청 시간 초과를 초 단위로 지정합니다. 시간 제한 후 응답을 받지 못하면 Application Gateway는 요청을 실패하게 합니다.
사용
appgw.ingress.kubernetes.io/request-timeout: "20"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-timeout
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/request-timeout: "20"
spec:
rules:
- http:
paths:
- path: /hello/
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 80
개인 IP 사용
다음 주석을 사용하여 Application Gateway의 개인 IP 주소에 이 엔드포인트를 노출할지 여부를 지정합니다.
개인 IP가 없는 Application Gateway 인스턴스의 경우 appgw.ingress.kubernetes.io/use-private-ip: "true"
가 포함된 수신은 무시됩니다. 해당 수신에 대한 컨트롤러 로그와 수신 이벤트는 NoPrivateIP
경고를 표시합니다.
사용
appgw.ingress.kubernetes.io/use-private-ip: "true"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-privateip
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/use-private-ip: "true"
spec:
rules:
- http:
paths:
- path: /
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 80
프런트 엔드 포트 재정의
다음 주석을 사용하여 HTTP의 경우 80번, HTTPS의 경우 443번이 아닌 다른 포트를 사용하도록 프런트 엔드 수신기를 구성합니다.
포트가 Application Gateway 권한 부여 범위(1~64999) 내에 있으면 해당 특정 포트에 수신기가 만들어집니다. 주석에 잘못된 포트를 설정하거나 포트를 설정하지 않으면 구성에서는 기본값인 80 또는 443이 사용됩니다.
사용
appgw.ingress.kubernetes.io/override-frontend-port: "port"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-overridefrontendport
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/override-frontend-port: "8080"
spec:
rules:
- http:
paths:
- path: /hello/
backend:
service:
name: store-service
port:
number: 80
pathType: Exact
참고 항목
외부 요청은 http://somehost
대신 http://somehost:8080
을 대상으로 지정해야 합니다.
백 엔드 프로토콜
다음을 사용하여 Application Gateway가 Pod와 통신할 때 사용해야 하는 프로토콜을 지정합니다. 지원되는 프로토콜은 HTTP와 HTTPS입니다.
Application Gateway에서는 자체 서명된 인증서가 지원되지만, AGIC는 현재 Pod가 잘 알려진 인증 기관에서 서명한 인증서를 사용하는 경우에만 HTTPS를 지원합니다.
Pod에서 HTTPS에는 포트 80을 사용하면 안 되며 HTTP에는 포트 443을 사용하면 안 됩니다.
사용
appgw.ingress.kubernetes.io/backend-protocol: "https"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-timeout
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/backend-protocol: "https"
spec:
rules:
- http:
paths:
- path: /
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 443
호스트 이름 확장
여러 호스트 이름을 허용하도록 Application Gateway를 구성할 수 있습니다. 와일드카드 호스트 이름을 포함하여 여러 호스트 이름을 정의하려면 hostname-extension
주석을 사용합니다. 이 작업을 수행하면 프런트 엔드 수신기의 수신 spec.rules.host
정보에 정의된 FQDN에 호스트 이름이 추가되므로 다중 사이트 수신기로 구성됩니다.
사용
appgw.ingress.kubernetes.io/hostname-extension: "hostname1, hostname2"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-multisite
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/hostname-extension: "hostname1, hostname2"
spec:
rules:
- host: contoso.com
http:
paths:
- path: /
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 443
이전 예에서는 수신기가 호스트 이름 hostname1.contoso.com
및 hostname2.contoso.com
에 대한 트래픽을 허용하도록 구성합니다.
경로에 대한 WAF 정책
다음 주석을 사용하여 주석이 추가되는 Kubernetes Ingress 리소스 내의 호스트에 대한 경로 목록에 기존 WAF(웹 애플리케이션 방화벽) 정책을 연결합니다. WAF 정책은 /ad-server
및 /auth
URL 모두에 적용됩니다.
사용
appgw.ingress.kubernetes.io/waf-policy-for-path: "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/SampleRG/providers/Microsoft.Network/applicationGatewayWebApplicationFirewallPolicies/AGICWAFPolcy"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ad-server-ingress
namespace: commerce
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/waf-policy-for-path: "/subscriptions/abcd/resourceGroups/rg/providers/Microsoft.Network/applicationGatewayWebApplicationFirewallPolicies/adserver"
spec:
rules:
- http:
paths:
- path: /ad-server
backend:
service:
name: ad-server
port:
number: 80
pathType: Exact
- path: /auth
backend:
service:
name: auth-server
port:
number: 80
pathType: Exact
Application Gateway SSL 인증서
로컬 PFX 인증서 파일이나 Azure Key Vault 버전이 지정되지 않은 비밀 ID에 대한 참조를 통해 Application Gateway에 대한 SSL 인증서를 구성할 수 있습니다. 주석에 인증서 이름이 있고 인증서가 Application Gateway에 사전 설치된 경우, Kubernetes 수신 컨트롤러는 HTTPS 수신기가 있는 라우팅 규칙을 만들고 Application Gateway 인스턴스에 변경 내용을 적용합니다. SSL 리디렉션의 경우 ssl-redirect
주석과 함께 appgw-ssl-certificate
주석을 사용할 수도 있습니다.
참고 항목
TLS 사양이 동시에 수신에 정의되어 있는 경우 appgw-ssl-certificate
주석은 무시됩니다. 다른 호스트에 다른 인증서가 필요한 경우(여러 TLS 인증서 종료) 다른 Ingress 리소스를 정의해야 합니다.
사용
appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-certificate
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
spec:
rules:
- host: www.contoso.com
http:
paths:
- backend:
service:
name: websocket-repeater
port:
number: 80
Application Gateway SSL 프로필
수신기별로 Application Gateway 인스턴스에서 SSL 프로필을 구성할 수 있습니다. 주석에 프로필 이름이 있고 해당 프로필이 Application Gateway에 사전 설치된 경우, Kubernetes 수신 컨트롤러는 HTTPS 수신기가 있는 라우팅 규칙을 만들고 Application Gateway 인스턴스에 변경 내용을 적용합니다.
사용
appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
appgw.ingress.kubernetes.io/appgw-ssl-profile: "SampleSSLProfile"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-certificate
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/appgw-ssl-certificate: "name-of-appgw-installed-certificate"
appgw.ingress.kubernetes.io/appgw-ssl-profile: "SampleSSLProfile"
spec:
rules:
- host: www.contoso.com
http:
paths:
- backend:
service:
name: websocket-repeater
port:
number: 80
Application Gateway 신뢰할 수 있는 루트 인증서
이제 AGIC를 통해 신뢰할 수 있는 Application Gateway에 대한 자체 루트 인증서를 구성할 수 있습니다. appgw-trusted-root-certificate
주석을 backend-protocol
주석과 함께 사용하여 엔드투엔드 SSL 암호화를 나타낼 수 있습니다. 여러 개의 루트 인증서를 지정하는 경우 쉼표로 구분합니다(예: name-of-my-root-cert1,name-of-my-root-cert2
).
사용
appgw.ingress.kubernetes.io/backend-protocol: "https"
appgw.ingress.kubernetes.io/appgw-trusted-root-certificate: "name-of-my-root-cert1"
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-certificate
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/backend-protocol: "https"
appgw.ingress.kubernetes.io/appgw-trusted-root-certificate: "name-of-my-root-cert1"
spec:
rules:
- host: www.contoso.com
http:
paths:
- backend:
service:
name: websocket-repeater
port:
number: 80
다시 쓰기 규칙 집합
다음 주석을 사용하여 기존의 다시 쓰기 규칙 집합을 해당 요청 라우팅 규칙에 할당합니다.
사용
appgw.ingress.kubernetes.io/rewrite-rule-set: <rewrite rule set name>
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-bkprefix
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/rewrite-rule-set: add-custom-response-header
spec:
rules:
- http:
paths:
- path: /
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 8080
규칙 집합 사용자 지정 리소스 다시 쓰기
참고 항목
컨테이너용 Application Gateway 릴리스로 다양한 성능, 복원력 및 기능 변경 내용이 도입되었습니다. 다음 배포에서는 컨테이너용 Application Gateway를 사용하는 것이 좋습니다.
게이트웨이 API에 대한 이 문서와 수신 API에 대한 이 문서에서 컨테이너용 Application Gateway에 대한 URL 다시 쓰기 규칙을 찾을 수 있습니다. 게이트웨이 API에 대한 이 문서에서 컨테이너용 Application Gateway에 대한 헤더 다시 쓰기 규칙을 찾을 수 있습니다.
Application Gateway를 사용하면 선택한 요청 및 응답 내용을 다시 쓸 수 있습니다. 이 기능을 사용하면 URL을 변환하고, 쿼리 문자열 매개 변수를 변경하고, 요청 및 응답 헤더를 수정할 수 있습니다. 이 기능을 사용하면 특정 조건이 충족될 때만 URL이나 지정된 헤더가 다시 작성되도록 조건을 추가할 수도 있습니다. 다시 쓰기 규칙 집합 사용자 지정 리소스는 AGIC에 이 기능을 제공합니다.
HTTP 헤더를 통해 클라이언트와 서버는 요청 또는 응답과 함께 추가 정보를 전달할 수 있습니다. 이러한 헤더를 다시 작성하면 보안 관련 헤더 필드(예: HSTS
또는 X-XSS-Protection
) 추가, 중요한 정보를 노출할 수 있는 응답 헤더 필드 제거, X-Forwarded-For
헤더에서 포트 정보 제거와 같은 중요한 작업을 수행할 수 있습니다.
URL 다시 쓰기 기능을 사용하면 다음을 수행할 수 있습니다.
- 요청 URL의 호스트 이름, 경로, 쿼리 문자열을 다시 씁니다.
- 모든 요청의 URL을 다시 쓸지, 아니면 설정한 조건 중 하나 이상과 일치하는 요청만 다시 쓸지 선택합니다. 이러한 조건은 요청 및 응답 속성(요청 헤더, 응답 헤더, 서버 변수)을 기반으로 합니다.
- - 기존 URL 또는 다시 작성된 URL을 기반으로 요청을 라우팅하도록 선택합니다.
참고 항목
이 기능은 1.6.0-rc1 이후 지원됩니다. Application Gateway에서 기존 다시 쓰기 규칙 집합을 사용할 수 있는 appgw.ingress.kubernetes.io/rewrite-rule-set
을/를 사용합니다.
사용
appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource
예시
apiVersion: appgw.ingress.azure.io/v1beta1
kind: AzureApplicationGatewayRewrite
metadata:
name: my-rewrite-rule-set-custom-resource
spec:
rewriteRules:
- name: rule1
ruleSequence: 21
conditions:
- ignoreCase: false
negate: false
variable: http_req_Host
pattern: example.com
actions:
requestHeaderConfigurations:
- actionType: set
headerName: incoming-test-header
headerValue: incoming-test-value
responseHeaderConfigurations:
- actionType: set
headerName: outgoing-test-header
headerValue: outgoing-test-value
urlConfiguration:
modifiedPath: "/api/"
modifiedQueryString: "query=test-value"
reroute: false
규칙 우선 순위
다음 주석은 Application Gateway 수신 컨트롤러가 연관된 요청 라우팅 규칙의 우선 순위를 명시적으로 설정할 수 있도록 합니다.
사용
appgw.ingress.kubernetes.io/rule-priority:
예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-server-ingress-rulepriority
namespace: test-ag
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/rule-priority: 10
spec:
rules:
- http:
paths:
- path: /
pathType: Exact
backend:
service:
name: go-server-service
port:
number: 8080
앞의 예에서는 요청 라우팅 규칙에 대해 우선 순위를 10으로 설정합니다.