An example Vagrantfile that uses vagrant-libvirt is provided to be able to complete the steps below. Modifications will need to be made to use a different Vagrant provider.
cd <path to Vagrantfile>
vagrant up
This step assumes you are still in the same directory as above, so that the built packages are available to the Vagrant guests through the /vagrant
shared directory.
git clone https://github.com/kubernetes/kubernetes
cd kubernetes
git checkout release-1.11
bazel build build/debs:debs
cd ../
cp kubernetes/bazel-bin/build/debs/*.deb ./
vagrant ssh cp1
sudo apt-get install /vagrant/{cri_tools,kubelet,kubectl,kubeadm}.deb
K8S_VERSION=v1.11.0-beta.2
IP_ADDR=$(ip addr show dev ens5 scope global | grep inet | awk '{print $2}' | cut -d '/' -f 1)
cat <<EOF > kubeadm.conf
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: ${K8S_VERSION}
apiServerExtraArgs:
endpoint-reconciler-type: lease
etcd:
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://${IP_ADDR}:2379"
advertise-client-urls: "https://${IP_ADDR}:2379"
listen-peer-urls: "https://${IP_ADDR}:2380"
initial-advertise-peer-urls: "https://${IP_ADDR}:2380"
initial-cluster: "cp1=https://${IP_ADDR}:2380"
serverCertSANs:
- cp1
- ${IP_ADDR}
peerCertSANs:
- cp1
- ${IP_ADDR}
EOF
sudo kubeadm init --config kubeadm.conf
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
mkdir -p /vagrant/cluster-secrets/etcd
sudo cp /etc/kubernetes/pki/{ca,front-proxy-ca}.{crt,key} /vagrant/cluster-secrets/
sudo cp /etc/kubernetes/pki/sa.{key,pub} /vagrant/cluster-secrets/
sudo cp /etc/kubernetes/pki/etcd/ca.{crt,key} /vagrant/cluster-secrets/etcd/
sudo cp /etc/kubernetes/admin.conf /vagrant/cluster-secrets/
exit # exit the cp1 Vagrant host
vagrant ssh cp2
sudo apt-get install /vagrant/{cri_tools,kubelet,kubectl,kubeadm}.deb
sudo mkdir -p /etc/kubernetes/pki/etcd
sudo cp /vagrant/cluster-secrets/etcd/ca.{crt,key} /etc/kubernetes/pki/etcd/
sudo cp /vagrant/cluster-secrets/sa.{key,pub} /etc/kubernetes/pki/
sudo cp /vagrant/cluster-secrets/{ca,front-proxy-ca}.{crt,key} /etc/kubernetes/pki/
CP1_IP_ADDR=$(getent hosts cp1 | awk '{print $1}')
K8S_VERSION=v1.11.0-beta.2
IP_ADDR=$(ip addr show dev ens5 scope global | grep inet | awk '{print $2}' | cut -d '/' -f 1)
cat <<EOF > kubeadm.conf
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: ${K8S_VERSION}
apiServerExtraArgs:
endpoint-reconciler-type: lease
etcd:
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://${IP_ADDR}:2379"
advertise-client-urls: "https://${IP_ADDR}:2379"
listen-peer-urls: "https://${IP_ADDR}:2380"
initial-advertise-peer-urls: "https://${IP_ADDR}:2380"
initial-cluster: "cp1=https://${CP1_IP_ADDR}:2380,cp2=https://${IP_ADDR}:2380"
initial-cluster-state: existing
serverCertSANs:
- cp2
- ${IP_ADDR}
peerCertSANs:
- cp2
- ${IP_ADDR}
EOF
sudo kubeadm alpha phase certs all --config kubeadm.conf
sudo kubeadm alpha phase kubelet config write-to-disk --config kubeadm.conf
sudo kubeadm alpha phase kubelet write-env-file --config kubeadm.conf
sudo kubeadm alpha phase kubeconfig kubelet --config kubeadm.conf
sudo systemctl start kubelet
KUBECONFIG=/vagrant/cluster-secrets/admin.conf kubectl exec -n kube-system etcd-cp1 -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP1_IP_ADDR}:2379 member add cp2 https://${IP_ADDR}:2380
sudo kubeadm alpha phase etcd local --config kubeadm.conf
sudo kubeadm alpha phase kubeconfig all --config kubeadm.conf
sudo kubeadm alpha phase controlplane all --config kubeadm.conf
sudo kubeadm alpha phase mark-master --config kubeadm.conf
exit # exit the cp2 Vagrant host
vagrant ssh cp3
sudo apt-get install /vagrant/{cri_tools,kubelet,kubectl,kubeadm}.deb
sudo mkdir -p /etc/kubernetes/pki/etcd
sudo cp /vagrant/cluster-secrets/etcd/ca.{crt,key} /etc/kubernetes/pki/etcd/
sudo cp /vagrant/cluster-secrets/sa.{key,pub} /etc/kubernetes/pki/
sudo cp /vagrant/cluster-secrets/{ca,front-proxy-ca}.{crt,key} /etc/kubernetes/pki/
CP1_IP_ADDR=$(getent hosts cp1 | awk '{print $1}')
CP2_IP_ADDR=$(getent hosts cp2 | awk '{print $1}')
K8S_VERSION=v1.11.0-beta.2
IP_ADDR=$(ip addr show dev ens5 scope global | grep inet | awk '{print $2}' | cut -d '/' -f 1)
cat <<EOF > kubeadm.conf
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: ${K8S_VERSION}
apiServerExtraArgs:
endpoint-reconciler-type: lease
etcd:
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://${IP_ADDR}:2379"
advertise-client-urls: "https://${IP_ADDR}:2379"
listen-peer-urls: "https://${IP_ADDR}:2380"
initial-advertise-peer-urls: "https://${IP_ADDR}:2380"
initial-cluster: "cp1=https://${CP1_IP_ADDR}:2380,cp2=https://${CP2_IP_ADDR}:2380,cp3=https://${IP_ADDR}:2380"
initial-cluster-state: existing
serverCertSANs:
- cp3
- ${IP_ADDR}
peerCertSANs:
- cp3
- ${IP_ADDR}
EOF
sudo kubeadm alpha phase certs all --config kubeadm.conf
sudo kubeadm alpha phase kubelet config write-to-disk --config kubeadm.conf
sudo kubeadm alpha phase kubelet write-env-file --config kubeadm.conf
sudo kubeadm alpha phase kubeconfig kubelet --config kubeadm.conf
sudo systemctl start kubelet
KUBECONFIG=/vagrant/cluster-secrets/admin.conf kubectl exec -n kube-system etcd-cp1 -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP1_IP_ADDR}:2379 member add cp3 https://${IP_ADDR}:2380
sudo kubeadm alpha phase etcd local --config kubeadm.conf
sudo kubeadm alpha phase kubeconfig all --config kubeadm.conf
sudo kubeadm alpha phase controlplane all --config kubeadm.conf
sudo kubeadm alpha phase mark-master --config kubeadm.conf
exit # exit the cp3 Vagrant host