Ingress HTTP 예제

Ingress HTTP 예제 (Ingress HTTP Example)

예시 ingress 구성은 Istio 프로젝트의 bookinfo 데모 마이크로서비스 앱의 백엔드 서비스로 트래픽을 라우팅해요.

출처: Ingress HTTP Example

본문

예시 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)