이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/네트워크

Kubernetes Network (LoadBalancer)

이쿠우우 2020. 8. 9. 19:59
반응형

Kubernetes Network (LoadBalancer)

 


Kubernetes Network 관련 글 이동

1. Kuberentes Network 이론
2. Kubernetes Network (ClusterIP, NodePort)
3. Kubernetes Network (LoadBalancer)
4. Kubernetes Network (Ingress)

 


 

 

 

 

참고) 실습환경

 

[Master Node server]

OS = CentOS 7

IP :  192.168.64.150

리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

docker version : 1.13.1

docker api verison : 1.26

 

[Worker Node server]

OS = CentOS 7

IP : 192.168.64.149

리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

docker version : 1.13.1

docker api verison : 1.26

 

[Kubernetes version]

1.18

 

 

 

[예제 환경]

Deployment 

replicaset : 3

1개의 Pod 안에 Tomcat Container 1개 포함

 

Service 1

Deployment에 연결된 clusterIP Type service

 

Service 2

"Service 1" 을 바라보는 LoadBalancer Type service

 

 

 

 


 

 

1. On-Premise 환경에서의 LoadBalancer

AWS, Azure, GCP 와 같은 public cloud 환경에서는 LoadBalancer를 지원하지만

On-Premise 환경에서는 LoadBalancer를 지원하지 않음.

하지만 On-Premise 환경에서도 LoadBalancer Type의 Server를 배포할 수 있게 해주는 도구가 있음

그것이 바로 Metal LB

 

[MetalLB 공식페이지]

metallb.universe.tf/installation/

 

Metal LB을 사용해서 External IP를 할당 받을 수 있음

외부에 연결할 수 있는 IP대역대가 있다면

Metal LB에서 지정한 IP대역대에서 IP를 할당.

 

환경 예)

[Local PC] IP : 192.168.56.1

 - VirtualBox 내부 동적할당 가능 IP 범위 : 10.0.2.2 ~ 200

[VM] Master Node IP : 10.0.2.15

[VM] Worker Node IP : 10.0.2.4

위와 같은 환경이라면

LoadBalancer IP 할당 가능 범위 : 10.0.2.2~200 

 

 

1.1. MetalLB 설치

MetalLB version : v0.8.3 으로 진행

명령어 : kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

 

결과 확인

kubectl get namespace

설치하면 namespace에 Metallb 이 추가됨

kubectl get all -n metallb-system 

명령으로 metallb 동작을 확인해보면

1개의 deployment와 demonset을 확인할 수 있음

demonset의 경우 cluster를 구성하는 node의 수만큼 생성됨

예제에서는 1개의 MasterNode와 1개의 WorkerNode로 구성되어 있으므로

2개의 demonset을 확인할 수 있음

 

참고) MetalLb 삭제 명령

명령어 : kubectl delete -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

1.2 과정까지 했다면 해당 yaml 설정도 삭제해줘야 함

kubectl delete -f metallb_test.yaml

 

 

 

 

1.2. MetalLB 설정 (ConfigMap 배포)

 

예제 yaml 파일 작성

파일 이름 :  metallb_test.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system  # 고정 namespace 값
  name: config               # 고정 name 값 
data:
  config: |
    address-pools:
    - name: my-ip-space
      protocol: layer2
      addresses:
      - 10.0.2.10-10.0.2.200  # address 부분 : 외부로 노출할 수 있는 IP 범위를 명시
                              # 예) master, worker node ip가 10.0.2.0/24 대역이라면 해당 대역으로 설정

명령어 : kubectl apply -f config.yaml

 

 

1.3. LoadBalancer Type의 Service 배포

참고그림

참고) IP대역이 실습환경과 동일하지 않음

 

 

예제 yaml 파일 작성

예제 deployment와 LoadBalancer Type의 Service 가 포함되어 있음

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iksoon-deployment
  labels:
    app: iksoon-tomcat
spec:
  replicas: 3
  selector:
    matchLabels:
      app: iksoon-pod-tomcat
  template:
    metadata:
      labels:
        app: iksoon-pod-tomcat
    spec:
      containers:
      - name: iksoon-tomcat
        image: peksoon/iksoon_tomcat:1.0.3
        ports:
        - containerPort: 8080


---


apiVersion: v1
kind: Service
metadata:
  name: iksoon-tomcat-loadbalancer
  labels:
    name: service-tomcat-loadbalancer
spec:
  type: LoadBalancer
  ports:
  - name: "iksoon-tomcat8-network-setting"
    port: 8088
    protocol: TCP
    targetPort: 8080
  selector:
    app: iksoon-pod-tomcat

명령어 : kubectl apply -f config.yaml

 

결과 확인

kubectl get service

service를 확인해보면 loadbalancer가 생성되어 있고 

External ip 가 metalLB으로 설정했던 ip 대역으로 할당된 것을 확인할 수 있음

참고) external ip 가 할당 안되었다면 pending으로 표시됨

 

 

1.4. 생성된 LoadBalancer를 통해 Pod 접근 확인

 

Virtual Box 포트 포워딩 설정 (VMware 라면 해당 과정 생략하고 바로 10.0.2.10으로 붙을 수 있음)

상위 kubectl get service의 결과인 

EXTERNAL-IP : 10.0.2.10

PORT(S) : 8088

192.168.56.1 : 30003으로 포트포워딩 설정

 

 

참고)

192.168.56.1 

해당 ip는 Local PC의 VirtualBox에 해당하는 ip

 

 

결과 : 정상적으로 접근 가능

http://192.168.56.1:30003/iksoon_test/iksoon_home.jsp

 

 

 

 


[추가 내용] 

 

MetalLB version 0.9.5 version 의 경우는 Service Account도 생성해줘야 정상동작함.

v0.9.5 의 경우 설치 쿼리는 아래와 같음

 

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml

# On first install only

kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

 

 

참고

ingress nginx 공식 문서

https://kubernetes.github.io/ingress-nginx/deploy/

 

ingress 개념 정리

https://www.joyfulbikeshedding.com/blog/2018-03-26-studying-the-kubernetes-ingress-system.html

 

private 환경에서의 ingress 

https://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221502890249

 

ingress 동영상 설명

https://www.youtube.com/watch?v=l42GttmnnZ4

2:22:45 부분이 ingress 설명 부분

 

naver ncloud 예제 문서

https://docs.ncloud.com/ko/nks/nks-1-4.html

 

ibm cloud 문서

https://cloud.ibm.com/docs/containers?topic=containers-ingress

 

loadBalancer 

https://honggg0801.tistory.com/48

 

MatalLB

https://boying-blog.tistory.com/16

https://ssup2.github.io/record/Kubernetes_MetalLB_%EC%84%A4%EC%B9%98_Ubuntu_18.04/

https://teamsmiley.github.io/2018/12/19/kubernetes/

https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

 

on-premise 환경의 ingress

https://zgundam.tistory.com/178

https://medium.com/@futuredon/kubernetes-on-prem-demo-using-gns3-kubespray-nginx-ingress-frr-and-metallb-part-2-4f11ace36c00

https://bryan.wiki/288

 

ingress annotation 설명

https://m.blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221503924911&proxyReferer=https:%2F%2Fwww.google.com%2F

 

kubernetes 네트워크 nodeport, loadbalancer, ingress 차이점 한방 정리

https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html

 

nginx.ingress.kubernetes.io/rewrite-target 설정 설명 (address 뒤에 추가로 붙는 경우)

https://kubernetes.github.io/ingress-nginx/examples/rewrite/

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형