#Sätt upp ett kubernetes kluster med kubeadm
Kubernetes (K8s) tillåter oss att automatiskt hantera distributionen och skalning av våra applikationer. Nästan alla molntjänster som Azure, AWS och GCP har sina egna sätt att hantera K8s cluster. Det är oftast ganska dyrt och, om man byter plattform behövs det även ändras en hel del i sin kod.
I denna artikeln skall vi se hur man själv kan sätta upp ett eget self-managed K8s cluster med hjälp av verktyget kubeadm
som fungerar på alla tjänster och gör det billigare i längden.
#Skapa ett Nätverk med master och woker nodes
Vi behöver sätta upp våran infrastruktur själva då kubeadm
inte gör detta åt oss. För att göra detta använder jag mig av az cli
som är azures egna klient (pip install azure-cli
), ni skall göra detta i ansible men häng gärna med för att se vad som skapas. Innan ni använder az
kommandon behöver ni också logga in i klienten: az login
.
Ni kan använda er av samma bas som tidigare men det är två saker som skiljer sig:
- Använd ett ViritualNetwork samt Subnet för alla VM’s.
- Master noden skall ha en
vm_size
motsvarandeStandard_B2s
och workersStandard_B1s
.
Jag börjar med att skapa nätverket.
$ az network vnet create -g {RESOURCE_GROUP} -n KubeVNet --address-prefix 172.0.0.0/16 --subnet-name MySubnet --subnet-prefix 172.0.0.0/24
Nästa steg är nu att skapa en “master node” som kommer att bli våran host till klustret vi skall skapa. På riktigt skulle vi velat ha flera master nodes så att man har minst en backup om denna skulle krascha, men det behöver vi inte tänka på.
Denna virtuella maskinen kräver lite mer kraft så därför uppgraderar vi till Standard_B2s
som har en extra CPU och mer RAM. För att skapa master noden kör vi följande kommando:
$ az vm create -n kube-master -g {RESOURCE_GROUP} --image Debian --size Standard_B2s --storage-sku Standard_LRS --os-disk-size-gb 30 --ssh-key-value /path/to/ssh_key.pub --public-ip-address-dns-name kubeadm-master
Nu kan vi skapa våra workers som är maskinerna vilket kör våra containeriserade applikationer.
Vi vill ha två stycken av dessa då våran applikation inte har så många besökare och det är mest för att testa på, annars är det vanligt att ha ett ojämnt antar noder ca 3-5 stycken per master.
Anledningen till detta är att om man har ett jämnt antal är det mycket lättare att hamna i en situation där nätverket går sönder och 50% av besökarna hamnar på vardera “sida”. Med ett udda antal servrar kan man inte (eller åtminstone lika lätt) ha en situation där mer än en partition i nätverket tycker att den har majoritetskontroll.
Jag skapar nu en worker:
$ az vm create -n kube-worker-1 -g {RESOURCE_GROUP} --image Debian --size Standard_B1s --storage-sku Standard_LRS --os-disk-size-gb 30 --ssh-key-value /path/to/ssh_key.pub --public-ip-address-dns-name kubeadm-worker-1
Jag repeterar kommandot igen, men byter suffixen för -n
och --public-ip-address-dns-name
till -2
. Ni kan nu komma åt dem med ssh $USER@ip
.
#Installera paket och andra beroenden
kubeadm
kräver att alla noder skall ha utvecklingsmiljön installerad för att köras då den inte sätter upp infrastukturen själv.
Vi behöver installera följande på alla våra virtuella maskiner:
$ sudo apt update
$ sudo apt install gnupg software-properties-common docker.io -y
$ sudo systemctl enable docker
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
$ sudo apt update
$ sudo apt install kubeadm -y
Först uppdaterar vi apt
, installerar alla paket och startar docker. Sedan hämtar vi allt som behövs för att både kubectl
och kubeadm
skall fungera.
När allt är installerat hoppar vi tillbaka till master noden och förbereder vårat kluster.
Med kommandot sudo kubeadm init
initierar vi våran master node, när kommandot är klart kommer vi att få en lång output, det vi är intresserade av är de sista raderna som skriver ut ett kommando, mitt ser ut såhär:
kubeadm join 10.0.1.4:6443 --token pp0wxs.uzc32db180qdpcnh \ --discovery-token-ca-cert-hash sha256:56a390a472b58c78a82bbceb535859fdb053a6c94df57331701fe4e3fbe18db8
Denna kommer vi att behöva spara undan och sedan köra på våra workers så att de kan koppla sig till våran master. Men innan vi gör det är det är det ett par steg till.
Först vill vi ändra så att vi slipper köra sudo
när vi skall jobba vidare med våra K8s kommandon:
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
Det andra är att installera en pakethanterare och “network manager addon”.
Som pakethanterare använder vi verktyget helm
, detta kommer främst att underlätta när vi sätter upp våran LoadBalancer och SSL:
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
Network addon managern kommer att hjälpa till med flödet mellan våra noder. Det finns många olika när man jobbar med kubeadm
. Jag väljer att köra på weave
då den är ganska simpel, man bara behöver applicera konfigurationen i kubectl
:
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
När allt är nedladdad och färdigt kan vi köra kubectl get pods -n kube-system
för att kolla så våran network addon är redo. Om allt har status “Running” kan vi börja att koppla våra workers.
NAME READY STATUS RESTARTS AGE coredns-f9fd979d6-6cb8p 1/1 Running 0 2m17s coredns-f9fd979d6-fspvm 1/1 Running 0 2m17s etcd-kube-master 1/1 Running 0 2m18s kube-apiserver-kube-master 1/1 Running 0 2m18s kube-controller-manager-kube-master 1/1 Running 0 2m18s kube-proxy-9xt6k 1/1 Running 0 2m17s kube-scheduler-kube-master 1/1 Running 0 2m17s weave-net-xlh7t 2/2 Running 0 93s
Nu kan vi koppla våra workers till master genom att ssh:a in på dem och köra samma kommando som vi tidigare sparade undan, kör kommandot som en superuser
:
$ sudo kubeadm join 10.0.1.4:6443 --token nzcdja.3w87ie3zzbzd3lf7 \ --discovery-token-ca-cert-hash sha256:f9f342c029417d04e6cd71a9ddbe8ffc7c12da79a5bd614650def56ae351f74b
När det är klart skall ni få ett meddelande liknande:
This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Testa att logga in på eran master nod igen och kör kommandot kubectl get nodes
så skall alla kopplade noder listas:
moc@kube-master:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master Ready master 11m v1.19.4 kube-worker-1 Ready <none> 5m8s v1.19.4 kube-worker-2 Ready <none> 74s v1.19.4
#Avslutningsvis
Nu är allt uppe och redo att köras, det som återstår är att applicera våran K8s kod samt automatisera infrastrukturen med ansible.
Jag kan rekommendera att titta igenom dokumentationen om ni kör fast.
Är ni mer nyfikna finns det också en gratis video-serie där Scott Lowe sätter upp kubeadm
på AWS. Den första videon är relevant då han endast visar samma process med en annan network manager addon och pratar om verktyget fungerar och vad det gör.
Kör på och lycka till!
#Revision history
- 2020-11-27: (A, moc) Skapad inför HT2020.