2년전에 클라우드 분야를 공부할때
AWS에서 EKS를 이용할때는 Nginx-iness-controller배포를하면 LB가 알아서 생겨서 문제가 없었다.
그러나, VM노드로 쿠버네티스를 엮어서 외부로 노출시키려다보니 문제가 생겼었는데
그 당시 MetalLB를 한번 적용해보고 잊고 있었다.
외부 고객사 설치때는 다른 방법을 이용하고 있는데,
궁금해져서 MetalLB를 찾아 다시 적용해보았다.
전에는 이렇게 안했던 것 같은데 바뀐듯하다.
고객사 설치에는 적용할 필요가 없을 것 같다(다른 안정적인 방법적용하고 있음).
MetalLB
MetalLB는 쿠버네티스 클러스터에 연결되어 네트워크 로드 밸런서 구현을 제공합니다. 간단히 말해, 다음과 같은 유형의 쿠버네티스 서비스를 생성할 수 있습니다.LoadBalancer클라우드 공급자에서 실행되지 않는 클러스터에서는 유료 제품에 연결하여 로드 밸런서를 제공할 수 없습니다.
Install
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
Ingress-controller(Nginx) 배포테스트
https://kubernetes.github.io/ingress-nginx/deploy
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.1/deploy/static/provider/cloud/deploy.yaml
service/ingress-nginx-controller의 EXTERNAL-IP값이 <pending>으로 나오는 것이 정상이다.
추가 설정이 필요하다.

MetalLB Config 설정
https://metallb.io/configuration
$ vi metallb-native-config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
namespace: metallb-system
name: my-ip-pool
spec:
addresses:
- 192.168.0.70-192.168.0.75 # 임의 대역 설정
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
namespace: metallb-system
name: my-advertisement
spec: {}
$ kubectl apply metallb-native-config.yaml
가상의 ip가 할당됩니다.

아래 내용은 단순 참고용 자료.
DNS Zone 설정
사설 DNS 서버에 메인 도메인으로 demo.test를 만들어서 테스트 하였다.
$TTL 60
@ IN SOA ns.demo.test. admin.demo.test. (
3 ; Serial
120 ; Refresh
60 ; Retry
2419200 ; Expire
60 ) ; Negative Cache TTL
;
@ IN NS ns.test.
* IN A 192.168.0.70
Sample Pod 배포
ssl secret 생성
- 사설 인증서 생성 과정(https://www.chattiboy.com/how-to-creating-a-self-sign-certificate-trusted-certificate/)
시크릿을 생성합니다.
$ kubectl create secret tls demo-test-ssl --cert fullchain.pem --key demo.test.key
샘플 적용
샘플코드를 알려드리며, 실제 적용된 컨테이너 이미지는 다른 것을 사용 했습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ing-landing
spec:
ingressClassName: nginx
rules:
- host: land.demo.test
http:
paths:
- backend:
service:
name: svc-landing
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- land.demo.test
secretName: demo-test-ssl
---
apiVersion: v1
kind: Service
metadata:
name: svc-landing
spec:
selector:
app: landing
ports:
- protocol: TCP
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dp-landing
spec:
replicas: 1
selector:
matchLabels:
app: landing
template:
metadata:
labels:
app: landing
spec:
containers:
- name : landing
image: nginx:latest
물론 사설 인증서이므로 신뢰할수 있는 인증서 등록은 필수.

