MetalLB 테스트

2년전에 클라우드 분야를 공부할때
AWS에서 EKS를 이용할때는 Nginx-iness-controller배포를하면 LB가 알아서 생겨서 문제가 없었다.

그러나, VM노드로 쿠버네티스를 엮어서 외부로 노출시키려다보니 문제가 생겼었는데
그 당시 MetalLB를 한번 적용해보고 잊고 있었다.

외부 고객사 설치때는 다른 방법을 이용하고 있는데,
궁금해져서 MetalLB를 찾아 다시 적용해보았다.

전에는 이렇게 안했던 것 같은데 바뀐듯하다.

고객사 설치에는 적용할 필요가 없을 것 같다(다른 안정적인 방법적용하고 있음).

MetalLB

MetalLB는 쿠버네티스 클러스터에 연결되어 네트워크 로드 밸런서 구현을 제공합니다. 간단히 말해, 다음과 같은 유형의 쿠버네티스 서비스를 생성할 수 있습니다.LoadBalancer클라우드 공급자에서 실행되지 않는 클러스터에서는 유료 제품에 연결하여 로드 밸런서를 제공할 수 없습니다.

https://metallb.io/concepts/

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 생성

시크릿을 생성합니다.

$ 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

물론 사설 인증서이므로 신뢰할수 있는 인증서 등록은 필수.