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
ingress annotation 설명
kubernetes 네트워크 nodeport, loadbalancer, ingress 차이점 한방 정리
nginx.ingress.kubernetes.io/rewrite-target 설정 설명 (address 뒤에 추가로 붙는 경우)
https://kubernetes.github.io/ingress-nginx/examples/rewrite/
'Kubernetes > 네트워크' 카테고리의 다른 글
Pod의 veth (Virtual Ethernet Interface) 장치 찾기 (0) | 2020.11.07 |
---|---|
Kubernetes Network Policy (0) | 2020.11.07 |
Kubernetes Network (Ingress) (2) | 2020.08.12 |
Kubernetes Network (ClusterIP, NodePort) (0) | 2020.08.09 |
Kuberentes Network 이론 (2) | 2020.08.09 |