Kubernetes Instalação

Vamos aprender a instalar o Kubernetes, e para isso precisaremos do vagrant:

# -*- mode: ruby -*-
# vi: set ft=ruby :

vms = {
  'master' => {'memory' => '2048', 'cpus' => 2, 'ip' => '10', 'provision' => 'master.sh'},
  'node1' => {'memory' => '1024', 'cpus' => 1, 'ip' => '20', 'provision' => 'node.sh'},
  'node2' => {'memory' => '1024', 'cpus' => 1, 'ip' => '30', 'provision' => 'node.sh'},
  'storage' => {'memory' => '512', 'cpus' => 1, 'ip' => '40', 'provision' => 'storage.sh'}
}

Vagrant.configure('2') do |config|

  config.vm.box = 'debian/buster64'
  config.vm.box_check_update = false

  vms.each do |name, conf|
    config.vm.define "#{name}" do |k|
      k.vm.hostname = "#{name}.example.com"
      k.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
      k.vm.provider 'virtualbox' do |vb|
        vb.memory = conf['memory']
        vb.cpus = conf['cpus']
      end
      k.vm.provider 'libvirt' do |lv|
        lv.memory = conf['memory']
        lv.cpus = conf['cpus']
        lv.cputopology :sockets => 1, :cores => conf['cpus'], :threads => '1'
      end
    end
  end

end

Crie um diretório chamado k8s na sua máquina, coloque o conteúdo acima no arquivo Vagrantfile e execute:

vagrant up

Espere as máquinas terminarem de serem criadas, liste-as:

vagrant status

Para acessar as máquinas digite:

vagrant ssh master # ou node1, node2 ...

Docker e Kubernetes

Instale o Docker e os pacotes do Kubernetes nas máquinas master, node1 e node2:

https://docs.docker.com/engine/install/debian/ https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
update-alternatives --set arptables /usr/sbin/arptables-legacy
update-alternatives --set ebtables /usr/sbin/ebtables-legacy

apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common dirmngr vim telnet curl nfs-common
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb https://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list
echo "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

NFS

Instale um servidor NFS na máquina storage:

apt-get update && apt-get install -y nfs-kernel-server

E configure alguns volumes para serem utilizados pelo Kubernetes:

mkdir -p /volumes/v{0,1,2,3,4,5,6,7,8,9}

cat > /etc/exports <<EOF
/volumes/v0 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v1 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v2 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v3 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v4 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v5 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v6 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v7 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v8 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
/volumes/v9 172.27.11.0/24(rw,no_root_squash,no_subtree_check)
EOF

exportfs -a

Configurações Pré-Cluster

Modificar o kubelet em todas as máquinas para escutar na interface correta:

echo "KUBELET_EXTRA_ARGS='--node-ip=172.27.11.10'" > /etc/default/kubelet

Desabilite o swap:

swapoff -a

Garanta que esteja desabilitado no /etc/fstab.

Iniciando o cluster

Inicie a instalação do master, este processo é conhecido como bootstrap:

kubeadm init --apiserver-advertise-address=172.27.11.10 --pod-network-cidr=10.244.0.0/16

Uma vez que o master tenha terminado a inicialização, execute o comando exibido na tela nas máquinas node1 e node2:

# o comando tem a palavra join, cada instalação tem sua própria linha de execução

Configure um plugin de rede

Precisaremos de um plugin de rede para a comunicação entre os pods:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml