Inicializando os Workers (Nós)
Vamos iniciar três nós worker do Kubernetes. Os seguintes componentes serão instalados em cada nó: runc, gVisor, plug-ins de rede de contêiner, containerd, kubelet e kube-proxy.
Pre Requisitos
for instance in worker-0 worker-1 worker-2; do external_ip=$(aws ec2 describe-instances --filters \ "Name=tag:Name,Values=${instance}" \ "Name=instance-state-name,Values=running" \ --output text --query 'Reservations[].Instances[].PublicIpAddress') echo ssh -i kubernetes.id_rsa ubuntu@$external_ip done
Atenção: Abra 3 janelas novas de shell , se não tiver ambiente gráfico use o TMUX, ou faça uma por vez
Em cada janela nova, o comando acima gerou os comandos ssh para executar em cada janela ssh que irá conetar no worker-0, worker-1 e worker-2
Execute os comandos abaixo em cada uma das janelas:
Provisionando o Worker (Nó)
O binário socat ativa o suporte para o comando kubectl port-forward que iremos usar adiante.
sudo apt update && sudo apt install -y socat conntrack ipset
Baixando os executáveis para o Worker
wget -q --show-progress --https-only --timestamping \ https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.18.0/crictl-v1.18.0-linux-amd64.tar.gz \ https://storage.googleapis.com/kubernetes-the-hard-way/runsc \ https://github.com/opencontainers/runc/releases/download/v1.0.0-rc91/runc.amd64 \ https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz \ https://github.com/containerd/containerd/releases/download/v1.3.6/containerd-1.3.6-linux-amd64.tar.gz \ https://storage.googleapis.com/kubernetes-release/release/v1.18.6/bin/linux/amd64/kubectl \ https://storage.googleapis.com/kubernetes-release/release/v1.18.6/bin/linux/amd64/kube-proxy \ https://storage.googleapis.com/kubernetes-release/release/v1.18.6/bin/linux/amd64/kubelet chmod +x *.tar.gz *.tgz sudo mkdir -p \ /etc/cni/net.d \ /opt/cni/bin \ /var/lib/kubelet \ /var/lib/kube-proxy \ /var/lib/kubernetes \ /var/run/kubernetes chmod +x kubectl kube-proxy kubelet runc.amd64 runsc sudo mv runc.amd64 runc sudo mv kubectl kube-proxy kubelet runc runsc /usr/local/bin/ sudo tar -xvf crictl-v1.18.0-linux-amd64.tar.gz -C /usr/local/bin/ sudo tar -xvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/ sudo tar -xvf containerd-1.3.6-linux-amd64.tar.gz sudo mv bin/* /bin/
Configurando CNI
Recupere o intervalo de pod CIDR para o worker atual:
POD_CIDR=$(curl -s http://169.254.169.254/latest/user-data/ \ | tr "|" "\n" | grep "^pod-cidr" | cut -d"=" -f2) echo "${POD_CIDR}" cat <<EOF | sudo tee /etc/cni/net.d/10-bridge.conf { "cniVersion": "0.3.1", "name": "bridge", "type": "bridge", "bridge": "cnio0", "isGateway": true, "ipMasq": true, "ipam": { "type": "host-local", "ranges": [ [{"subnet": "${POD_CIDR}"}] ], "routes": [{"dst": "0.0.0.0/0"}] } } EOF cat /etc/cni/net.d/10-bridge.conf cat <<EOF | sudo tee /etc/cni/net.d/99-loopback.conf { "cniVersion": "0.3.1", "name": "lo", "type": "loopback" } EOF cat /etc/cni/net.d/99-loopback.conf
Configurando Containerd
sudo mkdir -p /etc/containerd/ cat <<EOF | sudo tee /etc/containerd/config.toml [plugins] [plugins.cri.containerd] snapshotter = "overlayfs" [plugins.cri.containerd.default_runtime] runtime_type = "io.containerd.runtime.v1.linux" runtime_engine = "/usr/local/bin/runc" runtime_root = "" [plugins.cri.containerd.untrusted_workload_runtime] runtime_type = "io.containerd.runtime.v1.linux" runtime_engine = "/usr/local/bin/runsc" runtime_root = "/run/containerd/runsc" EOF cat /etc/containerd/config.toml cat <<EOF | sudo tee /etc/systemd/system/containerd.service [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target [Service] ExecStartPre=/sbin/modprobe overlay ExecStart=/bin/containerd Restart=always RestartSec=5 Delegate=yes KillMode=process OOMScoreAdjust=-999 LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity [Install] WantedBy=multi-user.target EOF
Configurando Kubelet
WORKER_NAME=$(curl -s http://169.254.169.254/latest/user-data/ \ | tr "|" "\n" | grep "^name" | cut -d"=" -f2) echo "${WORKER_NAME}" sudo mv ${WORKER_NAME}-key.pem ${WORKER_NAME}.pem /var/lib/kubelet/ sudo mv ${WORKER_NAME}.kubeconfig /var/lib/kubelet/kubeconfig sudo mv ca.pem /var/lib/kubernetes/ cat <<EOF | sudo tee /var/lib/kubelet/kubelet-config.yaml kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 authentication: anonymous: enabled: false webhook: enabled: true x509: clientCAFile: "/var/lib/kubernetes/ca.pem" authorization: mode: Webhook clusterDomain: "cluster.local" clusterDNS: - "10.32.0.10" podCIDR: "${POD_CIDR}" runtimeRequestTimeout: "15m" tlsCertFile: "/var/lib/kubelet/${WORKER_NAME}.pem" tlsPrivateKeyFile: "/var/lib/kubelet/${WORKER_NAME}-key.pem" resolvConf: "/run/systemd/resolve/resolv.conf" EOF cat /var/lib/kubelet/kubelet-config.yaml cat <<EOF | sudo tee /etc/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/kubernetes/kubernetes After=containerd.service Requires=containerd.service [Service] ExecStart=/usr/local/bin/kubelet \\ --config=/var/lib/kubelet/kubelet-config.yaml \\ --container-runtime=remote \\ --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \\ --image-pull-progress-deadline=2m \\ --kubeconfig=/var/lib/kubelet/kubeconfig \\ --network-plugin=cni \\ --register-node=true \\ --v=2 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF cat /etc/systemd/system/kubelet.service
Configurando Proxy
sudo mv kube-proxy.kubeconfig /var/lib/kube-proxy/kubeconfig cat <<EOF | sudo tee /var/lib/kube-proxy/kube-proxy-config.yaml kind: KubeProxyConfiguration apiVersion: kubeproxy.config.k8s.io/v1alpha1 clientConnection: kubeconfig: "/var/lib/kube-proxy/kubeconfig" mode: "iptables" clusterCIDR: "10.200.0.0/16" EOF cat /var/lib/kube-proxy/kube-proxy-config.yaml cat <<EOF | sudo tee /etc/systemd/system/kube-proxy.service [Unit] Description=Kubernetes Kube Proxy Documentation=https://github.com/kubernetes/kubernetes [Service] ExecStart=/usr/local/bin/kube-proxy \\ --config=/var/lib/kube-proxy/kube-proxy-config.yaml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF cat /etc/systemd/system/kube-proxy.service
Iniciando o Serviço
sudo systemctl daemon-reload sudo systemctl enable containerd kubelet kube-proxy sudo systemctl start containerd kubelet kube-proxy
Atenção: O comando abaixo deve ser executado na sua máquina local Pode fechar as janelas dos workers
Verificando os Workers
external_ip=$(aws ec2 describe-instances --filters \ "Name=tag:Name,Values=controller-0" \ "Name=instance-state-name,Values=running" \ --output text --query 'Reservations[].Instances[].PublicIpAddress') echo "$external_ip" ssh -i kubernetes.id_rsa ubuntu@${external_ip}
kubectl get nodes --kubeconfig admin.kubeconfig exit
Resultado Esperado
NAME STATUS ROLES AGE VERSION ip-10-0-1-20 Ready51s v1.18.6 ip-10-0-1-21 Ready 51s v1.18.6 ip-10-0-1-22 Ready 51s v1.18.6