kubernetes

20210830 (월) service의 종류

gusalstm 2021. 8. 30. 16:47
반응형

9:33 review

 

 Controller

   Pod의 정상 동작을 위하여 특정 상태를 보장하는 오브젝트

 

   ReplicationController

     일정갯수만큼 pod가 복제되어 동작하는 것을 보장하는 컨트롤러

     kubectl get replicationcontrollers

     kubectl describe replicationcontrollers RC

     kubectl scale replicationcontrollers  RC --replicas N

   ReplicaSet

     ReplicationController와 유사한 Controller

     ReplicationController가 일치성 기반의 Label Selector만 지원했던 것과 달이 집합성 기반으로 Label Selector도 지원

   ReplicaSet의 Label Selector

   - matchLabels

       ReplicationController의 Label Selector와 동일한 동작을 수행(Label이 완전히 일치하는 경우)

       key: value

 

   - matchExpressions

       집합성 기반의 Label Selector 

       key

       value

       operator (In, NotIn, Exists, DoesNotExis)

     

   DaemonSet

     노드 레이블 미지정시 Cluster의 모든 노드에 pod를 한개씩 실행함

     노드 레이블 지정시 해당 노드레이블이 있는 노드에 pod를 한개씩 실행함

 

   Job

     pod의 애플리케이션이 실행되고 정상 종료되는 것에 초점을 맞춘 컨트롤러

     앞서 살펴본 컨트롤러와 달리 애플리케이션 실행을 마치면 정상종료하도록 함

 

   CronJob : 작업예약

 

===============

  네트워크

  ※ 전통적인 네트워크와 Kubernetes 네트워크의 차이점

    pod는 일회성으로 동작하며 언제든지 제거될 수 있음

    특정 노드에 pod가 스케쥴 되고 IP주소가 동적으로 할당되어 클라이언트가 IP주소를 예측할 수 없음

    분산 아키텍쳐 및 수평적 스케일링의 경우 같은 애플리케이션을 복수의 pod가 제공함 

 

  Cluster 내부 네트워크

 

    Service  

      애플리케이션을 실행하고 있는 컨트롤러의 pod 그룹에 대한 단일 네트워크 진입점을 제공하는 오브젝트

      별도의 종료 전까지는 부여된 IP주소가 변경되지 않음

      Label Selector를 이용하여 서비스 대상 pod를 관리하며 서비스에 선택된 파드의 목록을 엔드포인트가 관리

    - 서비스 생성(명령어)
      kubectl expose CONTROLLER_TYPE CONTROLLER_NAME --name SERVICE_NAME

    - 서비스 생성 (Manifest 파일 작성) 후 kubectl create -f FILE

apiVersion: v1
kind: Service
metadata:
  name: SERVICE_NAME
  LABEL_KEY: LABEL_VALUE
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: myapp-rs

  1) 서비스(기본 형태)

    ※ SessionAffinity

       Client의 요청을 매번 동일한 pod에서  처리하고자 할 때 사용

  2) 서비스(다중 포트)

  3) 서비스(named port)

    : Controller/Pod의 manifest작성시, ports항목에서 포트에 이름을 지정하여 이름으로 포트 번호(targetPort)를 참조

 

  서비스 탐색(Service Discovery)

   1) 환경 변수를 이용한 서비스 탐색 (Service Discovery)

      {SERVICE_NAME}_SERVICE_HOST={SERVICE_IP}

      {SERVICE_NAME}_SERVICE_PORT={SERVICE_PORT}

      {SERVICE_NAME}_PORT={PROTOCOL}://{SERVICE_IP}:{SERVICE_PORT}

      {SERVICE_NAME}_PORT_{PORT_NUMBER}_{PROTOCOL}_ADDR={PROTOCOL}://{SERVICE_IP}:{SERVICE_PORT}

      {SERVICE_NAME}_PORT_{PORT_NUMBER}_{PROTOCOL}_PORT={SERVICE_PORT}

      {SERVICE_NAME}_PORT_{PORT_NUMBER}_{PROTOCOL}_PORT={PROTOCOL}

    

   2) Kubernetes Cluster의 내부 DNS를 이용한 서비스 탐색 (Service Discovery)

vagrant@kube-control1:~/work/20210830$ kubectl get svc
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
myapp-svc             ClusterIP   10.99.154.209   <none>        80/TCP           3h23m

$ kubectl run nettool -it --image devops2341/network-multitool:v1 --rm bash

bash-5.1# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local  
options ndots:5
bash-5.1# curl http://myapp-svc 
Hello World!
bash-5.1# curl http://myapp-svc.default 
Hello World!
bash-5.1# curl http://myapp-svc.default.svc
Hello World!
bash-5.1# curl http://myapp-svc.default.svc.cluster.local
Hello World!

▶ Kubernetes cluster FQDN 형태
   SERVICE_NAME.NAMESPACE.svc.clsuter.local (myapp.default~)
   SERVICE_NAME.NAMESPACE.K8S_OBJECT_TYPE.CLUSTER_DOMAIN

    Service 종류
    - Cluster IP

      Kubernetes Cluster 내부 서비스
    - NodePort

      NodePort + Cluster IP

      Kubernetes Cluster의 모든 노드에 외부 접근용 포트를 할당하는 서비스

      노드의 Port를 사용하여 Kubernetes Cluster 외부에서 접근이 가능함

      노드의 Port로 접근하면 Service를 통해 Pod로 리다이렉션 됨

      Pod를 실행하고 있지 않은 노드에도 포트가 할당되며 접근이 가능함.
    - LoadBalancer

      LoadBalancer + NodePort + ClusterIP

      NodePort의 확장된 개념으로 Kubernetes 외부의 Loadbalancer를 이용하여 외부에서 접근하게 해주는 서비스

      외부의 LoadBalancer로 접근시 서비스를 통해 Pod로 리다이렉션함

      CSP(AWS, GCP, Azure) 등에서 지원.

      On-premise 환경에서는 metallb를 사용하여 LoadBalancer 타입의 서비스 오브젝트를 사용할 수 있음.

 

 

 

728x90