$ kubectl create deploy nginx --image=nginx deployment.apps/nginx created
$ kubectl expose deploy nginx --type="NodePort" --port 80 service/nginx exposed
$ kubectl get service nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.99.152.156 <none> 80:32285/TCP 59s
$ kubectl describe service nginx Name: nginx Namespace: default Labels: app=nginx Annotations: <none> Selector: app=nginx Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.99.152.156 IPs: 10.99.152.156 Port: <unset> 80/TCP TargetPort: 80/TCP NodePort: <unset> 32285/TCP Endpoints: 172.16.213.141:80 Session Affinity: None External Traffic Policy: Cluster Events: <none>
$ curl http://127.0.0.1:32285 <!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>
$ kubectl delete svc nginx
service "nginx" deleted
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml namespace/metallb-system created
$ kubectl get ns NAME STATUS AGE 4labs Active 2d4h default Active 5d20h kube-node-lease Active 5d20h kube-public Active 5d20h kube-system Active 5d20h metallb-system Active 9s
$ kubectl describe ns metallb-system Name: metallb-system Labels: app=metallb kubernetes.io/metadata.name=metallb-system Annotations: <none> Status: Active No resource quota. No LimitRange resource.
$ 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-twsxt 1/1 Running 0 52s pod/speaker-2vxhj 1/1 Running 0 53s pod/speaker-tjhck 0/1 Running 0 53s pod/speaker-vx9dt 1/1 Running 0 53s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/speaker 3 3 2 3 2 kubernetes.io/os=linux 53s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/controller 1/1 1 1 53s NAME DESIRED CURRENT READY AGE replicaset.apps/controller-57fd9c5bb 1 1 1 52s
--- apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 177.75.176.43-177.75.176.62
$ kubectl apply -f metallb-config.yaml configmap/config created
$ 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: - 177.75.176.43-177.75.176.62 BinaryData ==== Events: <none>
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 3h39m
$ kubectl create deploy apache --image=httpd deployment.apps/apache created
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE apache 1/1 1 1 71s nginx 1/1 1 1 3h41m
$ kubectl scale deploy nginx --replicas=2 deployment.apps/nginx scaled
$ kubectl scale deploy apache --replicas=2 deployment.apps/apache scaled
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE apache 2/2 2 2 3m9s nginx 2/2 2 2 3h43m
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES apache-6d96f8c8d-rhmrs 1/1 Running 0 4m13s 172.16.101.76 kube-worker-01.juntotelecom.com.br <none> <none> apache-6d96f8c8d-xqcnr 1/1 Running 0 108s 172.16.213.143 kube-worker-02.juntotelecom.com.br <none> <none> nginx-85b98978db-5t5fr 1/1 Running 0 3h44m 172.16.213.141 kube-worker-02.juntotelecom.com.br <none> <none> nginx-85b98978db-mtj4q 1/1 Running 0 114s 172.16.101.77 kube-worker-01.juntotelecom.com.br <none> <none>
$ kubectl expose deploy nginx --type="LoadBalancer" --port 80 --target-port=80 service/nginx exposed
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d20h nginx LoadBalancer 10.108.43.217 177.75.176.43 80:31569/TCP 37s
$ kubectl expose deploy apache --type="LoadBalancer" --port 80 --target-port=80 service/apache exposed
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE apache LoadBalancer 10.96.132.197 177.75.176.44 80:31241/TCP 18s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d20h nginx LoadBalancer 10.108.43.217 177.75.176.43 80:31569/TCP 115s
$ kubectl describe svc nginx Name: nginx Namespace: default Labels: app=nginx Annotations: <none> Selector: app=nginx Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.108.43.217 IPs: 10.108.43.217 LoadBalancer Ingress: 177.75.176.43 Port: <unset> 80/TCP TargetPort: 80/TCP NodePort: <unset> 31569/TCP Endpoints: 172.16.101.77:80,172.16.213.141:80 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal IPAllocated 3m18s metallb-controller Assigned IP ["177.75.176.43"] Normal nodeAssigned 3m17s metallb-speaker announcing from node "kube-worker-02.juntotelecom.com.br"
#!/bin/bash export POD1=$(kubectl get po -o wide | grep nginx | grep kube-worker-01 | awk -F" " '{print $1}') export POD2=$(kubectl get po -o wide | grep nginx | grep kube-worker-02 | awk -F" " '{print $1}') echo 'NGINX NODE 1 - LOAD BALANCER' > /tmp/index.html kubectl cp /tmp/index.html $POD1:/usr/share/nginx/html/ echo 'NGINX NODE 2 - LOAD BALANCER' > /tmp/index.html kubectl cp /tmp/index.html $POD2:/usr/share/nginx/html/
#!/bin/bash export POD1=$(kubectl get po -o wide | grep apache | grep kube-worker-01 | awk -F" " '{print $1}') export POD2=$(kubectl get po -o wide | grep apache | grep kube-worker-02 | awk -F" " '{print $1}') echo 'APACHE NODE 1 - LOAD BALANCER' > /tmp/index.html kubectl cp /tmp/index.html $POD1:/usr/local/apache2/htdocs/ echo 'APACHE NODE 2 - LOAD BALANCER' > /tmp/index.html kubectl cp /tmp/index.html $POD2:/usr/local/apache2/htdocs/
$ bash web-nginx.sh $ bash web-apache.sh
$ for cont in $(seq 1 10); do curl http://177.75.176.43;done NGINX NODE 1 - LOAD BALANCER NGINX NODE 2 - LOAD BALANCER NGINX NODE 1 - LOAD BALANCER NGINX NODE 1 - LOAD BALANCER NGINX NODE 1 - LOAD BALANCER NGINX NODE 2 - LOAD BALANCER NGINX NODE 2 - LOAD BALANCER NGINX NODE 1 - LOAD BALANCER NGINX NODE 2 - LOAD BALANCER NGINX NODE 2 - LOAD BALANCER
$ for cont in $(seq 1 10); do curl http://177.75.176.44;done APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER APACHE NODE 1 - LOAD BALANCER
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE apache LoadBalancer 10.96.132.197 177.75.176.44 80:31241/TCP 19m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d21h nginx LoadBalancer 10.108.43.217 177.75.176.43 80:31569/TCP 21m
$ kubectl patch svc nginx -p '{"spec": {"ports": [{"port": 80}],"type": "NodePort"}}' service/nginx patched
$ kubectl patch svc apache -p '{"spec": {"ports": [{"port": 80}],"type": "NodePort"}}' service/apache patched
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE apache NodePort 10.96.132.197 <none> 80:31241/TCP 20m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d21h nginx NodePort 10.108.43.217 <none> 80:31569/TCP 22m
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/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-7fvl2 0/1 Completed 0 72s pod/ingress-nginx-admission-patch-pl8j8 0/1 Completed 2 72s pod/ingress-nginx-controller-5bf7467b67-j6blh 0/1 Running 0 72s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller NodePort 10.108.43.195 <none> 80:30007/TCP,443:30221/TCP 73s service/ingress-nginx-controller-admission ClusterIP 10.101.226.220 <none> 443/TCP 73s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 0/1 1 0 73s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-5bf7467b67 1 1 0 73s NAME COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create 1/1 20s 73s job.batch/ingress-nginx-admission-patch 1/1 33s 72s
$ kubectl edit svc ingress-nginx-controller -n ingress-nginx
Alterar de:
50 sessionAffinity: None 51 type: NodePort 52 status: 53 loadBalancer: {}
Para:
50 sessionAffinity: None 51 type: LoadBalancer 52 status: 53 loadBalancer: {}
$ kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.108.43.195 177.75.176.43 80:30007/TCP,443:30221/TCP 9m38s ingress-nginx-controller-admission ClusterIP 10.101.226.220 <none> 443/TCP 9m38s
--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-nginx spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: nginx port: number: 80 host: nginx.juntotelecom.com.br
$ kubectl apply -f ingress-nginx.yaml ingress.networking.k8s.io/ingress-nginx created
$ kubectl get ingress ingress-nginx NAME CLASS HOSTS ADDRESS PORTS AGE ingress-nginx <none> nginx.juntotelecom.com.br 80 2m6s
$ kubectl describe ingress ingress-nginx Name: ingress-nginx Labels: <none> Namespace: default Address: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>) Rules: Host Path Backends ---- ---- -------- nginx.juntotelecom.com.br / nginx:80 (172.16.101.77:80,172.16.213.141:80) Annotations: <none> Events: <none>
$ sudo cat /etc/hosts [...] 177.75.176.43 nginx.juntotelecom.com.br 177.75.176.43 apache.juntotelecom.com.br [...]