Cloud/k8s-CKA

[CKA] 31. service - plugin

jinkwon.kim 2023. 7. 27. 05:37
728x90
반응형

개요

k8s에서 지원하지 않는 service인

LoadBalancer와 ingress를 알아보겠습니다. 

Loadbalancer

목적

NodePort로는 해결할 수 없는 단일 URL를 사용하여 Pod를 외부로 노출하고 싶을 때 사용합니다.

Loadbalancer - Metal Lb 설치

개요

Loadbalancer의 목적은 service에 external ip를 할당하는 것입니다.

여기서 external ip는 어느 곳에서도 사용하지 않으면서 외부와 통신이 가능한 IP여야 합니다. 

그러나 k8s에서는 기본적으로 loadbalancer를 제공하지 않고 있기 때문에 plug-in을 따로 설치해야 합니다.

여러 가지 plugin 중 CNCF에서 제일 유명한 것이 metal lb입니다. 그래서 우리는 이걸 설치할 것입니다.

설치

아래 링크에 나온 순서대로 설치합니다. 

https://metallb.universe.tf/installation/

사전 설정

kubectl edit configmap -n kube-system kube-proxy

and set:

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

manifest를 사용한 설치 

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml

IP 네트워크 대역 설정 및 광고

설치 파일에 설정이 들어 있지 않기 때문에 External IP 대역폭을 설정해줘야 합니다. 

External IP 대역은 외부에서 접속할 IP의 대역을 설정해 줍니다.

주의할 사항은 Exteranl IP의 대역은 Node에 할당된 IP와 겹치면 안 됩니다.

이유: MetalLB는 External IP를 자기가 가지고 있다는 방식을 사용하여 외부를 속이기때문입니다.

 

The installation manifest does not include a configuration file. MetalLB’s components will still start, but will remain idle until you start deploying resources.

IPPOOL 설정

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250 # or 192.168.0.26-192.168.0.26

Announce The Service IPs

LoadBalancer를 L2로 동작하게 합니다. BGP로 동작하게 하려면 공식 문서의 설정을 참고하세요.

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system

Load Balancer service 생성

apiVersion: v1
kind: Service
metadata:
  name: lb-nginx
spec:
  type: LoadBalancer     # 서비스 타입
  ports:
    - targetPort: 80   # pod에서 open한 port
      port: 80         # service에서 open하는 port, 해당 port를 사용해서 외부에서 연결이 가능
  selector:
    app: lb-pod-nginx

Load Balancer로 서비스할 Pod 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: lb-nginx-deployment
  labels:
    app: lb-nginx-deployment
spec:
  replicas: 4
  selector: # Deployment를 이용해 배포할 Pod로 만들 template을 선택 합니다.
    matchLabels:
      app: lb-pod-nginx
  template:
    metadata: # template로 만들 pod를 정의하는것과 동일
      labels:
        app: lb-pod-nginx
    spec:
      containers: #container들을 정의 합니다.
      - name: container-nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

검증 

아래 그림을 보면 service/lb-nginx로 LoadBalancer가 생성된 것을 확인할 수 있습니다.

ingress

목적

Ingress는 cluster 내부 service를 HTTP 및 HTTPS URL사용하여 외부에 노출시키는 역할을 합니다.

routing은 Ingress Resource에 정의된 규칙에 의해 제어됩니다.

구조

ingress를 구성하려면 아래 Cluster 안에 있는 총 4개의 object를 필수로 만들어야 합니다.

IngressController, IngressClass, Ingress, Service

필수 생성 Obejct의 역할

Ingress-controller

routing 규칙을 실제로 구현하고 트래픽을 처리하며, k8s에서 제공하지 않고 plugin으로 설치해야 합니다.

대표 적으로 NGINX Ingress Controller을 주로 사용합니다. 

그 외에 많은 ingress-controller는 아래 링크에서 확인하시면 됩니다. 
https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
 

IngressClass

Ingress-controller와 ingress를 연결하는 역할을 합니다.  Kubernetes 1.18에서 추가가 되었습니다. 

이게 안 맞으면 ingress가 정상동작을 하지 않습니다. 그리고 이 기능 덕분에 k8s 내부에서 다양한 ingress controller를 사용할 수 있습니다.

그리고 해당 Object는 k8s에서 직접 제공합니다.

Ingress

url에 따라 어떠한 service로  routing 할지를 정의합니다. 해당 Object는 k8s에서 직접 제공합니다.

Sevices

어떠한 Pod를 Network에 노출시킬지 정의합니다.

유의 사항

Ingress는 임의의 Port나 Protocol을 노출시키지 않으며 오직 HTTP와 HTTPS 만 노출시킵니다.

HTTP와 HTTPS 이외의 Port나 Protocol을 외부에 노출시키려면 보통 NodePort 또는 LoadBalancer를 사용해야 합니다.

설치 방식

ingress를 설치하는 방식은 NodePort 방식과 LoadBalancer 방식이 존재합니다.

우리는 NodePort 방식부터 LoadBalancer 방식까지 테스트해 보겠습니다. 

설치 순서

유의 사항 : ingress , service, pod는 모두 같은 namespace에 존재해야 정상 동작 합니다 

1. Ingress contoller 설치

2. IngressClass 확인

3. Ingress 생성

4. Service 생성

5. Pod 생성

ingress - NodePort로 설치

Ingress contoller 설치

 site에 가보면 다양한 환경에서 ingress-nginx를 설치하는 방법을 제공합니다.

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

 

Installation Guide - Ingress-Nginx Controller

Installation Guide There are multiple ways to install the Ingress-Nginx Controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,

kubernetes.github.io

우리는 여기서 Bare-metal 방식으로 설치할 것입니다. Bare-metal 방식은 Cloud를 이용하지 않는 곳에서 설치 가능한 방식입니다.

 

아래 한 줄만 실행하면 끝입니다.

현재 버전은  v1.8.1입니다

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/baremetal/deploy.yaml

IngressClass 확인

ingress-controller 설치 파일(deploy.yaml)에서 확인 필요

만약 ingress-controller에 해당 object 에 대한 생성이 없다면 ingress 생성 단계에서 "ingressClassName: nginx" 항목을 제거해야 합니다. 

 

Deployment에서 확인

Deployment -> spec -> template -> spec -> containers -> args

--ingress-class=nginx

IngressClass에서 확인

metadata -> name

ingress 생성

명령어로 생성 

kubectl create ingress nginx-ingress -n default --class=nginx --rule="/ip=ing-ip:80"

상세 설정

모든 host에 대한 설정

apiVersion: networking.k8s.io/v1                 
kind: Ingress                                    
metadata:                                        
  name: nginx-ingress                            
  annotations:                                   
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:                                            
  ingressClassName: nginx                        
  rules:                                         
          
  - http:
      paths:                                     
      - path: "/default"                               
        pathType: Prefix                         
        backend:                                 
          service:                               
            name: ing-default                    
            port:                                
              number: 80                         
      - path: "/ip"                              
        pathType: Prefix                         
        backend:                                 
          service:                               
            name: ing-ip                         
            port:                                
              number: 80

특정 host에 대한 설정

host가 설정되어 있을 경우 http header의 host보고 매칭이 되면 ingress가 동작하게 됩니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-two
  rules:
  - host: "master-test.com"
    http:
      paths:
      - path: "/1"
        pathType: Prefix
        backend:
          service:
            name: ing-default
            port:
              number: 80
      - path: "/ip"
        pathType: Prefix
        backend:
          service:
            name: ing-ip
            port:
              number: 80

service 생성

Service에 연결될 Pod를 직접 생성합니다.

apiVersion: v1
kind: Service
metadata:
  name: ing-default
spec:
  type: ClusterIP      # 서비스 타입
  ports:
    - targetPort: 80   # pod에서 open된 port
      port: 80         # Pod와 연결된 service port
  selector:
    app: ing-default   # Service와 연결될 POD
apiVersion: v1
kind: Service
metadata:
  name: ing-ip
spec:
  type: ClusterIP      # 서비스 타입
  ports:
    - targetPort: 80   # pod에서 open된 port
      port: 80         # Pod와 연결된 service port
  selector:
    app: ing-ip        # Service와 연결될 POD

검증

ingress - LoadBalancer로 설치

Metallb를 설치하였다는 가정하게 진행하겠습니다. 

LoadBalancer 방식으로 동작하게 하는 것은 매우 간단합니다. ingress-controller의 Service 항목에서 type을 LoadBalancer로 변경하면 끝입니다.

아래와 같이 설정을 변경하고 저장합니다.

그러면 ingress-nginx-controller service에 EXTERNAL-IP가 할당된 것을 확인할 수 있습니다.

LoadBalancer를 사용하는 경우

NodePort를 사용하는 경우 

정리

LoadBalancer는 단일 IP를 사용하여 여러 Node에 배포된 동일한 Pod를 외부에 노출하는 기능입니다. L4 Level에서 동작합니다.

Ingress는 Port + URL mapping을 지원하며 URL에 따라서 여러 Pod를 외부에 노출하는 기능입니다. L7 Level에서 동작합니다.

Next Post

[CKA] 32. docker의 image layer관리 (storage driver)

728x90
반응형

'Cloud > k8s-CKA' 카테고리의 다른 글

[CKA] 33. docker의 volume관리 (volume driver)  (0) 2023.08.30
[CKA] 32. docker의 image layer관리 (storage driver)  (0) 2023.08.15
[CKA] 30. CoreDNS  (0) 2023.07.25
[CKA] - network 문제 해결 tip  (0) 2023.07.25
[CKA] 29. service - default  (0) 2023.07.23