이 페이지에서는 VMware용 Anthos 클러스터(GKE On-Prem) 사용자 클러스터에서 Kubernetes 인그레스 객체를 만드는 방법을 설명합니다. 인그레스 객체는 각각 pod 집합과 연결된 서비스 객체 한 개 이상과 연결되어야 합니다.
관리 워크스테이션에 SSH를 통해 연결
관리자 워크스테이션에 SSH를 통해 연결합니다.
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
여기서 [IP_ADDRESS]는 관리자 워크스테이션의 IP 주소입니다.
관리 워크스테이션에서 이 주제의 남은 단계를 모두 수행합니다.
배포 만들기
배포의 매니페스트는 다음과 같습니다.
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment spec: selector: matchLabels: greeting: hello replicas: 3 template: metadata: labels: greeting: hello spec: containers: - name: hello-world image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50000" - name: hello-kubernetes image: "gcr.io/google-samples/node-hello:1.0" env: - name: "PORT" value: "8080"
이 실습을 진행하면서 배포 매니페스트에 대해 알아야 할 중요한 사항은 다음과 같습니다.
배포에 속한 각 pod에는
greeting: hello
라벨이 있습니다.각 pod에는 2개의 컨테이너가 있습니다.
env
필드는hello-app
컨테이너가 TCP 포트 50000에서 리슨하고node-hello
컨테이너가 TCP 포트 8080에서 리슨하는 것을 지정합니다.hello-app
의 경우 소스 코드를 보면PORT
환경 변수의 효과를 확인할 수 있습니다.
hello-deployment.yaml
파일에 매니페스트를 복사하고 배포를 만듭니다.
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-deployment.yaml
여기서 [USER_CLUSTER_KUBECONFIG]는 사용자 클러스터의 kubeconfig 파일입니다.
서비스를 통한 배포 노출
클라이언트가 배포 pod로 요청을 보내는 안정적인 방법을 제공하려면 서비스를 만듭니다.
다음은 클러스터 내부 및 외부 클라이언트에 배포를 노출하는 서비스의 매니페스트입니다.
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: greeting: hello ports: - name: world-port protocol: TCP port: 60000 targetPort: 50000 - name: kubernetes-port protocol: TCP port: 60001 targetPort: 8080
매니페스트를 hello-service.yaml
파일에 복사하고 서비스를 만듭니다.
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-service.yaml
서비스를 확인합니다.
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service hello-service --output yaml
출력에는 서비스에 할당된 nodePort
값이 표시됩니다.
apiVersion: v1 kind: Service metadata: ... name: hello-service namespace: default ... spec: clusterIP: 10.105.252.237 externalTrafficPolicy: Cluster ports: - name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000 - name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080 selector: greeting: hello sessionAffinity: None type: NodePort status: loadBalancer: ingress: - {}
위 출력에서 ports
필드는 ServicePort 객체의 배열입니다. 하나는 world-port
이고 하나는 kubernetes-port
입니다.
클라이언트가 world-port
를 사용하여 서비스를 호출할 수 있는 방법은 다음과 같습니다.
클러스터 노드 중 하나에서 실행 중인 클라이언트는
port
의clusterIP
에 요청을 보낼 수 있습니다. 이 예시에서는 10.105.252.237:60000입니다. 요청은targetPort
의 구성원 pod로 전달됩니다. 이 예시에서는 [POD_IP_ADDRESS]:50000입니다.클라이언트는
nodePort
에 있는 모든 클러스터 노드의 IP 주소로 요청을 보낼 수 있습니다. 이 예시에서는 [NODE_IP_ADDRESS]:31807입니다. 요청은targetPort
의 구성원 pod로 전달됩니다. 이 예시에서는 [POD_IP_ADDRESS]:50000입니다.
클라이언트가 kubernetes-port
를 사용하여 서비스를 호출할 수 있는 방법은 다음과 같습니다.
클러스터 노드 중 하나에서 실행 중인 클라이언트는
port
의clusterIP
에 요청을 보낼 수 있습니다. 이 예시에서는 10.105.252.237:60001입니다. 요청은targetPort
의 구성원 pod로 전달됩니다. 이 예시에서는 [POD_IP_ADDRESS]:8080입니다.클라이언트는
nodePort
에 있는 모든 클러스터 노드의 IP 주소로 요청을 보낼 수 있습니다. 이 예시에서는 [NODE_IP_ADDRESS]:30734입니다. 요청은targetPort
의 구성원 pod로 전달됩니다. 이 예시에서는 [POD_IP_ADDRESS]:8080입니다.
인그레스 만들기
인그레스의 매니페스트는 다음과 같습니다.
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /greet-the-world backend: serviceName: hello-service servicePort: 60000 - path: /greet-kubernetes backend: serviceName: hello-service servicePort: 60001
my-ingress.yaml
이라는 파일에 매니페스트를 복사하고 인그레스를 만듭니다.
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml
사용자 클러스터를 만들 때 사용자 클러스터 구성 파일에 usercluster.vips.ingressvip
값을 제공하여 인그레스용 가상 IP 주소(VIP)를 지정했습니다.
클라이언트가 사용자 클러스터 인그레스 VIP로 요청을 보내면 요청이 F5 BIG-IP 부하 분산기로 라우팅됩니다. 부하 분산기는 사용자 클러스터에서 실행 중인 인그레스 서비스로 요청을 전달합니다. 인그레스 서비스는 요청 URL의 경로에 따라 요청을 다른 백엔드로 전달하도록 구성됩니다.
이 주제의 단계와 관련하여 두 가지 다른 서비스가 있다는 점을 이해하는 것이 중요합니다.
hello-service
라는 서비스로,hello-deployment
배포의 pod를 노출하기 위해 만든 서비스입니다.사용자 클러스터의
gke-system
네임스페이스에서 실행되는 인그레스 서비스입니다. 이 서비스는 클러스터 인프라의 일부입니다.
/greet-the-world
경로
인그레스 매니페스트에서 /greet-the-world
경로가 serviceName: hello-service
및 servicePort: 60000
과 연결되어 있음을 나타내는 규칙을 확인할 수 있습니다. 60000은 hello-service
서비스의 world-port
필드에 있는 port
값입니다.
- name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000
인그레스 서비스는 클러스터 노드를 선택하고 nodePort
의 노드로 요청을 전달합니다. 이 예시에서는 [NODE_IP_ADDRESS]:31807입니다. 노드의 iptables 규칙은 요청을 포트 50000의 구성원 pod로 전달합니다. 포트 50000에서 리슨하는 컨테이너는 Hello World!
메시지를 표시합니다.
/greet-kubernetes
경로
인그레스 매니페스트에서 /greet-kubernetes
경로가 serviceName: hello-service
및 servicePort: 60001
과 연결되어 있음을 나타내는 규칙을 확인할 수 있습니다. 60000은 hello-service
서비스의 kubernetes-port
필드에 있는 port
값입니다
- name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080
인그레스 서비스는 클러스터 노드를 선택하고 nodePort
의 노드로 요청을 전달합니다. 이 예시에서는 [NODE_IP_ADDRESS]:30734입니다. 노드의 iptables 규칙은 요청을 포트 8080의 구성원 pod로 전달합니다.
포트 8080에서 리슨하는 컨테이너는 Hello Kubernetes!
메시지를 표시합니다.
인그레스 테스트
/greet-the-world
경로를 사용하여 인그레스를 테스트합니다.
curl [USER_CLUSTER_INGRESS_VIP]/greet-the-world
출력에 Hello, world!
메시지가 표시됩니다.
Hello, world! Version: 2.0.0 Hostname: ...
/greet-kubernetes
경로를 사용하여 인그레스를 테스트합니다.
curl [USER_CLUSTER_INGRESS_VIP]/greet-kubernetes
출력에 Hello, Kubernetes!
메시지가 표시됩니다.
Hello Kubernetes!
삭제
인그레스를 삭제합니다.
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress
서비스를 삭제합니다.
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service
배포를 삭제합니다.
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment