참고:
- 이 자습서는 Oracle에서 제공하는 무료 실습 환경에서 사용할 수 있습니다.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 마치면 이 값을 클라우드 환경에 고유한 값으로 대체하십시오.
Oracle Cloud Native Environment와 함께 MetalLB 사용
소개
네트워크 로드 밸런서는 Kubernetes 애플리케이션을 외부적으로 노출하는 방법을 제공합니다. Kubernetes LoadBalancer 서비스는 클러스터 외부에서 애플리케이션 연결에 사용할 수 있는 외부 IP 주소를 제공하고 노출하는 네트워크 로드 밸런서를 생성하는 데 사용됩니다.
MetalLB는 베어메탈 호스트에서 실행되는 Oracle Cloud Native Environment에 배포되는 Kubernetes 애플리케이션을 위한 네트워크 로드 밸런서입니다. MetalLB를 사용하면 기존에 베어메탈 환경에서 클라우드 제공자 네트워크 로드 밸런서를 사용하는 Kubernetes LoadBalancer 서비스를 사용할 수 있습니다.
목표
이 문서에서는 MetalLB 모듈을 Oracle Cloud Native Environment와 함께 사용하여 Kubernetes 애플리케이션에 대해 MetalLB 모듈을 설정하고 사용하는 방법을 간략하게 설명합니다.
필요 조건
이 자습서의 단계를 수행할 호스트 시스템이 이 절에 나열되어 있습니다. 성공을 위해서는 다음 조건을 충족해야 합니다.
-
다음과 같이 사용할 7개의 Oracle Linux 시스템:
- 운영자 노드(ocne-operator)
- 3개의 Kubernetes 컨트롤 플레인 노드(ocne-control01, ocne-control02, ocne-control03)
- Kubernetes 작업자 노드 3개(ocne-worker01, ocne-worker02, ocne-worker03)
-
기본 제어 플레인 노드에 대한 가상 IP 주소입니다. 이 IP 주소는 어떤 노드에서도 사용 중이 아니어야 하며, 로드 밸런서에 의해 기본 컨트롤러로 지정된 제어 플레인 노드에 동적으로 지정됩니다.
Oracle Support 면책 조항: Oracle Cloud Infrastructure에 배포하는 경우 테넌시는 OCI: VN(가상 클라우드 네트워크) 내의 VLAN에 대한 계층 2 네트워킹에 도입된 새로운 기능을 활성화해야 합니다. 무료 실습 환경의 테넌시에서 이 기능이 사용으로 설정되어 있지만 OCI 계층 2 네트워킹 기능은 일반적으로 사용할 수 없습니다.
사용 사례가 있는 경우 기술 팀과 협력하여 이 기능을 사용할 수 있도록 테넌시 목록을 가져오십시오. -
각 시스템에는 최소한 다음 항목이 설치되어 있어야 합니다.
- UEK R6(Unbreakable Enterprise Kernel Release 6)를 설치하고 실행하는 최신 Oracle Linux 8(x86_64)
-
이러한 시스템에서 미리 구성된 설정은 다음과 같습니다.
sudo
권한이 있는oracle
사용자 계정- 각 노드 간 암호 없는 SSH
- Oracle Cloud Native Environment 설치 및 구성
실습 환경 설정
주: 무료 실습 환경을 사용하는 경우 연결 및 기타 사용 지침은 Oracle Linux Lab Basics를 참조하십시오.
이 실습에서는 각각 다른 단계를 수행해야 하는 여러 시스템이 포함됩니다. 먼저 7개의 터미널 윈도우 또는 탭을 열고 각 노드에 연결하는 것이 좋습니다. 이렇게 하면 반복적으로 로그인 및 로그아웃할 필요가 없습니다. 노드는 다음과 같습니다.
- ocne-control01
- ocne-control02
- ocne-control03
- ocne-operator
- ocne-worker01
- ocne-worker02
- ocne-worker03
중요: 무료 실습 환경에서는 제공된 노드에 완전히 설치된 Oracle Cloud Native Environment가 배포됩니다. 이 배치는 실행 후 완료되는 데 약 25-30분이 걸립니다. 따라서 이 작업이 실행되는 동안 다른 단계로 진행한 다음 연습으로 돌아갈 수 있습니다.
-
터미널을 열고 ssh를 통해 각 노드에 연결합니다.
ssh oracle@<ip_address_of_ol_node>
Kubernetes 환경 검증
-
(any 제어 플레인 노드에서)
kubectl
가 작동하는지 확인합니다.kubectl get nodes
예제 출력:
[oracle@ocne-control01 ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION ocne-control01 Ready control-plane,master 22m v1.23.7+1.el8 ocne-control02 Ready control-plane,master 21m v1.23.7+1.el8 ocne-control03 Ready control-plane,master 20m v1.23.7+1.el8 ocne-worker01 Ready <none> 20m v1.23.7+1.el8 ocne-worker02 Ready <none> 19m v1.23.7+1.el8 ocne-worker03 Ready <none> 19m v1.23.7+1.el8 [oracle@ocne-control01 ~]$
워커 노드 구성
(모든 제어 플레인 및 작업자 노드에서) 네트워크 포트를 설정합니다.
sudo firewall-cmd --zone=public --add-port=7946/tcp --permanent
sudo firewall-cmd --zone=public --add-port=7946/udp --permanent
sudo firewall-cmd --reload
MetalLB 모듈 설치
그런 다음 MetalLB 모듈을 설치하고 검증합니다.
ocne-operator 노드에서 다음을 수행합니다.
-
MetalLB 구성 파일을 생성합니다.
cat << 'EOF' | tee metallb-config.yaml address-pools: - name: default protocol: layer2 addresses: - 10.0.12.240-10.0.12.250 EOF
-
구성 파일 컨텐츠를 봅니다.
cat ~/myenvironment.yaml
-
Helm 및 MetalLB 모듈을 Oracle Cloud Native Environment 구성 파일에 추가합니다.
cat << 'EOF' | tee -a ~/myenvironment.yaml - module: helm name: myhelm args: helm-kubernetes-module: mycluster - module: metallb name: mymetallb args: metallb-helm-module: myhelm helm-kubernetes-module: mycluster metallb-config: /home/oracle/metallb-config.yaml EOF
-
Helm 및 MetalLB 모듈이 myenviroment.yaml 파일에 추가되었는지 확인합니다.
cat ~/myenvironment.yaml
-
모듈을 만듭니다.
olcnectl module create --config-file myenvironment.yaml
예제 출력:
[oracle@ocne-operator ~]$ olcnectl module create --config-file myenvironment.yaml Modules created successfully. Modules created successfully. Modules created successfully. [oracle@ocne-operator ~]$
-
모듈을 검증합니다.
olcnectl module validate --config-file myenvironment.yaml
예제 출력:
[oracle@ocne-operator ~]$ olcnectl module validate --config-file myenvironment.yaml Validation of module mycluster succeeded. Validation of module myhelm succeeded. Validation of module mymetallb succeeded. [oracle@ocne-operator ~]$
-
모듈을 설치합니다.
olcnectl module install --config-file myenvironment.yaml
주: 이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.
예제 출력:
[oracle@ocne-operator ~]$ olcnectl module install --config-file myenvironment.yaml Modules installed successfully. Modules installed successfully. Modules installed successfully. [oracle@ocne-operator ~]$
-
설치된 모듈을 표시합니다.
olcnectl module instances --config-file myenvironment.yaml
예제 출력:
[oracle@ocne-operator ~]$ olcnectl module instances --config-file myenvironment.yaml INSTANCE MODULE STATE 10.0.12.11:8090 node installed 10.0.12.12:8090 node installed 10.0.12.13:8090 node installed 10.0.12.21:8090 node installed 10.0.12.22:8090 node installed 10.0.12.23:8090 node installed mycluster kubernetes installed myhelm helm installed mymetallb metallb installed [oracle@ocne-operator ~]$
Kubernetes 애플리케이션 생성
이 섹션에서는 LoadBalancer 서비스를 사용하는 Kubernetes 애플리케이션을 생성합니다.
임의 제어 플레인 노드에서:
-
Kubernetes 애플리케이션을 생성합니다.
tee echo-oci-lb.yml > /dev/null << 'EOF' --- apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment labels: app: echo1 spec: replicas: 2 selector: matchLabels: app: echo1 template: metadata: labels: app: echo1 spec: containers: - name: echoserver image: k8s.gcr.io/echoserver:1.4 ports: - containerPort: 80 --- kind: Service apiVersion: v1 metadata: name: echo-lb-service spec: selector: app: echo1 type: LoadBalancer ports: - name: http port: 80 targetPort: 8080 EOF
-
서비스를 만듭니다.
kubectl create -f echo-oci-lb.yml
예제 출력:
[oracle@ocne-control01 ~]$ kubectl create -f echo-oci-lb.yml deployment.apps/echo-deployment created service/echo-lb-service created [oracle@ocne-control01 ~]$
-
Kubernetes 배치가 실행 중인지 확인합니다.
kubectl get deployments
예제 출력:
[oracle@ocne-control01 ~]$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE echo-deployment 2/2 2 2 3m15s [oracle@ocne-control01~]$
-
Kubernetes 서비스가 실행 중인 것을 표시합니다.
kubectl get svc
예제 출력:
[oracle@ocne-control01 ~]$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo-lb-service LoadBalancer 10.111.72.49 10.0.12.240 80:31727/TCP 4m47s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 58m [oracle@ocne-control01 ~]$
echo-lb-service
LoadBalancer에 대한EXTERNAL-IP
의 IP 주소는 10.0.12.240입니다. 이 IP 주소는 MetalLB에서 제공하며 응용 프로그램에 연결하는 데 사용할 수 있는 외부 IP 주소입니다.
배포 테스트
다음 단계는 새로 배치된 응용 프로그램을 테스트하는 것입니다. EXTERNAL-IP
값이 MetalLB(이 시나리오에서는 10.0.12.240-10.0.12.250
범위 사이)에 의해 동적으로 프로비전되므로 처음 두 단계는 이 동적 값을 운영 체제 변수로 저장합니다.
-
(임의 제어 플레인 노드에서) 지정된
EXTERNAL-IP
주소를 캡처합니다.LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
-
지정된 포트 번호를 캡처합니다.
LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
-
이러한 변수가 환경 변수로 저장되어 있는지 확인합니다.
echo $LB echo $LBPORT
예제 출력:
[oracle@ocne-control01 ~]$ echo $LB 10.0.12.240 [oracle@ocne-control01 ~]$ echo $LBPORT 80 [oracle@ocne-control01 ~]$
-
curl
를 사용하여 배치된 애플리케이션에 접속합니다.curl -i -w "\n" $LB:$LBPORT
예제 출력:
[oracle@ocne-control01 ~]$ curl -i -w "\n" $LB:$LBPORT HTTP/1.1 200 OK Server: nginx/1.10.0 Date: Wed, 10 Aug 2022 10:52:10 GMT Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive CLIENT VALUES: client_address=10.244.2.0 command=GET real path=/ query=nil request_version=1.1 request_uri=http://10.0.12.240:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=10.0.12.240 user-agent=curl/7.61.1 BODY: -no body in request- [oracle@ocne-control01 ~]$
비Kubernetes 호스트에서 테스트
-
(ocne-operator에서) 이 마지막 테스트는 MetalLB가 외부 요청에 응답하고 있음을 확인합니다.
curl -v http://10.0.12.240:80
예제 출력:
[oracle@ocne-operator ~]$ curl -v http://10.0.12.240:80 * Rebuilt URL to: http://10.0.12.240:80/ * Trying 10.0.12.240... * TCP_NODELAY set * Connected to 10.0.12.240 (10.0.12.240) port 80 (#0) > GET / HTTP/1.1 > Host: 10.0.12.240 > User-Agent: curl/7.61.1 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.10.0 < Date: Wed, 10 Aug 2022 11:38:08 GMT < Content-Type: text/plain < Transfer-Encoding: chunked < Connection: keep-alive < CLIENT VALUES: client_address=10.244.0.0 command=GET real path=/ query=nil request_version=1.1 request_uri=http://10.0.12.240:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=10.0.12.240 user-agent=curl/7.61.1 BODY: * Connection #0 to host 10.0.12.240 left intact [oracle@ocne-operator ~]$
MetalLB가 올바르게 구성되었고 애플리케이션이 배치되었으며 요청을 성공적으로 수락하고 있음을 확인합니다.
추가 정보
- Oracle Cloud Native Environment 문서
- Oracle Cloud Native Environment 교육
- Oracle Linux 학습 구독
- Oracle Linux 커리큘럼
추가 학습 자원
docs.oracle.com/learn의 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 접근할 수 있습니다. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer로 전환할 수 있습니다.
제품 설명서는 Oracle Help Center를 참조하십시오.
Use MetalLB with Oracle Cloud Native Environment
F61364-03
September 2022
Copyright © 2022, Oracle and/or its affiliates.