서비스 및 인그레스 만들기

이 페이지에서는 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를 사용하여 서비스를 호출할 수 있는 방법은 다음과 같습니다.

  • 클러스터 노드 중 하나에서 실행 중인 클라이언트는 portclusterIP에 요청을 보낼 수 있습니다. 이 예시에서는 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를 사용하여 서비스를 호출할 수 있는 방법은 다음과 같습니다.

  • 클러스터 노드 중 하나에서 실행 중인 클라이언트는 portclusterIP에 요청을 보낼 수 있습니다. 이 예시에서는 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-serviceservicePort: 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-serviceservicePort: 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

다음 단계

고급 설치 주제 개요