Jak zestawić klaster Kubernetesa na Ubuntu 18.04

Jak zestawić klaster Kubernetesa na Ubuntu 18.04

W tym wpisie pokaże Ci w jaki sposób zestawić klaster Kubernetesa na Ubuntu 18.04. Do tego celu potrzebujemy dwóch maszyn VPS najlepiej w konfiguracji z dwoma CPU oraz 2 GB ram. Pierwszą maszynę nazwijmy master node czyli maszynę która będzie zarządzała klastrem kubernetesa, drugą natomiast nazwijmy worker node czyli maszynę na której będą uruchamiane kontenery.

Instalacja i uruchomienie Dockera (na maszynie master node i na maszynie worker node):

sudo apt-get update
sudo apt install docker.io

Uruchomienie Dockera:

sudo systemctl enable docker 
sudo systemctl start docker
sudo systemctl enable docker.service

Weryfikacja statusu Dockera:

sudo systemctl status docker

Wyłączamy Firewall i Swap (na maszynie master node i na maszynie worker node):

sudo ufw disable
sudo swapoff -a

Instalacja pakietu apt-transport-https (na maszynie master node i na maszynie worker node):

sudo apt-get update && sudo apt-get install -y apt-transport-https

Dodanie klucza publicznego – wymagane do instalacji Kubernetesa (na maszynie master node i na maszynie worker node):

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Dodanie repozytorium Kubernetesa (na maszynie master node i na maszynie worker node):

sudo bash -c 'echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list'

Instalacja Kubernetesa (na maszynie master node i na maszynie worker node):

sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl

Uruchomienie narzędzia kubelet (na maszynie master node i na maszynie worker node):

sudo systemctl enable kubelet
sudo systemctl start kubelet

Utworzenie klastra (tylko na maszynie master node):

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU

podanie parametru –apiserver-advertise-address=master_ip powoduje błąd!

kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=master_ip --ignore-preflight-errors=NumCPU

wynik komendy należy zapisać i wykonać wyłącznie na maszynie worker po konfiguracji CNI:

kubeadm join master_ip:6443 --token linj00.vbruq8id7gmkx6uy \
    --discovery-token-ca-cert-hash sha256:f71db7................187

wynik:

This node has joined the cluster

Skopiowanie pliku konfiguracyjnego:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Konfiguracja CNI:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether fa:16:3e:ce:30:2c brd ff:ff:ff:ff:ff:ff
    inet master_ip/32 scope global dynamic ens3
       valid_lft 85166sec preferred_lft 85166sec
    inet6 fe80::f816:3eff:fece:302c/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:64:18:52:af brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
vi kube-flannel.yml

uzupełniamy sekcję:

args:
      - --ip-masq
      - --kube-subnet-mgr
      - --iface=ens3

odświeżamy konfigurację:

kubectl apply -f kube-flannel.yml

wykonujemy komendę na maszynie worker node:

kubeadm join master_ip:6443 --token linj00.vbruq8id7gmkx6uy \
    --discovery-token-ca-cert-hash sha256:f71db.......5187

weryfikujemy na maszynie master node:

kubectl get nodes

wynik:

NAME           STATUS   ROLES                  AGE   VERSION
vps-41a68b19   Ready    <none>                 65s   v1.20.5
vps-e03951cb   Ready    control-plane,master   25m   v1.20.5

Wdrożenie aplikacji Spring Boot na Kubernetes – (należy posiadać wcześniej utworzony obraz Dockera np. z przykładową aplikacją napisaną z użyciem Spring Boot):

kubectl create deployment app --image=mwarycha/docker-app:latest
kubectl expose deployment app --type=LoadBalancer --name=docker-app --external-ip=1.1.1.1 --port=8080

Można przygotować również plik deploymentu – deployment.yaml opisujący wdrożenie aplikacji:

kubectl create -f deployment.yaml

Poniżej przykład gdzie zdefiniowano 3 repliki aplikacji:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myappdocker
spec:
  selector:
    matchLabels:
      app: myappdocker
  replicas: 3 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: myappdocker
    spec:
      containers:
      - name: myappdocker
        image: mwarycha/docker-app:latest
        ports:
        - containerPort: 8080

Jak działa LoadBalancer jeśli przygotowane są dwie repliki tej samej aplikacji? Jak rozkładany jest ruch na poszczególne pody?

by default kube-proxy in iptables mode choosen a backend at random” czyli domyślnie wybierane są losowe pody. Aby zweryfikować który pod został wybrany można użyć w aplikacji zmiennej środowiskowej:

System.getenv("HOSTNAME")

co pozwoli na wyświetlenie hosta – np. dla danego poda do którego trafił request:

host-85698d8659-hjhf2

ewentualnie można dodać zmienną środowiskową MY_POD_NAME:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myappdocker-host-port
spec:
  selector:
    matchLabels:
      app: myappdocker-host-port
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: myappdocker-host-port
    spec:
      containers:
      - name: myappdocker-host-port
        image: mwarycha/docker-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name

i użyyć tej zmiennej z poziomu kodu aplikacji javovej:

System.getenv("MY_POD_NAME");

otrzymamy wynik podobny do:

host-port-6b766bd886-z4cbs

Przydatne komendy:

kubectl get deployments app
kubectl describe deployments app
kubectl describe rs myapp
kubectl get service
kubectl get all
kubectl describe pods
kubectl describe clusterrole view
kubectl scale deployment myappdocker --replicas 10
kubectl cluster-info
kubectl delete all --all --all-namespaces kubectl get events
kubectl get pods --output=wide
kubectl api-resources | grep deployment
kubectl create clusterrolebinding default-admin --clusterrole cluster-admin --serviceaccount=default:default

2 Comments

  1. Jest o wiele prostsza metoda: curl -sfL https://get.k3s.io | sh –

Leave a comment

Your email address will not be published.


*