참고:

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 모듈을 설정하고 사용하는 방법을 간략하게 설명합니다.

필요 조건

이 자습서의 단계를 수행할 호스트 시스템이 이 절에 나열되어 있습니다. 성공을 위해서는 다음 조건을 충족해야 합니다.

실습 환경 설정

주: 무료 실습 환경을 사용하는 경우 연결 및 기타 사용 지침은 Oracle Linux Lab Basics를 참조하십시오.

이 실습에서는 각각 다른 단계를 수행해야 하는 여러 시스템이 포함됩니다. 먼저 7개의 터미널 윈도우 또는 탭을 열고 각 노드에 연결하는 것이 좋습니다. 이렇게 하면 반복적으로 로그인 및 로그아웃할 필요가 없습니다. 노드는 다음과 같습니다.

중요: 무료 실습 환경에서는 제공된 노드에 완전히 설치된 Oracle Cloud Native Environment가 배포됩니다. 이 배치는 실행 후 완료되는 데 약 25-30분이 걸립니다. 따라서 이 작업이 실행되는 동안 다른 단계로 진행한 다음 연습으로 돌아갈 수 있습니다.

  1. 터미널을 열고 ssh를 통해 각 노드에 연결합니다.

    ssh oracle@<ip_address_of_ol_node>
    

Kubernetes 환경 검증

  1. (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 노드에서 다음을 수행합니다.

  1. MetalLB 구성 파일을 생성합니다.

    cat << 'EOF' | tee metallb-config.yaml
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.0.12.240-10.0.12.250
    EOF
    
  2. 구성 파일 컨텐츠를 봅니다.

    cat ~/myenvironment.yaml
    
  3. 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
    
  4. HelmMetalLB 모듈이 myenviroment.yaml 파일에 추가되었는지 확인합니다.

    cat ~/myenvironment.yaml
    
  5. 모듈을 만듭니다.

    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 ~]$
    
  6. 모듈을 검증합니다.

    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 ~]$
    
  7. 모듈을 설치합니다.

    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 ~]$
    
  8. 설치된 모듈을 표시합니다.

    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 애플리케이션을 생성합니다.

임의 제어 플레인 노드에서:

  1. 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
    
  2. 서비스를 만듭니다.

    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 ~]$ 
    
  3. 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~]$
    
  4. 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 범위 사이)에 의해 동적으로 프로비전되므로 처음 두 단계는 이 동적 값을 운영 체제 변수로 저장합니다.

  1. (임의 제어 플레인 노드에서) 지정된 EXTERNAL-IP 주소를 캡처합니다.

    LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
    
  2. 지정된 포트 번호를 캡처합니다.

    LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
    
  3. 이러한 변수가 환경 변수로 저장되어 있는지 확인합니다.

    echo $LB
    echo $LBPORT
    

    예제 출력:

    [oracle@ocne-control01 ~]$ echo $LB
    10.0.12.240
    [oracle@ocne-control01 ~]$ echo $LBPORT
    80
    [oracle@ocne-control01 ~]$
    
  4. 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 호스트에서 테스트

  1. (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가 올바르게 구성되었고 애플리케이션이 배치되었으며 요청을 성공적으로 수락하고 있음을 확인합니다.

추가 정보

추가 학습 자원

docs.oracle.com/learn의 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 접근할 수 있습니다. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer로 전환할 수 있습니다.

제품 설명서는 Oracle Help Center를 참조하십시오.