System Engineering/Kubernetes

4. K8s Service / Ingress

Hopulence 2021. 3. 30. 14:07
반응형

1. Service

  - Pod에 Access할 수 있는 고정 IP를 할당

  - 할당한 IP와 Port에 따라 트래픽 라우팅

  - selector를 기준으로 Pod에 L4 Load Balancing 기능 제공

  - 고유 DNS Name 지정 가능(?)

    * {service name}.{namespace name}.svc.cluster.local의 형식으로 DNS 등록

  kind: Service
  apiVersion: v1
  metadata:
    name: my-service
  spec:
    selector:
      app: MyApp
    ports:
    - protocol: TCP
      port: 80
      targetPort: 9376  <<< 외부 노출 Port

 

 - Service Type

 1) ClusterIP

 - Service IP 할당의 Default Type

 - K8s Cluster의 내부 IP할당 (외부에서 접근 불가)

  apiVersion: v1
  kind: Service
  metadata:
    name: my-service
  spec:
    sessionAffinity: ClientIP
    selector:
      app: MyApp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
  - name: https
    protocol: TCP
    port: 443
    targetPort: 9377

    *sessionAffinity : Traffic 유입시 특정 컨테이너로 라우팅. 웹세션 등에 사용

 

 2) LoadBalancer

 - Private IP와 Public IP를 동시에 사용

  kind: Service
  apiVersion: v1
  metadata:
    name: my-service
  spec:
    selector:
      app: MyApp
    ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
    clusterIP: 10.20.30.50
    loadBalancerIP: 10.20.30.254
    type: LoadBalancer

 

 3) ExternalName

 - API와 DB 등의 외부 서비스를 K8s Cluster 내부에서 호출할 때 사용

 - 주소를 DNS Name으로 설정해주면 요청을 해당 URI로 포워딩 해준다

  apiVersion: v1
  kind: Service
  metadata:
    name: prod-mongodb
    namespace: prod
  spec:
    type: ExternalName
    externalName: mymongodb.document.azure.com

 

 4) NodePort 

 - Pod의 IP와 고정 Port를 통해 외부로 노출

 

ex) On-Premise의 Load Balacner등의 외부 솔루션을 사용하여 라우팅을 하는 경우

  apiVersion: v1
  kind: Service
  metadata:
    name: node-svc
  spec:
    selector:
      app: hello-node
    type: NodePort
    ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080
      nodePort: 30036

 

 5) Headless service

  - ClusterIP가 없는 Load Balancer로 DNS Name을 통해 Service에 연결된 Pod들의 IP들을 리턴하는 형식으로

       Zookeeper, Etcd, Consul 등과 같은 Service Discovery를 제공한다

  apiVersion: v1
  kind: Service
  metadata:
    name: node-svc-headless
  spec:
    clusterIP: None
    selector:
      app: hello-node
    ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080

 

 6) ExternalIP

  - Service에 고정 IP 할당

  apiVersion: v1
  kind: Service
  metadata:
    name: my-service
  spec:
    selector:
      app: MyApp
    ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
    externIPs:
    - 80.11.12.13

 

2. Ingreess

 - Service에 대한 L7 Load Balnacer로 Path와 URI를 기준으로 라우팅 제공

 

 - L7 Layer로써 URI 별 Service 단위의 Log 수집 용이

  paiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: labs-ingress
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      tls:
      - host:
        - www.evillgenius.com
        scretName: scret-tls
      rules:
      - host: www.evillgenius.com
        http:
          paths:
          - path: /registration/*
            backend:
              serviceName: reg-svc
              servicePort: 8808
          - path: /labaccess/*
            backend:
              serviceName: labaccess-svc
              servicePort: 8809

 

 - TLS Termination에 대한 인증서 정보를 가진 Secret 선언 가능

 - 지정 경로에서 Secret을 가져와서 SSL Termination 수행

  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: hello-ingress-tls
  spec:
    tls:
    - secretName: hello-ingress-secret
    rules:
    - http
      paths:
      - path: /users/*
        backend:
          serviceName: uses-node-svc
          servicePort: 80
        - path: /products/*
          backend:
            serviceName: products-node-svc
            servicePort: 80

  * Secret : 보안이 필요한 Configuration의 저장소

  * API를 외부에 주로 제공한다면 Kong 또는 Ambassador 등의 세밀한 Ingress Controller가 좋다

  * annotation :  일종의 Custom Filed로써, K8s 객체에 데이터 형식이 없는 추가적 Metadata 저장 장소이다

    - 용도

      1) Git Has, TimeStamp, PR Number 등 Label에 적합하지 않은 정보

      2) 객체 Trace

      3) 이미지의 base64 인코딩과 같은 UI Data 제공

      4) Rolling Deployment에서 Roll-out 상태를 Trace하고 Rollback에 필요한 정보 제공

 

3.. Refernece

Kubernetes Advanced Workshop
조대협의 블로그
반응형