Kubernetes 환경에서 인그레스 게이트웨이 추가
Kubernetes 환경에서 인그레스 게이트웨이 추가 (Ingress Gateway K8s)
Kubernetes 환경에서 Consul 서비스 메시에 인그레스 게이트웨이를 추가하는 방법을 설명하는 문서예요. 게이트웨이 활성화, 리스너와 대상 구성, 서비스 인텐션 정의, 애플리케이션 배포까지 다뤄요.
출처: 문서
본문
이 주제는 Kubernetes 환경에서 Consul 서비스 메시에 인그레스 게이트웨이를 추가하는 방법을 설명해요. 가상 머신(VM) 환경에서 인그레스 게이트웨이를 구현하는 방법은 Kubernetes에서 인그레스 게이트웨이 생성 및 관리를 참고하세요.
참고
인그레스 게이트웨이는 더 이상 사용되지 않으며(Deprecated) 더 이상 업데이트되지 않을 거예요. 인그레스 게이트웨이는 이 버전에서 완전히 지원되지만, 향후 Consul 릴리스에서 제거될 거예요. 대신 Consul API 게이트웨이를 사용하세요.
개요 (Overview)
인그레스 게이트웨이는 서비스 메시 외부의 서비스가 메시 내부의 서비스로 트래픽을 보낼 수 있게 해줘요. 인그레스 게이트웨이에 대한 추가 정보는 인그레스 게이트웨이 개요를 참고하세요.
인그레스 게이트웨이를 추가하려면 다음 단계를 완료해요:
- Helm 차트 구성에서 인그레스 게이트웨이를 활성화한다.
- 인그레스 게이트웨이 리스너와 대상을 구성한다.
- ACL이 활성화된 경우 서비스 인텐션을 정의한다.
- 애플리케이션을 Kubernetes에 배포한다.
- 애플리케이션에 연결한다.
Helm 차트에서 인그레스 게이트웨이 활성화 (Enable ingress gateways in the Helm chart)
- 커스텀 YAML 값 파일을 만들고
ingressGateways객체를 구성해요. 환경에 대해 하나 이상의 게이트웨이를ingressGateways.gateways필드에 지정할 수 있어요. 각 항목의 유일한 필수 필드는ingressGateways.gateways.name이에요. 지원되는 필드에 대한 자세한 내용은 Helm 차트 참조를 참고하세요. 다음 예시 구성은 클러스터에 공개적이고 인증되지 않은 LoadBalancer로 인그레스를 만듭니다.
values.yaml
global:
name: consul
connectInject:
enabled: true
ingressGateways:
enabled: true
gateways:
- name: ingress-gateway
service:
type: LoadBalancer
- Helm 차트를 배포하고 환경 구성을 포함하는 커스텀 YAML 파일을 전달해요. 최신 Consul Helm 차트가 설치되어 있는지 확인할 것을 권장해요. 추가 정보는 Consul on Kubernetes 설치 개요를 참고하세요. 다음 예시는
values.yaml구성 파일을 사용해 Consul 1.17.0을 설치해요:
$ helm install consul -f values.yaml hashicorp/consul --version 1.17.0 --wait --debug
게이트웨이 리스너와 대상 구성 (Configure gateway listeners and destinations)
인그레스 게이트웨이 커스텀 리소스를 만들고 구성에서 리스너와 대상 서비스를 지정해요. name 필드는 Helm 차트에서 게이트웨이를 만들 때 지정한 이름과 일치해야 해요. 자세한 내용은 인그레스 게이트웨이 구성 참조를 참고하세요.
다음 예시는 포트 8080에서 HTTP 트래픽을 수신하고 static-server로 트래픽을 라우팅하는 인그레스 게이트웨이를 만듭니다:
ingress-gateway.yaml
apiVersion: consul.hashicorp.com/v1alpha1
kind: IngressGateway
metadata:
name: ingress-gateway
spec:
listeners:
- port: 8080
protocol: http
services:
- name: static-server
kubectl apply로 IngressGateway 리소스를 적용해요:
$ kubectl apply --filename ingress-gateway.yaml
ingressgateway.consul.hashicorp.com/ingress-gateway created
기본 프로토콜 구성 (Configure the default protocol)
게이트웨이 리스너에 매핑된 대상 서비스는 인그레스 게이트웨이 커스텀 리소스에 지정된 프로토콜과 동일한 프로토콜을 사용해야 해요. service defaults 커스텀 리소스 구성을 만들고 적용해 메시에서 서비스의 모든 인스턴스에 대한 기본 프로토콜을 설정할 수 있어요. 추가 정보는 service defaults 구성 참조를 참고하세요.
다음 예시는 static-server 서비스가 메시의 다른 서비스와 HTTP로 통신하도록 지시합니다:
service-defaults.yaml
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceDefaults
metadata:
name: static-server
spec:
protocol: http
service defaults 리소스를 적용하려면 kubectl apply 명령을 실행해요:
$ kubectl apply --filename service-defaults.yaml
servicedefaults.consul.hashicorp.com/static-server created
커스텀 리소스 확인 (Verify the custom resources)
kubectl get 명령을 실행해 커스텀 리소스가 Consul에 성공적으로 동기화되었는지 확인할 수 있어요:
$ kubectl get servicedefaults
NAME SYNCED AGE
static-server True 45s
$ kubectl get ingressgateway
NAME SYNCED AGE
ingress-gateway True 13m
Consul UI에서 게이트웨이 보기 (View the gateway in the Consul UI)
Consul UI에서 인그레스 게이트웨이 서비스 인스턴스를 보면 인그레스 게이트웨이가 예상대로 구성되었는지 확인할 수 있어요.
kubectl port-forward 명령을 실행해요. 지침은 Consul UI 보기를 참고하세요.
포트를 전달한 후 웹 브라우저에서 http://localhost:8500/ui/dc1/services/ingress-gateway/instances를 열어 인그레스 게이트웨이 인스턴스를 볼 수 있어요.
TLS가 활성화된 경우 https://localhost:8501/ui/dc1/services/ingress-gateway/instances를 열어요.
서비스 인텐션 정의 (Define service intentions)
ACL이 활성화된 경우 인그레스 게이트웨이가 대상 서비스로 트래픽을 라우팅할 수 있도록 서비스 인텐션을 정의해야 해요. 추가 정보는 서비스 인텐션 만들기를 참고하세요.
인텐션을 정의하려면 서비스 인텐션 구성을 만들고 클러스터에 적용해요. 자세한 내용은 서비스 인텐션 구성 참조를 참고하세요.
다음 예시에서 Consul은 ingress-gateway 서비스가 static-server 대상 서비스로 트래픽을 보내는 것을 허용합니다:
service-intentions.yaml
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceIntentions
metadata:
name: static-server
spec:
destination:
name: static-server
sources:
- name: ingress-gateway
action: allow
서비스 인텐션 구성을 적용하려면 kubectl apply 명령을 실행해요:
$ kubectl apply --filename service-intentions.yaml
serviceintentions.consul.hashicorp.com/ingress-gateway created
인텐션으로 제로 트러스트 네트워킹을 구성하는 방법에 대한 추가 지침은 제로 트러스트 네트워크 튜토리얼을 참고하세요.
애플리케이션을 Kubernetes에 배포 (Deploy your application to Kubernetes)
애플리케이션을 클러스터에 배포해요. 배포 생성에 대한 지침은 Kubernetes 문서를 참고하세요.
다음 구성은 hashicorp/http-echo:latest 이미지를 사용해 "hello world"를 출력하는 static-server라는 Kubernetes Deployment 컨테이너를 정의합니다:
static-server.yaml
apiVersion: v1
kind: Service
metadata:
name: static-server
spec:
selector:
app: static-server
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: static-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: static-server
spec:
replicas: 1
selector:
matchLabels:
app: static-server
template:
metadata:
name: static-server
labels:
app: static-server
annotations:
'consul.hashicorp.com/connect-inject': 'true'
spec:
containers:
- name: static-server
image: hashicorp/http-echo:latest
args:
- -text="hello world"
- -listen=:8080
ports:
- containerPort: 8080
name: http
serviceAccountName: static-server
구성을 적용하고 애플리케이션을 배포하려면 kubectl apply 명령을 실행해요.
$ kubectl apply --filename static-server.yaml
서비스 등록 검증 (Validate the service registration)
UI를 사용하거나 서비스에 요청을 보내 서비스가 Consul에 등록되었는지 검증할 수 있어요.
Consul UI
- 웹 브라우저에서 Consul UI를 열어요. 기본적으로 Consul UI는 포트 8500에 있어요(예:
http://localhost:8500/ui/dc1/services/static-server/instances). TLS가 활성화된 경우 기본 포트 번호는 8501이에요. - Services 탭을 클릭해요.
- 서비스의 이름을 클릭해요.
Request command
다음 예시는 클러스터에 cURL 요청을 보냅니다:
$ EXTERNAL_IP=$(kubectl get services --selector component=ingress-gateway --output jsonpath="{range .items[*]}{@.status.loadBalancer.ingress[*].ip}{end}")
$ echo "Connecting to \"$EXTERNAL_IP\""
$ curl --header "Host: static-server.ingress.consul" "http://$EXTERNAL_IP:8080"
"hello world"
참고 보안 경고: 테스트 및 개발 절차의 일부로 만든 애플리케이션과 서비스는 항상 삭제하세요. 클러스터에 남겨둔 열려 있고 인증되지 않은 로드 밸런서는 보안 위험을 나타냅니다.
인그레스 게이트웨이 삭제 (Delete an ingress gateway)
인그레스 게이트웨이를 삭제하려면 Helm 구성에서 ingressGateways.enabled를 false로 설정해요:
values.yaml
global:
name: consul
connectInject:
enabled: true
ingressGateways:
enabled: false # Set to false
gateways:
- name: ingress-gateway
service:
type: LoadBalancer
구성을 적용하려면 helm upgrade를 실행해요:
$ helm upgrade consul hashicorp/consul --values values.yaml