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
Jest o wiele prostsza metoda: curl -sfL https://get.k3s.io | sh –
dzięki za info!