개요
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
우리는 여기서 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
'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 |