Kubernetes Service & Ingress

1. Overview

이번 문서에서는 Kubernetes(k8s)의 Service와 Ingress에 대해서 알아보겠습니다.

2. Prerequisites

본문에서 사용한 spec :
OS : CentOS v7.6
Arch : x86

k8s클러스터는 1마스터 2노드로 구성했습니다.
Master : 4cpu, ram16G
Node : 2cpu, ram4G

3. Service

pod은 Controller에 의해 관리되기 때문에 한군데에 고정되어있지 않습니다.

서비스를 사용하게 되면 pod가 클러스터 내 어디에 있던지 상관없이 고정된 주소를 사용해서 접근이 가능하게 됩니다.

ClusterIP

  • 가장 기본 타입
  • 클러스터 내부의 노드에서 접근가능
  • 클러스터 외부에서는 접근불가

NodePort

  • 각 노드의 지정된 포트를 할당하는 방식
  • 노드의 포트를 사용하기 때문에 클러스터 외부나 내부 모두 접근가능
  • 특이점 : pod이 1번노드에 떠있다고 하더라도 2번노드의 ip로 접근가능

LoadBalancer

  • 클라우드 서비스를 사용할 때 사용가능한 옵션
  • pod을 클라우드에서 제공하는 로드밸런서와 연결해 해당 로드밸런서의 ip를 이용외부에서 접근할 수 있게 해줌
  • EXTERNAL-IP에 IP가 표시됨

ExternalName

  • 클러스터 내부에서 외부로 접근할 때 주로 사용
  • 이 서비스로 접근하면 설정해둔 CNAME값으로 연결되어 클러스터 외부로 접근할 수 있음

kube-proxy란?
쿠버네티스 클러스터의 각 노드마다 실행되고 있으면서
클러스터 내부 IP로 연결되기 바라는 요청을 적절한 곳으로 전달해주는 역할을 합니다.

4. Ingress

클러스터 외부에서 내부로 접근하는 요청을 어떻게 처리할지 정리해둔 규칙들의 모음입니다.

  • 외부에서 접근가능한 URL
  • 트래픽 로드밸런싱
  • SSL/TLS termination
  • ip가아닌 이름기반 주소처리

등이 가능합니다.
이러한 설정들을 ingress라고 하고, 실제 행위자는 ingress controller입니다.

쿠버네티스에서 공식적으로 제공하는 ingress controller는 두개입니다.

  1. ingress-gce
  2. ingress-nginx

gce같은경우는 구글클라우드를 사용하면 자동으로 사용할 수 있고 직접 클러스터에 설치해서 사용할 수 있는것은 ingress-nginx입니다.

그럼 실습으로 좀 더 자세하게 알아보겠습니다.

실습

ingress 규칙 정의

$ vim ingress-controller.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  #- host: foo.bar.com     # host를 명시하지 않으면 ip로 연결
  - http:
      paths:               # 각 path는 백엔드와 연결됨
      - path: /testpath
        backend:           # 연결될 서비스이름과 port
          serviceName: test
          servicePort: 80

ingress배포

$ kubectl apply -f ingress-controller.yaml
$ kubectl get ingress

image

상세 내용 확인

$ kubectl describe ingress test-ingress

image
/testpath로 접속하면 test서비스의 80포트로 연결된다는 규칙을 확인할 수 있습니다.

ingress controller(ingress-nginx) 생성

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

$ kubectl get deployment -A

image
image

ingress contoller에 접근하기 위한 서비스 생성

$ kubectl expose deploy nginx-ingress-controller --type=NodePort -n ingress-nginx

image

ip:port로 접근

image
아무 path를 설정하지 않았을 경우 default 페이지가 뜨게됩니다.
위에서 default로 설정을 하지 않았기 때문에 404에러가 뜹니다.

위의 ingress규칙대로 /testpath로 이동해봅시다.
image
설정은 있지만, 서비스가 뜨지 않았으므로 503에러가 발생합니다.

서비스 생성

/testpath와 이어질 서비스를 올려줍니다.

올릴 pod에 대한 정보는 다음 링크를 참고 : 호롤리한하루/deployments-nginx.yaml

$ kubectl apply -f deployments-nginx.yaml
$ kubectl expose deploy nginx-deployment --name test
$ kubectl get svc

image

새로고침

ingress를 사용하지 않았다면 서비스타입이 ClusterIP니까 외부에서 접근이 안되어야 하는게 정상입니다.

하지만 다시 페이지로 돌아가서 새로고침을 하면 :
image
ingress controller에서 서비스로 연결을 시켜주는 것을 확인할 수 있습니다.

정리

일반적으로 서비스를 사용할 때, 서비스의 ip정보를 바라보게 됨 :
image

ingress를 사용하게 되면 서비스의 pod정보를 ingress controller로 가져오고, controller에서 서비스를 통하지 않고 pod으로 직접 연결하게 됩니다.
image


댓글남기기