# Load Balancer

Usługa Load Balancera pozwala na wystawienie dostępu do aplikacji działającej w klastrze poprzez publiczny adres IP oraz load-balancing ruchu. Load Balancer tworzony jest poprzez zdefiniowanie serwisu w klastrze Kubernetes.

# Tworzenie Load Balancera

Tworzenie Load Balancera odbywa się poprzez definicję serwisu typu LoadBalancer. Na chwilę obecną umożliwiamy utworzenie serwisu z jednym wybranym portem, lub z dwoma dla HTTP(80) i HTTPS(443). Poniżej przedstawiona są minimalne konfiguracja serwisu dla obu przypadków.

# Dowolny port

Tablica ports musi zawierać dokładnie jeden element.

oks-wordpress-lb.yml

apiVersion: v1
kind: Service
metadata:
  name: hello-wordpress-lb
  labels:
    app: hello-wordpress
spec:
  ports:
    - port: 80
  selector:
    app: hello-wordpress
  type: LoadBalancer

Jako selector w tym wypadku użyliśmy nazwy deploymentu pod parametrem app. Będzie to Load Balancer dla Wordpressa zdefiniowanego w Uruchomienie aplikacji.

Tak utworzony plik przekazujemy do kubectl jako konfigurację nowego serwisu:

kubectl apply -f oks-wordpress-lb.yml

Możemy zweryfikować jego działanie komendą:

$ kubectl get svc                                                                                                                       15:08:34 
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes             ClusterIP      10.96.0.1       <none>        443/TCP        9d
hello-wordpress-lb   LoadBalancer   10.99.105.105   <pending>     80:31201/TCP   4s

# HTTP + HTTPS

W poniższej konfiguracji otwierane są dwa porty, dla HTTP i HTTPS.

apiVersion: v1
kind: Service
metadata:
  name: wordpress-lb
  annotations:
    k44sServiceType: HTTP
    k44sSslEnabled: "True"
  labels:
    app: hello-wordpress
spec:
  ports:
  - port: 80
    name: http
    protocol: TCP
  - port: 443
    name: https
    protocol: TCP
  selector:
    app: hello-wordpress
  type: LoadBalancer

# Zaawansowana konfiguracja Load Balancera

Load balancer posiada dodatkowe opcje konfiguracji, dostępne przez wpis w annotations.

# Konfiguracja obsługi SSL

Niektóre przypadki wymagają obsługi dwóch portów w szczególności 80 i 443 dla HTTP i HTTPS. Na taką ewentualność można użyć specjalnego trybu LB. Przykład:

apiVersion: v1
kind: Service
metadata:
  annotations:
    k44sServiceType: HTTP # 1. set LB mode to HTTP
    k44sSslEnabled: "True" # 2. Enable SSL for LB
  labels:
    run: my-nginx
  name: my-nginx
spec:
  ports:
  - port: 80 # 3. define port for HTTP
    name: http
    protocol: TCP
    targetPort: 80
  - port: 443 # define port for HTTPS
    name: https
    protocol: TCP
    targetPort: 443
  selector:
    run: my-nginx

# Session Persistence Type

Dostępne wartości: IP, Cookie, None. Domyślnie: IP.

apiVersion: v1
kind: Service
metadata:
  name: sample-load-balancer
  annotations:
    # Session Persistence type
    k44sSessionPersistenceType: "IP"
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
      name: http

# Load Balancer Algorithm

Dostępne wartości: RoundRobin, LeastConnection, LeastResponseTime, SourceIPHash. Domyślnie: RoundRobin.

...
metadata:
  name: sample-load-balancer
  annotations:
    k44sLoadBalancerAlgorithm: "RoundRobin"
...