Nota:

Utilizza MetalLB con Oracle Cloud Native Environment

Introduzione

I load balancer di rete forniscono un metodo per l'esposizione esterna delle applicazioni Kubernetes. Un servizio LoadBalancer Kubernetes viene utilizzato per creare un load balancer di rete che fornisce ed espone un indirizzo IP esterno che può essere usato per connettersi a un'applicazione dall'esterno del cluster.

MetalLB è un load balancer di rete per le applicazioni Kubernetes distribuite in Oracle Cloud Native Environment in esecuzione su host Bare Metal. MetalLB ti consente di utilizzare i servizi LoadBalancer Kubernetes, che tradizionalmente utilizzano un load balancer di rete di provider cloud, in un ambiente Bare Metal.

Obiettivi

Questo documento descrive come impostare e utilizzare il modulo MetalLB per le applicazioni Kubernetes utilizzando MetalLB con Oracle Cloud Native Environment.

Prerequisiti

In questa sezione sono elencati i sistemi host per eseguire i passi di questa esercitazione. Per avere successo è necessario:

Configura laboratorio

Nota: quando si utilizza l'ambiente di laboratorio gratuito, vedere Oracle Linux Lab Basics per informazioni sulla connessione e altre istruzioni sull'uso.

Questo laboratorio coinvolge più sistemi, ognuno dei quali richiede diverse fasi da eseguire. Si consiglia di iniziare aprendo sette finestre o schede del terminale e collegandosi a ciascun nodo. In questo modo, non dovrai più accedere ed eseguire il logout. I nodi sono:

Importante: l'ambiente di laboratorio gratuito distribuisce un Oracle Cloud Native Environment completamente installato sui nodi forniti. Il completamento di questa distribuzione richiede circa 25-30 minuti dopo l'avvio. Pertanto, potrebbe essere necessario uscire durante l'esecuzione e quindi tornare a completare il laboratorio.

  1. Aprire un terminale e connettersi tramite ssh a ogni nodo.

    ssh oracle@<ip_address_of_ol_node>
    

Verificare l'ambiente Kubernetes

  1. (Su qualsiasi nodo del piano di controllo) Verificare che funzioni kubectl.

    kubectl get nodes
    

    Output di esempio:

    [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 ~]$
    

Configurare i nodi di lavoro

(su tutti il piano di controllo e i nodi di lavoro) Impostare le porte di rete.

sudo firewall-cmd --zone=public --add-port=7946/tcp --permanent
sudo firewall-cmd --zone=public --add-port=7946/udp --permanent
sudo firewall-cmd --reload

Installazione del modulo MetalLB

Installare e convalidare quindi il modulo MetalLB.

Nel nodo ocne-operator:

  1. Creare il file di configurazione MetalLB.

    cat << 'EOF' | tee metallb-config.yaml
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.0.12.240-10.0.12.250
    EOF
    
  2. Visualizzare il contenuto del file di configurazione.

    cat ~/myenvironment.yaml
    
  3. Aggiungere un modulo Helm e MetalLB al file di configurazione di 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. Verificare che i moduli Helm e MetalLB siano stati aggiunti al file myenviroment.yaml.

    cat ~/myenvironment.yaml
    
  5. Creare i moduli.

    olcnectl module create --config-file myenvironment.yaml
    

    Output di esempio:

    [oracle@ocne-operator ~]$ olcnectl module create --config-file myenvironment.yaml
    Modules created successfully.
    Modules created successfully.
    Modules created successfully.
    [oracle@ocne-operator ~]$
    
  6. Convalidare i moduli.

    olcnectl module validate --config-file myenvironment.yaml
    

    Output di esempio:

    [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. Installare i moduli.

    olcnectl module install --config-file myenvironment.yaml
    

    Nota: il completamento di questa operazione può richiedere alcuni minuti.

    Output di esempio:

    [oracle@ocne-operator ~]$ olcnectl module install --config-file myenvironment.yaml
    Modules installed successfully.
    Modules installed successfully.
    Modules installed successfully.
    [oracle@ocne-operator ~]$
    
  8. Visualizzare i moduli installati.

    olcnectl module instances --config-file myenvironment.yaml
    

    Output di esempio:

    [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 ~]$
    

Creare un'applicazione Kubernetes

In questa sezione si crea un'applicazione Kubernetes che utilizza un servizio LoadBalancer.

In qualsiasi nodo del piano di controllo:

  1. Crea un'applicazione 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. Creare il servizio.

    kubectl create -f echo-oci-lb.yml
    

    Output di esempio:

    [oracle@ocne-control01 ~]$ kubectl create -f echo-oci-lb.yml
    deployment.apps/echo-deployment created
    service/echo-lb-service created
    [oracle@ocne-control01 ~]$ 
    
  3. Confermare che la distribuzione Kubernetes è in esecuzione.

    kubectl get deployments
    

    Output di esempio:

    [oracle@ocne-control01 ~]$ kubectl get deployment      
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   2/2     2            2           3m15s
    [oracle@ocne-control01~]$
    
  4. Mostra che il servizio Kubernetes è in esecuzione.

    kubectl get svc
    

    Output di esempio:

    [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 ~]$
    

    Si noti che EXTERNAL-IP per echo-lb-service LoadBalancer ha un indirizzo IP 10.0.12.240. Questo indirizzo IP viene fornito da MetalLB ed è l'indirizzo IP esterno che è possibile utilizzare per connettersi all'applicazione.

Test della distribuzione

Il passo successivo consiste nel test dell'applicazione appena distribuita. Poiché il provisioning del valore EXTERNAL-IP viene eseguito in modo dinamico da MetalLB (in questo scenario compreso nell'intervallo 10.0.12.240-10.0.12.250), i primi due passi memorizzano questo valore dinamico come variabili del sistema operativo.

  1. In qualsiasi nodo del piano di controllo, acquisire l'indirizzo EXTERNAL-IP assegnato.

    LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
    
  2. Acquisire il numero di porta assegnato.

    LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
    
  3. Confermare che sono memorizzate come variabili di ambiente.

    echo $LB
    echo $LBPORT
    

    Output di esempio:

    [oracle@ocne-control01 ~]$ echo $LB
    10.0.12.240
    [oracle@ocne-control01 ~]$ echo $LBPORT
    80
    [oracle@ocne-control01 ~]$
    
  4. Utilizzare curl per connettersi all'applicazione distribuita.

    curl -i -w "\n" $LB:$LBPORT
    

    Output di esempio:

    [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 ~]$
    

Test da un host non Kubernetes

  1. (Su ocne-operator) Questo ultimo test conferma che MetalLB risponde alle richieste esterne.

    curl -v http://10.0.12.240:80
    

    Output di esempio:

    [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 ~]$
    

Ciò conferma che MetalLB è stato configurato correttamente, che un'applicazione è stata distribuita e sta accettando le richieste.

Per ulteriori informazioni

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o visita altri contenuti di formazione gratuiti sul canale Oracle Learning YouTube. Inoltre, visitare education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione sul prodotto, visitare Oracle Help Center.