Ingress HTTP 예제
Ingress HTTP 예제 (Ingress HTTP Example)
예시 ingress 구성은 Istio 프로젝트의 bookinfo 데모 마이크로서비스 앱의 백엔드 서비스로 트래픽을 라우팅해요.
본문
예시 ingress 구성은 Istio 프로젝트의 bookinfo 데모 마이크로서비스 앱의 백엔드 서비스로 트래픽을 라우팅해요.
데모 앱 배포하기 (Deploy the Demo App)
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml
이것은 데모 앱을 배포하는 것뿐이며, Istio 컴포넌트를 추가하는 게 아니에요. Cilium Service Mesh에서는 데모 앱 각 마이크로서비스와 함께 Envoy 사이드카가 생성되지 않는 것을 확인할 수 있어요.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-5498c86cf5-kjzkj 1/1 Running 0 2m39s
productpage-v1-65b75f6885-ff59g 1/1 Running 0 2m39s
ratings-v1-b477cf6cf-kv7bh 1/1 Running 0 2m39s
reviews-v1-79d546878f-r5bjz 1/1 Running 0 2m39s
reviews-v2-548c57f459-pld2f 1/1 Running 0 2m39s
reviews-v3-6dd79655b9-nhrnh 1/1 Running 0 2m39s
참고
사이드카 구현이었다면 출력이 2/2 READY로 보였을 거예요. 하나는 마이크로서비스, 하나는 Envoy 사이드카 때문이에요.
첫 번째 Ingress 배포하기 (Deploy the First Ingress)
예시 Ingress 정의는 basic-ingress.yaml에서 찾을 수 있어요.
# Basic ingress for istio bookinfo demo application, which can be found in below
# https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
namespace: default
spec:
ingressClassName: cilium
rules:
- http:
paths:
- backend:
service:
name: details
port:
number: 9080
path: /details
pathType: Prefix
- backend:
service:
name: productpage
port:
number: 9080
path: /
pathType: Prefix
$ kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.20.2/examples/kubernetes/servicemesh/basic-ingress.yaml
이 예제는 /details 경로에 대한 요청을 details 서비스로, /를 productpage 서비스로 라우팅해요.
서비스 목록을 보면 이 ingress에 대해 LoadBalancer 서비스가 자동으로 생성된 걸 볼 수 있어요. 클라우드 프로바이더가 외부 IP 주소를 자동으로 프로비저닝하지만, 약 30초가 걸릴 수 있어요.
# For dedicated load balancer mode
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cilium-ingress-basic-ingress LoadBalancer 10.98.169.125 10.98.169.125 80:32478/TCP 2m11s
details ClusterIP 10.102.131.226 <none> 9080/TCP 2m15s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
productpage ClusterIP 10.97.231.139 <none> 9080/TCP 2m15s
ratings ClusterIP 10.108.152.42 <none> 9080/TCP 2m15s
reviews ClusterIP 10.111.145.160 <none> 9080/TCP 2m15s
# For shared load balancer mode
$ kubectl get services -n kube-system cilium-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cilium-ingress LoadBalancer 10.98.169.125 10.98.169.125 80:32690/TCP,443:31566/TCP 18m
외부 IP 주소는 Ingress에도 채워져야 해요:
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
basic-ingress cilium * 10.98.169.125 80 97s
참고
EKS 같은 일부 프로바이더는 IP 주소 대신 완전한 도메인 이름(FQDN)을 사용해요.
HTTP 요청 보내기 (Make HTTP Requests)
curl이나 브라우저로 외부 주소에 HTTP 요청을 보낼 수 있는지 확인해볼게요. / 경로는 bookinfo 애플리케이션의 홈 페이지로 이어져요.
클러스터 외부에서 /details 경로를 사용해 details 서비스에 직접 요청할 수도 있어요. 하지만 basic-ingress.yaml에 정의되지 않은 다른 URL 경로에는 직접 접근할 수 없어요.
예를 들어 <address>/details/1에 대한 요청에서 JSON 데이터를 얻을 수 있지만, <address>/ratings에 요청하면 404 오류가 나요.
$ HTTP_INGRESS=$(kubectl get ingress basic-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ curl --fail -s http://"$HTTP_INGRESS"/details/1 | jq
{
"id": 1,
"author": "William Shakespeare",
"year": 1595,
"type": "paperback",
"pages": 200,
"publisher": "PublisherA",
"language": "English",
"ISBN-10": "1234567890",
"ISBN-13": "123-1234567890"
}
더 알아보기 (Learn more)
- Ingress gRPC 예제 — gRPC Ingress 예제
- Cilium Ingress — Cilium Ingress 컨트롤러
- Ingress 참조 — Ingress 어노테이션 참조