Saturday, December 28, 2019

K8s(kurbernetes 1.17) provisioning with vagrant and kvm(libvirt).

In thie blog post, I will show how to provision k8s 1.17 with vagrant and some shell scripts.

Ubuntu18.04,vagrant and kvm environment.

*First of all, we should install vagrant and libvirt plugin.

oyj@controller:~$ vagrant plugin list
==> vagrant: A new version of Vagrant is available: 2.2.6 (installed version: 2.2.5)!
==> vagrant: To upgrade visit:

vagrant-libvirt (0.0.45, global)

#If we did not install libvirt plugin, install like below.
oyj@controller:~$ vagrant plugin install libvirt
Installing the 'libvirt' plugin. This can take a few minutes...

*Second of all, we should clone git repo that I created recently.

oyj@controller:~$ git clone
Cloning into 'u18kvk8s'...
remote: Enumerating objects: 216, done.
remote: Counting objects: 100% (216/216), done.
remote: Compressing objects: 100% (173/173), done.
remote: Total 216 (delta 36), reused 207 (delta 32), pack-reused 0
Receiving objects: 100% (216/216), 894.49 KiB | 942.00 KiB/s, done.
Resolving deltas: 100% (36/36), done.

*Lastly, just execute

oyj@controller:~$ cd u18kvk8s/k8s/
ooyj@controller:~/u18kvk8s/k8s$ bash
Deleting previous id_rsa
 Generating ssh key for provisionng automatic
 copy id_rsa.put to pub_key
 up master first
Bringing machine 'kubemaster' up with 'libvirt' provider...
==> kubemaster: Checking if box 'centos/7' version '1905.1' is up to date...
==> kubemaster: Creating image (snapshot of base box volume).
==> kubemaster: Creating domain with the following settings...
==> kubemaster:  -- Name:              k8s_kubemaster
==> kubemaster:  -- Domain type:       kvm
==> kubemaster:  -- Cpus:              2
==> kubemaster:  -- Feature:           acpi
==> kubemaster:  -- Feature:           apic
==> kubemaster:  -- Feature:           pae
==> kubemaster:  -- Memory:            2048M
==> kubemaster:  -- Management MAC:   
==> kubemaster:  -- Loader:           
==> kubemaster:  -- Nvram:            
==> kubemaster:  -- Base box:          centos/7
==> kubemaster:  -- Storage pool:      default
==> kubemaster:  -- Image:             /var/lib/libvirt/images/k8s_kubemaster.img (41G)
==> kubemaster:  -- Volume Cache:      default
==> kubemaster:  -- Kernel:           
==> kubemaster:  -- Initrd:           
==> kubemaster:  -- Graphics Type:     vnc
==> kubemaster:  -- Graphics Port:     -1
==> kubemaster:  -- Graphics IP:
==> kubemaster:  -- Graphics Password: Not defined
==> kubemaster:  -- Video Type:        cirrus
==> kubemaster:  -- Video VRAM:        9216
==> kubemaster:  -- Sound Type:   
==> kubemaster:  -- Keymap:            en-us
==> kubemaster:  -- TPM Path:         
==> kubemaster:  -- INPUT:             type=mouse, bus=ps2
==> kubemaster: Creating shared folders metadata...
==> kubemaster: Starting domain.
==> kubemaster: Waiting for domain to get an IP address...
==> kubemaster: Waiting for SSH to become available...

===============omitted..too long ====================

Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
admin_init.log                                100% 4605     7.0MB/s   00:00   
scp admin_inig.log success
Wait until kubemaster ready to accept nodes to join

kubeworker2: Warning: Permanently added '' (ECDSA) to the list of known hosts.
    kubeworker2:  Node will join with master
    kubeworker2: [preflight] Running pre-flight checks
    kubeworker2: W1228 11:31:10.356519    6787 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
    kubeworker2: [preflight] Reading configuration from the cluster...
    kubeworker2: [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
    kubeworker2: [kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" ConfigMap in the kube-system namespace
    kubeworker2: [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    kubeworker2: [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    kubeworker2: [kubelet-start] Starting the kubelet
    kubeworker2: [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
    kubeworker2: This node has joined the cluster:
    kubeworker2: * Certificate signing request was sent to apiserver and a response was received.
    kubeworker2: * The Kubelet was informed of the new secure connection details.
    kubeworker2: Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

* And we can check by logging in kubemaster node.

oyj@controller:~/u18kvk8s/k8s$ vagrant ssh kubemaster
Last login: Sat Dec 28 11:20:50 2019
[vagrant@kubemaster ~]$ kubectl get nodes
kubemaster    Ready    master   14m     v1.17.0
kubeworker1   Ready    <none>   5m34s   v1.17.0
kubeworker2   Ready    <none>   2m48s   v1.17.0

To sum up, we can create k8s environment with vagrant and some shell scripts. Easy!..^^.

Thanks for reading.