ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] Service 이해하기
    Kubernetes 2023. 8. 1. 17:23
    728x90
    반응형

    - 목차

     

    들어가며.

     

    Kubernetes 의 Service 는 Pod 들을 네트워크적으로 묶어줍니다.

    네트워크적으로 묶는다는 의미는 하나의 단일 IP 를 통해서 Pod 에게 트래픽을 전송할 수 있는 의미입니다.

    이를 그림으로 표현하면 아래와 같습니다.

     

    Service 는 Pod 1, Pod 2, Pod 3 을 네트워크적으로 대표하게 됩니다.

    그래서 외부 트래픽이 Service 로 유입되면 Service 는 3개의 Pod 중 하나에게 네트워크 트래픽을 전달합니다.

     

    이렇게 Service 를 Load Balancer 방식으로 사용하는 것이 일반적입니다.

    그 외에서 여러가지 Service Type 이 존재하는데요.

    이번 글에서 Service 에 대해서 알아보는 시간을 가지도록 하겠습니다.

     

    Endpoint 와 Pod.

    Kubernetes Service 는 Pod 들을 네트워크적으로 묶기 위해서 Endpoint 라는 리소스를 사용합니다.

    Endpoint 는 Service 와 연결되는 Pod 들의 IP 를 저장하고 있습니다.

    그리고 지속적으로 Pod 의 상태 변화에 따라서 Pod 의 IP 를 업데이트합니다.

    이러한 구조를 그림으로 표현하면 아래와 같습니다.

     

    Service 는 연결된 Pod 들을 찾기 위해서 Pod 와 IP 정보를 가지고 있는 Endpoint 를 활용하게 됩니다.

    이러한 역할을 Service Discovery 라고도 부르죠.

     

    Endpoint 는 어떻게 생성하는가 ?

    Endpoint 는 Service 를 생성할 때에 자동적으로 생성됩니다.

    Service 는 matchLabels 설정을 통해서 연결할 Pod 들을 설정하는데요.

    이 과정에서 연결된 Pod 들의 IP 정보를 가진 Endpoint 가 생성됩니다.

     

    Endpoint Controller.

    그럼 Endpoint 는 어떻게 Pod 의 IP 를 저장할 수 있을까요 ?

    Kubernetes 에는 여러 Built-in Controller 들이 존재합니다.

    Endpoint Controller 는 Pod 의 상태 변경을 감지하고, Pod 의 IP 가 변경되면 Endpoint 의 정보를 업데이트합니다.

     

    이렇게 Pod 의 변경을 감지하여 Endpoint 를 Update 하는 Reconcile Loop 을 수행하면서

    Endpoint 의 정보는 최신의 상태를 유지합니다.

     

     

    Kubernetes DNS.

    Kubernetes 는 자체적인 DNS 시스템을 가집니다.

    모든 Pod 와 Service 는 고유한 IP 를 가지는데요.

    이 IP 에 매칭되는 도메인 네임을 가집니다.

    그리고 도메인 네임을 결정하는 패턴 또한 존재합니다.

     

    Kubernetes Domain Name Pattern.

    도메인 네임을 가지는 주체는 Pod 와 Service 입니다.

    이들의 Domain Name Pattern 은 다음과 같습니다.

     

    Pod 의 도메인 네임은 다음과 같습니다.

    PodIP . Namespace . pod . cluster . local

     

    Service 의 도메인 네임은 다음과 같습니다.

    ServiceName . Namespace . svc . cluster . local

     

    이처럼 5개의 word 와 그 사이의 4개의 dot 들로 구성됩니다.

    만약 api 라는 Namespace 에 auth-server 라는 Pod 가 존재하고, Pod 의 IP 가 10.1.0.163 이라면

    auth-server 의 도메인 네임은 10-1-0-163.api.pod.cluster.local 입니다.

    그리고 동일한 Namespace 에 auth-service 라는 Service 가 존재한다면,

    auth-service 의 도메인 네임은 auth-service.api.svc.cluster.local 입니다.

     

    그리고 cluster.local 과 같은 Root Domain 은 생략이 가능합니다.

    pod 나 svc 와 같은 Main Domain 도 생략이 가능합니다.

    그래서 일반적으로 auth-service.api 나 auth-server.api 와 같이 Service Name (Pod IP) 과 Namespace 의 조합으로 도메인을 표현합니다.

     

     

     

    Pod 의 resolv.conf 살펴보기.

    Pod 의 resolv.conf 파일에 대해서 살펴보도록 하겠습니다.

    Pod 는 다른 Pod 나 Service 와 소통하기 위해서 DNS Resolving 과정을 수행해야합니다.

    resolv.conf 파일 내부에 DNS Nameserver 의 주소와 Lookup 을 위한 설정들이 존재합니다.

     

    간단하게 Pod 의 생성 후 resolv.conf 파일을 살펴보겠습니다.

    cat <<EOF> /tmp/nginx.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: nginx
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    EOF
    kubectl apply -f /tmp/nginx.yaml

     

    위 명령어를 실행하게 되면, 아래 이미지처럼 nginx 라는 이름의 Namespace 하위에 2개의 Pod 가 생성됩니다.

     

     

    아래 명령어를 통해서 Pod 의 resolv.conf 에 접근할 수 있습니다.

    kubectl exec -n nginx nginx-deployment-6595874d85-h7b2n -- cat /etc/resolv.conf
    search nginx.svc.cluster.local svc.cluster.local cluster.local
    nameserver 10.96.0.10
    options ndots:5

     

    우선 nameserver 는 Kubernetes DNS 의 네임서버의 IP 입니다.

    coredns Pod 들의 Service 인 kube-dns Service 의 IP 가 적용됩니다.

     

     

    search 지시자을 통해서 축약된 형식으로 DNS 를 사용할 수 있는데요.

    동일한 Namespace 내부의 Service 또는 Pod 간의 통신이라면 Service Name 또는 Pod IP 만으로 통신할 수 있습니다.

    "nginx.svc.cluster.local" 이 이러한 역할을 수행합니다.

     

    그리고 서로 다른 Namespace 라면 "svc.cluster.local" 의 역할에 의해서

    ServiceName.Namespace 또는 PodIP.Namespace 정보만으로 통신을 수행할 수 있습니다.

     

    그리고 Root Domain 인 cluster.local 는 항상 생략이 가능합니다.

     

     

     

    반응형

    'Kubernetes' 카테고리의 다른 글

    KinD 알아보기.  (0) 2023.11.27
    Kubernetes Ephemeral Volume  (0) 2023.08.09
    Kubernetes Pod 이해하기  (0) 2023.07.26
    [Kubernetes] ReadinessProbe 알아보기  (0) 2023.06.16
    Kubernetes Event 이해하기  (0) 2023.06.16
Designed by Tistory.