서비스 및 인그레스 만들기

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

다음 단계

고급 설치 주제 개요

클러스터 상태를 모니터링하기 위한 대시보드 만들기