# Bootstrapping Kubernetes Workers In this lab you will bootstrap 3 Kubernetes worker nodes. The following virtual machines will be used: * worker0 * worker1 * worker2 ## Why Kubernetes worker nodes are responsible for running your containers. All Kubernetes clusters need one or more worker nodes. We are running the worker nodes on dedicated machines for the following reasons: * Ease of deployment and configuration * Avoid mixing arbitrary workloads with critical cluster components. We are building machine with just enough resources so we don't have to worry about wasting resources. Some people would like to run workers and cluster services anywhere in the cluster. This is totally possible, and you'll have to decide what's best for your environment. ## Prerequisites Each worker node will provision a unqiue TLS client certificate as defined in the [kubelet TLS bootstrapping guide](https://kubernetes.io/docs/admin/kubelet-tls-bootstrapping/). The `kubelet-bootstrap` user must be granted permission to request a client TLS certificate. Run the following command on a controller node to enable TLS bootstrapping: Bind the `kubelet-bootstrap` user to the `system:node-bootstrapper` cluster role: ``` kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap ``` ## Provision the Kubernetes Worker Nodes Run the following commands on `worker0`, `worker1`, `worker2`: ``` sudo mkdir -p /var/lib/kubelet ``` ``` sudo mkdir -p /var/lib/kube-proxy ``` ``` sudo mkdir -p /var/run/kubernetes ``` ``` sudo mkdir -p /var/lib/kubernetes ``` ``` sudo mv bootstrap.kubeconfig /var/lib/kubelet ``` ``` sudo mv kube-proxy.kubeconfig /var/lib/kube-proxy ``` Move the TLS certificates in place ``` sudo mv ca.pem /var/lib/kubernetes/ ``` ### Install Docker ``` wget https://get.docker.com/builds/Linux/x86_64/docker-1.12.6.tgz ``` ``` tar -xvf docker-1.12.6.tgz ``` ``` sudo cp docker/docker* /usr/bin/ ``` Create the Docker systemd unit file: ``` cat > docker.service < kubelet.service < kube-proxy.service < Remember to run these steps on `worker0`, `worker1`, and `worker2` ## Approve the TLS certificate requests Each worker node will submit a certificate signing request which must be approved before the node is allowed to join the cluster. Log into one of the controller nodes: ``` gcloud compute ssh controller0 ``` List the pending certificate requests: ``` kubectl get csr ``` ``` NAME AGE REQUESTOR CONDITION csr-XXXXX 1m kubelet-bootstrap Pending ``` > Use the kubectl describe csr command to view the details of a specific signing request. Approve each certificate signing request using the `kubectl certificate approve` command: ``` kubectl certificate approve csr-XXXXX ``` ``` certificatesigningrequest "csr-XXXXX" approved ``` Once all certificate signing requests have been approved all nodes should be registered with the cluster: ``` kubectl get nodes ``` ``` NAME STATUS AGE VERSION worker0 Ready 7m v1.6.0-rc.1 worker1 Ready 5m v1.6.0-rc.1 worker2 Ready 2m v1.6.0-rc.1 ```