MetalLB

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
namespace/metallb-system created
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/controller created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
role.rbac.authorization.k8s.io/pod-lister created
role.rbac.authorization.k8s.io/controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
rolebinding.rbac.authorization.k8s.io/pod-lister created
rolebinding.rbac.authorization.k8s.io/controller created
daemonset.apps/speaker created
deployment.apps/controller created
$ kubectl get all -n metallb-system
NAME                             READY   STATUS    RESTARTS   AGE
pod/controller-57fd9c5bb-c8wfp   1/1     Running   0          69s
pod/speaker-dsq8s                1/1     Running   0          69s
pod/speaker-gn8gf                1/1     Running   0          69s
pod/speaker-l6kkc                1/1     Running   0          69s
 
NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   69s
 
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           69s
 
NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-57fd9c5bb   1         1         1       69s
metallb-config.yaml
# vim metallb-config.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 2804:694:3000:8000::50-2804:694:3000:8000::60
$ kubectl describe cm config -n metallb-system
Name:         config
Namespace:    metallb-system
Labels:       <none>
Annotations:  <none>
 
Data
====
config:
----
address-pools:
- name: default
  protocol: layer2
  addresses:
  - 2804:694:3000:8000::50-2804:694:3000:8000::60
 
 
BinaryData
====
 
Events:  <none>
$ kubectl create deploy nginx --image=nginx
deployment.apps/nginx created
$ kubectl expose deploy nginx --cluster-ip='fd00::1' --type="LoadBalancer" --port 80 --target-port=80
service/nginx exposed
$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-dczt5   1/1     Running   0          5m2s
 
NAME                 TYPE           CLUSTER-IP   EXTERNAL-IP              PORT(S)        AGE
service/kubernetes   ClusterIP      10.96.0.1    <none>                   443/TCP        26m
service/nginx        LoadBalancer   fd00::1      2804:694:3000:8000::50   80:31832/TCP   5s
 
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           5m2s
 
NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-85b98978db   1         1         1       5m2s
$ kubectl describe service nginx
Name:                     nginx
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv6
IP:                       fd00::1
IPs:                      fd00::1
LoadBalancer Ingress:     2804:694:3000:8000::50
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31832/TCP
Endpoints:                [1100:200::1334:c75d:e2cb:7ec2]:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason        Age   From                Message
  ----    ------        ----  ----                -------
  Normal  IPAllocated   37s   metallb-controller  Assigned IP ["2804:694:3000:8000::50"]
  Normal  nodeAssigned  37s   metallb-speaker     announcing from node "kube-worker-02.juntotelecom.com.br"
$ curl http://[2804:694:3000:8000::50]:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
 
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
 
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Ingress nginx

$ kubectl patch svc nginx -p '{"spec": {"ports": [{"port": 80}],"type": "NodePort"}}'
$ curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
$ vim deploy.yaml
[...]
321   name: ingress-nginx-controller
322   namespace: ingress-nginx
323 spec:
324   clusterIP: fd00::1 <= ADICIONAR
325   ports:
326   - appProtocol: http
[...]
340   type: LoadBalancer <= Alterar de NodePort para LoadBalancer
---
[...]
351   name: ingress-nginx-controller-admission
352   namespace: ingress-nginx
353 spec:
354   clusterIP: fd00::2 <= ADICIONAR
355   ports:
356   - appProtocol: https
[...]
$ kubectl apply -f deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
$ kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-6nspk        0/1     Completed   0          57s
pod/ingress-nginx-admission-patch-f97d8         0/1     Completed   0          57s
pod/ingress-nginx-controller-7fc8d55869-5gdj4   1/1     Running     0          57s
 
NAME                                         TYPE           CLUSTER-IP   EXTERNAL-IP              PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   fd00::1      2804:694:3000:8000::50   80:32549/TCP,443:31547/TCP   57s
service/ingress-nginx-controller-admission   ClusterIP      fd00::2      <none>                   443/TCP                      57s
 
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           57s
 
NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-7fc8d55869   1         1         1       57s
 
NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           3s         57s
job.batch/ingress-nginx-admission-patch    1/1           3s         57s
$ kubectl create ingress nginx --class=nginx --rule=nginx.juntotelecom.com.br/*=nginx:80 --dry-run=client -o yaml > service.yaml
ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: null
  name: nginx
spec:
  ingressClassName: nginx
  rules:
  - host: nginx.juntotelecom.com.br
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: Prefix
status:
  loadBalancer: {}
$ kubectl apply -f service.yaml
ingress.networking.k8s.io/nginx created
$ kubectl describe ingress nginx
Name:             nginx
Labels:           <none>
Namespace:        default
Address:          177.75.176.42
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                       Path  Backends
  ----                       ----  --------
  nginx.juntotelecom.com.br
                             /   nginx:80 ([1100:200::1334:c75d:e2cb:7ec2]:80)
Annotations:                 <none>
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  Sync    24m (x2 over 25m)  nginx-ingress-controller  Scheduled for sync
$ kubectl get ingress
NAME    CLASS   HOSTS                       ADDRESS         PORTS   AGE
nginx   nginx   nginx.juntotelecom.com.br   177.75.176.42   80      94s
$ echo "2804:694:3000:8000::50  nginx.juntotelecom.com.br       nginx" | sudo tee -a /etc/hosts
$ curl http://nginx.juntotelecom.com.br
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
 
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
 
<p><em>Thank you for using nginx.</em></p>
</body>
</html>