Fork me on GitHub

Herr Knedel/Grandes coisas com contentores: aglomerado Kubenetes e armazenamento NFS

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Sat, 02 Apr 2022 15:42:33 +0000 Nível de dificuldade: Muito desportivo

908 Words

Hoje estou instalando um novo cluster Kubenetes e há muito o que fazer!

Eu encomendei estes componentes para ele:

Vamos lá!

Eu criei minha própria imagem para a instalação com base na instalação Raspian Lite. O meu utilizador/chave pública já está guardado nesta imagem e o ficheiro “/boot/config.txt” foi adaptado para os meus LEDs.

# meine Server brauchen kein HDMI, WLAN und Bluetooth
dtoverlay=disable-bt
dtoverlay=disable-wifi
disable_splash=1
hdmi_blanking=1
hdmi_ignore_hotplug=1
hdmi_ignore_composite=1
 
 
# Status-LEDs an GPIO weiterleiten
dtoverlay=act-led,gpio=21
dtparam=act_led_trigger=cpu0

Servidor 1 - Montagem de disco

Primeiro, eu instalo um serviço NFS no “Server 1”. Este armazenamento pode ser usado mais tarde para o meu conjunto de contentores. Liguei o disco rígido USB ao “Server 1” e formatei-o EXT4 com a ajuda das seguintes instruções: https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/ Depois criei um ponto de montagem para o disco USB:

x
+
Terminal

$ sudo mkdir /media/usb-platte

Eu entrei o novo sistema de arquivo no arquivo “/etc/fstab” da seguinte forma:

/dev/sda1 /media/usb-platte ext4 defaults 0 2

A configuração pode ser verificada com “sudo mount -a”. Agora o disco USB deve ser montado em “/media/usb-disk”.

Instalar NFS

Este pacote é necessário para o NFS:

x
+
Terminal

$ sudo apt-get install nfs-kernel-server -y

Além disso, foi criada uma nova pasta no disco USB

x
+
Terminal

$ sudo mkdir /media/usb-platte/nfsshare
$ sudo chown -R pi:pi /media/usb-platte/nfsshare/
$ sudo find /media/usb-platte/nfsshare/ -type d -exec chmod 755 {} \;
$ sudo find /media/usb-platte/nfsshare/ -type f -exec chmod 644 {} \;

Então o arquivo “/etc/exports” deve ser editado. O caminho, o ID do usuário e o ID do grupo são entrados ali:

/media/usb-platte/nfsshare *(rw,all_squash,insecure,async,no_subtree_check,anonuid=1000,anongid=1000)

Agora a configuração pode ser adotada da seguinte forma.

x
+
Terminal

$ sudo exportfs -ra

Como eu posso montar o NFS?

Eu posso montar o volume da seguinte forma:

x
+
Terminal

$ sudo mount -t nfs SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs

Ou digite permanentemente no arquivo “/etc/fstab”:

SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs/ nfs defaults 0 0

Aqui também, posso usar “sudo mount -a”.

Instalar Kubernetes

Os seguintes comandos devem ser executados no servidor 1, servidor 2 e servidor 3. Primeiro instalamos o Docker e adicionamos o usuário “PI” ao grupo Docker.

x
+
Terminal

$ curl -sSL get.docker.com | sh
$ sudo usermod pi -aG docker

Após isso, a configuração do tamanho do swap é zerada em todos os servidores. Isto significa que eu edito o ficheiro “/etc/dphys-swapfile” e defino o atributo “CONF_SWAPSIZE” para “0”.

Além disso, as configurações do “Control-Group” no arquivo “/boot/cmdline.txt” devem ser ajustadas:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Veja:

Agora todos os Raspberrys devem reiniciar uma vez e estão então prontos para a instalação Kubernetes.

x
+
Terminal

$ sudo reboot

Após a reinicialização, instalo estes pacotes no servidor 1, servidor 2 e servidor 3:
x
+
Terminal

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
$ sudo apt-get update -q && sudo apt-get install -qy kubeadm

# Servidor 1 apenas

Agora o mestre Kubenetes pode ser rubricado.

x
+
Terminal

$ sudo kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16

Após a inicialização bem sucedida, eu aceito as configurações. Lembro-me do comando “kubeadm join” exibido para conectar os nós de trabalhadores.
x
+
Terminal

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

Agora, infelizmente, algo tem de ser feito para a rede.
x
+
Terminal

$ kubectl apply https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
$ sudo systemctl daemon-reload
$ systemctl restart kubelet

O comando “kubectl get nodes” deve agora mostrar o “Mestre” em estado “Pronto”.

Kubernetes - Adicionar nós

Agora precisamos do comando “kubeadm join” da inicialização de Kubenetes. Introduzo este comando em “Servidor 2” e “Servidor 3”.

x
+
Terminal

$ kubeadm join master-ip:port --token r4fddsfjdsjsdfomsfdoi --discovery-token-ca-cert-hash sha256:1adea3bfxfdfddfdfxfdfsdffsfdsdf946da811c27d1807aa

Se eu agora entrar novamente com o comando “kubectl get nodes” do “Server 1”, estes nós são provavelmente exibidos no status “Not Ready”. Aqui, também, há o problema de rede que o mestre também tinha. Eu comando de antes novamente, mas desta vez eu adiciono um “f” de força.
x
+
Terminal

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

Depois disso, vejo todos os nós prontos para uso.

Pequeno teste deplyment (Servidor 1/Kubenetes-Master)

Eu mesmo escrevo um pequeno teste de implantação e verifico as funções. Eu crio um arquivo “nginx.yml” com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
 selector:
   matchLabels:
     run: my-nginx
 replicas: 2
 template:
   metadata:
     labels:
       run: my-nginx
   spec:
     containers:
     - name: my-nginx
       image: nginx
       ports:
       - containerPort: 80

Agora começo a deplorar:

x
+
Terminal

$ kubectl apply -f nginx.yml
$ kubectl rollout status deployment/my-nginx
$ kubectl get deplyments

Grande!

Eu crio um serviço e posso chamar o meu contentor. Aumentei a escala de uma vez para 20 “réplicas”:
x
+
Terminal

$ kubectl scale deployment my-nginx --replicas=0; kubectl scale deployment my-nginx --replicas=20

Veja:

Teste de limpeza deplorável

Para arrumar, eu apago o deplorável e o serviço novamente.

x
+
Terminal

$ kubectl delete service example-service
$ kubectl delete deplyments my-nginx

Veja: