목록으로

Programming Notes

kind를 이용한 게이트웨이 API 실험

이 문서는 kind를 사용하여 로컬 실험 환경을 설정하는 방법을 안내합니다. 이 설정은 학습 및 테스트용으로 설계되었습니다. 이를 통해 복잡한 프로덕션 환경 없이 게이트웨이 API 개념을 이해할 수 있습니다. 주의: 이것은 실험 학습용 설정이며, 프로덕션 환경에서 사용해서는 안...

이 문서는 kind를 사용하여 로컬 실험 환경을 설정하는 방법을 안내합니다. 이 설정은 학습 및 테스트용으로 설계되었습니다. 이를 통해 복잡한 프로덕션 환경 없이 게이트웨이 API 개념을 이해할 수 있습니다.

주의:

이것은 실험 학습용 설정이며, 프로덕션 환경에서 사용해서는 안 됩니다. 이 문서에서 사용된 구성 요소는 프로덕션 용도에 적합하지 않습니다. 게이트웨이 API를 프로덕션 환경에 배포할 준비가 되면, 필요에 맞는 [구현체](https://gateway-api.sigs.k8s.io/implementations/)를 선택하세요.

개요

이 가이드에서는 다음을 수행합니다:
  • kind(Kubernetes in Docker)를 사용하여 로컬 Kubernetes 클러스터 설정
  • LoadBalancer 서비스와 게이트웨이 API 컨트롤러를 모두 제공하는 cloud-provider-kind 배포
  • 데모 애플리케이션으로 트래픽을 라우팅하기 위한 게이트웨이 및 HTTPRoute 생성
  • 로컬에서 게이트웨이 API 구성 테스트

이 설정은 게이트웨이 API 개념 학습, 개발 및 실험에 이상적입니다.

사전 준비 사항

시작하기 전에 로컬 머신에 다음이 설치되어 있는지 확인하세요:
  • Docker - kind 및 cloud-provider-kind를 실행하는 데 필요합니다.
  • kubectl - Kubernetes 명령줄 도구
  • kind - Kubernetes in Docker
  • curl - 라우트를 테스트하는 데 필요합니다.

kind 클러스터 생성

다음 명령을 실행하여 새로운 kind 클러스터를 생성하세요:
kind create cluster

이렇게 하면 Docker 컨테이너에서 실행되는 단일 노드 Kubernetes 클러스터가 생성됩니다.

cloud-provider-kind 설치

다음으로, 이 설정을 위해 두 가지 핵심 구성 요소를 제공하는 [`cloud-provider-kind`](https://github.com/kubernetes-sigs/cloud-provider-kind/)가 필요합니다:
  • LoadBalancer 유형 서비스에 주소를 할당하는 LoadBalancer 컨트롤러
  • 게이트웨이 API 사양을 구현하는 게이트웨이 API 컨트롤러

또한 클러스터에 게이트웨이 API CRD(Custom Resource Definitions)를 자동으로 설치합니다.

kind 클러스터를 생성한 동일한 호스트에서 cloud-provider-kind를 Docker 컨테이너로 실행합니다:

VERSION="$(basename $(curl -s -L -o /dev/null -w '%{url_effective}' https://github.com/kubernetes-sigs/cloud-provider-kind/releases/latest))"
docker run -d --name cloud-provider-kind --rm --network host -v /var/run/docker.sock:/var/run/docker.sock registry.k8s.io/cloud-provider-kind/cloud-controller-manager:${VERSION}

참고: 일부 시스템에서는 Docker 소켓에 액세스하기 위해 관리자 권한이 필요할 수 있습니다.

cloud-provider-kind가 실행 중인지 확인하세요:

docker ps --filter name=cloud-provider-kind

컨테이너가 목록에 표시되고 실행 중인 상태여야 합니다. 로그를 확인할 수도 있습니다:

docker logs cloud-provider-kind

게이트웨이 API 실험하기

이제 클러스터가 설정되었으므로 게이트웨이 API 리소스를 실험할 수 있습니다.

cloud-provider-kindcloud-provider-kind라는 GatewayClass를 자동으로 프로비저닝합니다. 이 클래스를 사용하여 게이트웨이를 생성할 것입니다.

kind는 클라우드 공급자가 아니지만, 이 프로젝트는 클라우드 지원 환경을 시뮬레이션하는 기능을 제공하므로 cloud-provider-kind라고 명명되었습니다.

게이트웨이 배포

다음 매니페스트는 다음을 수행합니다:
  • gateway-infra라는 새 네임스페이스 생성
  • 포트 80에서 수신 대기하는 게이트웨이 배포
  • *.exampledomain.example 패턴과 일치하는 호스트 이름을 가진 HTTPRoute 허용
  • 모든 네임스페이스의 라우트가 게이트웨이에 연결되도록 허용. 참고: 실제 클러스터에서는 allowedRoutes 네임스페이스 선택기 필드에서 Same 또는 Selector 값을 선호하여 연결을 제한하세요.

다음 매니페스트를 적용하세요:

---
apiVersion: v1
kind: Namespace
metadata:
  name: gateway-infra
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway
  namespace: gateway-infra
spec:
  gatewayClassName: cloud-provider-kind
  listeners:
  - name: default
    hostname: "*.exampledomain.example"
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: All

그런 다음 게이트웨이가 제대로 프로그래밍되고 주소가 할당되었는지 확인하세요:

kubectl get gateway -n gateway-infra gateway

예상 출력:

NAME CLASS ADDRESS PROGRAMMED AGE
gateway cloud-provider-kind 172.18.0.3 True 5m6s

PROGRAMMED 열은 True로 표시되어야 하며, ADDRESS 필드에는 IP 주소가 포함되어야 합니다.

데모 애플리케이션 배포

다음으로, 게이트웨이 구성을 테스트하는 데 도움이 되는 간단한 에코 애플리케이션을 배포합니다. 이 애플리케이션은 다음을 수행합니다:
  • 포트 3000에서 수신 대기
  • 경로, 헤더 및 환경 변수를 포함한 요청 세부 정보를 다시 에코
  • demo라는 네임스페이스에서 실행

다음 매니페스트를 적용하세요:

apiVersion: v1
kind: Namespace
metadata:
  name: demo
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: echo
  name: echo
  namespace: demo
spec:
  ports:
  - name: http
    port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app.kubernetes.io/name: echo
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: echo
  name: echo
  namespace: demo
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: echo
  template:
    metadata:
      labels:
        app.kubernetes.io/name: echo
    spec:
      containers:
      - env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        image: registry.k8s.io/gateway-api/echo-basic:v20251204-v1.4.1
        name: echo-basic

HTTPRoute 생성

이제 게이트웨이에서 에코 애플리케이션으로 트래픽을 라우팅하기 위한 HTTPRoute를 생성합니다. 이 HTTPRoute는 다음을 수행합니다:
  • 호스트 이름 some.exampledomain.example에 대한 요청에 응답
  • 에코 애플리케이션으로 트래픽 라우팅
  • gateway-infra 네임스페이스의 게이트웨이에 연결

다음 매니페스트를 적용하세요:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: echo
  namespace: demo
spec:
  parentRefs:
  - name: gateway
    namespace: gateway-infra
  hostnames: ["some.exampledomain.example"]
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: echo
      port: 3000

라우트 테스트

마지막 단계는 `curl`을 사용하여 라우트를 테스트하는 것입니다. 게이트웨이의 IP 주소로 호스트 이름 `some.exampledomain.example`을 사용하여 요청을 보낼 것입니다. 다음 명령은 POSIX 셸 전용이며, 환경에 따라 조정해야 할 수 있습니다:
GW_ADDR=$(kubectl get gateway -n gateway-infra gateway -o jsonpath='{.status.addresses[0].value}')
curl --resolve some.exampledomain.example:80:${GW_ADDR} http://some.exampledomain.example

다음과 유사한 JSON 응답을 받아야 합니다:

{
 "path": "/",
 "host": "some.exampledomain.example",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
 "Accept": [
 "*/*"
 ],
 "User-Agent": [
 "curl/8.15.0"
 ]
 },
 "namespace": "demo",
 "ingress": "",
 "service": "",
 "pod": "echo-dc48d7cf8-vs2df"
}

이 응답을 확인하셨다면 축하합니다! 게이트웨이 API 설정이 올바르게 작동하고 있습니다.

문제 해결

예상대로 작동하지 않는 경우, 리소스 상태를 확인하여 문제를 해결할 수 있습니다.

게이트웨이 상태 확인

먼저 게이트웨이 리소스를 검사합니다:
kubectl get gateway -n gateway-infra gateway -o yaml

status 섹션에서 조건을 확인하세요. 게이트웨이는 다음을 포함해야 합니다:

  • Accepted: True - 게이트웨이가 컨트롤러에 의해 수락됨
  • Programmed: True - 게이트웨이가 성공적으로 구성됨
  • IP 주소로 채워진 .status.addresses

HTTPRoute 상태 확인

다음으로 HTTPRoute를 검사합니다:
kubectl get httproute -n demo echo -o yaml

status.parents 섹션에서 조건을 확인하세요. 일반적인 문제에는 다음이 포함됩니다:

  • BackendNotFound 이유로 ResolvedRefsFalse로 설정된 경우; 이는 백엔드 서비스가 존재하지 않거나 이름이 잘못되었음을 의미합니다.
  • AcceptedFalse로 설정된 경우; 이는 라우트가 게이트웨이에 연결될 수 없음을 의미합니다 (네임스페이스 권한 또는 호스트 이름 일치 여부 확인).

백엔드를 찾을 수 없을 때의 오류 예시:

status:
  parents:
  - conditions:
    - lastTransitionTime: "2026-01-19T17:13:35Z"
      message: backend not found
      observedGeneration: 2
      reason: BackendNotFound
      status: "False"
      type: ResolvedRefs
    controllerName: kind.sigs.k8s.io/gateway-controller

컨트롤러 로그 확인

리소스 상태에서 문제가 드러나지 않는 경우, `cloud-provider-kind` 로그를 확인하세요:
docker logs -f cloud-provider-kind

여기에는 LoadBalancer 및 게이트웨이 API 컨트롤러의 자세한 로그가 표시됩니다.

정리

실험을 마친 후에는 리소스를 정리할 수 있습니다.

Kubernetes 리소스 제거

네임스페이스를 삭제합니다 (해당 네임스페이스 내의 모든 리소스가 제거됩니다):
kubectl delete namespace gateway-infra
kubectl delete namespace demo

cloud-provider-kind 중지

`cloud-provider-kind` 컨테이너를 중지하고 제거합니다:
docker stop cloud-provider-kind

컨테이너가 --rm 플래그로 시작되었으므로 중지될 때 자동으로 제거됩니다.

kind 클러스터 삭제

마지막으로 kind 클러스터를 삭제합니다:
kind delete cluster

다음 단계

이제 로컬에서 게이트웨이 API를 실험했으므로 프로덕션용 구현체를 탐색할 준비가 되었습니다:

마지막으로 주의할 점

이 `kind`로 구축된 설정은 개발 및 학습용으로만 사용해야 합니다. 실제 워크로드에는 항상 프로덕션급 게이트웨이 API 구현체를 사용하세요.