이 페이지에서는 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: extensions/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
과 연결되어 있음을 나타내는 규칙을 확인할 수 있습니다. 60001은 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