YJWANG

kubernetes ingress 구축 (bare-metal / metallb_layer2) 본문

60.Cloud/80.Kubernetes

kubernetes ingress 구축 (bare-metal / metallb_layer2)

왕영주 2020. 11. 26. 18:04

ingress 구축이 처음이라면 아래 글 부터 따라하시고 오시는 것을 추천드립니다. 제 글입니다..ㅎ
https://yjwang.tistory.com/37

위 페이지의 구성이 돼있다는 전제 하에 진행할 예정입니다. 이번에는 ingress 자체를 분기하기 위해 nodeport가 아닌 Direct로 80 /443에 접근하기 위해 metallb를 사용해볼 예정입니다.

기존 구성대로 할 시 nodeport를 통하지 않고서는 통신되지 않습니다. 이는 controller 서비스가 독립된 network 내에 있어 접근이 불가능 하기 때문입니다. 자세한 설명은 위 링크 포스팅을 참고하시기 바랍니다.

NodePort로 접속
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904/test1 #test1
test1
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904/test2 #test2
test2

80 Port로 접속
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20/test1 #test1
curl: (7) Failed to connect to 10.95.90.20 port 80: Connection refused
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20/test2 #test2
curl: (7) Failed to connect to 10.95.90.20 port 80: Connection refused

따라서 metallb를 사용할 예정이며, metallb로 구성 시 복제된 (replicas) 여러 ingress controller들이 external ip를 갖고 하나의 controller가 요청을 전담하여 수신한 수 분기하게됩니다. (이 구성의 한계점은 병목이 있다는 것이지만.. 논외로 하겠습니다)


MetalLB 설치

사전 설정
kube-proxy를 IPVS mode로 실행하는 경우 strict ARP mode를 enable 해주어야 합니다. (kubernetes v1.14.2 부터 ipvs 사용)
단, cni를 kube-router를 사용하는 경우 default로 strict ARP가 enable이기에 설정하실 필요 없습니다.

calico를 사용 중이므로 설정하겠습니다.

[root@wyj05_deploy_0 ~]# kubectl edit configmap -n kube-system kube-proxy
...
    ipvs:
      excludeCIDRs: []
      minSyncPeriod: 0s
      scheduler: rr
      strictARP: true
...

metalLB 설치

namespace와 metalLB controller , speaker 및 secret을 manifest를 통해 설정합니다.

[root@wyj05_deploy_0 ~]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
namespace/metallb-system created

[root@wyj05_deploy_0 ~]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
podsecuritypolicy.policy/controller created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
role.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
rolebinding.rbac.authorization.k8s.io/pod-lister created
daemonset.apps/speaker created
deployment.apps/controller created

[root@wyj05_deploy_0 ~]# kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
secret/memberlist created

이후 External IP Pool을 담을 configmap을 생성합니다. IP범위는 환경에 맞게 바꿔줍니다.

[root@wyj05_deploy_0 ~]# head -v -z metallb_config.yaml 
==> metallb_config.yaml <==
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.95.90.50-10.95.90.70

[root@wyj05_deploy_0 ~]# kubectl apply -f metallb_config.yaml 
configmap/config created

배포 확인

[root@wyj05_deploy_0 ~]# kubectl get all -n metallb-system 
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-65db86ddc6-ltnpk   1/1     Running   0          9m43s
pod/speaker-9xknk                 1/1     Running   0          9m43s
pod/speaker-h4b9m                 1/1     Running   0          9m43s
pod/speaker-kj5kl                 1/1     Running   0          9m43s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   9m43s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           9m42s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-65db86ddc6   1         1         1       9m43s


[root@wyj05_deploy_0 ~]# kubectl get configmaps -n metallb-system 
NAME     DATA   AGE
config   1      55s

이제 metalLB 설정은 끝났습니다.


nginx-ingress에서 External IP 할당 받기

아래 처럼 ingress-nginx-controller가 NodePort type으로 돼있습니다. 이를 LoadBalancer로 변경해줍니다.

[root@wyj05_deploy_0 ~]# kubectl get svc -n ingress-nginx 
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.233.26.164   <none>        80:30080/TCP,443:30443/TCP   23h
ingress-nginx-controller-admission   ClusterIP   10.233.45.96    <none>        443/TCP                      23h

[root@wyj05_deploy_0 ~]# kubectl edit svc -n ingress-nginx ingress-nginx-controller
...
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  sessionAffinity: None
  type: LoadBalancer
...

이후 확인해보면 ingress-controller에 External IP가 할당됐고 이 Ip도 물론 edit해서 지정할 수 있습니다.

[root@wyj05_deploy_0 ~]# kubectl get svc -n ingress-nginx 
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.233.26.164   10.95.90.50   80:30080/TCP,443:30443/TCP   23h
ingress-nginx-controller-admission   ClusterIP      10.233.45.96    <none>        443/TCP                      23h

Test

정상적으로 동작함을 확인합니다. 작업 완료

[root@wyj05_deploy_0 ~]# curl 10.95.90.50
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

[root@wyj05_deploy_0 ~]# curl 10.95.90.50/test1
test1
[root@wyj05_deploy_0 ~]# curl 10.95.90.50/test2
test2
반응형