| Contiv-VPP Vagrant Installation |
| =============================== |
| |
| Prerequisites |
| ------------- |
| |
| The following items are prerequisites before installing vagrant: - |
| Vagrant 2.0.1 or later - Hypervisors: - VirtualBox 5.2.8 or later - |
| VMWare Fusion 10.1.0 or later or VmWare Workstation 14 - For VmWare |
| Fusion, you will need the `Vagrant VmWare Fusion |
| plugin <https://www.vagrantup.com/vmware/index.html>`__ - Laptop or |
| server with at least 4 CPU cores and 16 Gig of RAM |
| |
| Creating / Shutting Down / Destroying the Cluster |
| ------------------------------------------------- |
| |
| This folder contains the Vagrant file that is used to create a single or |
| multi-node Kubernetes cluster using Contiv-VPP as a Network Plugin. |
| |
| The folder is organized into two subfolders: |
| |
| - (config) - contains the files that share cluster information, which |
| are used during the provisioning stage (master IP address, |
| Certificates, hash-keys). **CAUTION:** Editing is not recommended! |
| - (vagrant) - contains scripts that are used for creating, destroying, |
| rebooting and shutting down the VMs that host the K8s cluster. |
| |
| To create and run a K8s cluster with a *contiv-vpp CNI* plugin, run the |
| ``vagrant-start`` script, located in the `vagrant |
| folder <https://github.com/contiv/vpp/tree/master/vagrant>`__. The |
| ``vagrant-start`` script prompts the user to select the number of worker |
| nodes for the kubernetes cluster. Zero (0) worker nodes mean that a |
| single-node cluster (with one kubernetes master node) will be deployed. |
| |
| Next, the user is prompted to select either the *production environment* |
| or the *development environment*. Instructions on how to build the |
| development *contiv/vpp-vswitch* image can be found below in the |
| `development |
| environment <#building-and-deploying-the-dev-contiv-vswitch-image>`__ |
| command section. |
| |
| The last option asks the user to select either *Without StealTheNIC* or |
| *With StealTheNIC*. Using option *With StealTheNIC* has the plugin |
| “steal” interfaces owned by Linux and uses their configuration in VPP. |
| |
| For the production environment, enter the following commands: |
| |
| :: |
| |
| | => ./vagrant-start |
| Please provide the number of workers for the Kubernetes cluster (0-50) or enter [Q/q] to exit: 1 |
| |
| Please choose Kubernetes environment: |
| 1) Production |
| 2) Development |
| 3) Quit |
| --> 1 |
| You chose Development environment |
| |
| Please choose deployment scenario: |
| 1) Without StealTheNIC |
| 2) With StealTheNIC |
| 3) Quit |
| --> 1 |
| You chose deployment without StealTheNIC |
| |
| Creating a production environment, without STN and 1 worker node(s) |
| |
| For the development environment, enter the following commands: |
| |
| :: |
| |
| | => ./vagrant-start |
| Please provide the number of workers for the Kubernetes cluster (0-50) or enter [Q/q] to exit: 1 |
| |
| Please choose Kubernetes environment: |
| 1) Production |
| 2) Development |
| 3) Quit |
| --> 2 |
| You chose Development environment |
| |
| Please choose deployment scenario: |
| 1) Without StealTheNIC |
| 2) With StealTheNIC |
| 3) Quit |
| --> 1 |
| You chose deployment without StealTheNIC |
| |
| Creating a development environment, without STN and 1 worker node(s) |
| |
| To destroy and clean-up the cluster, run the *vagrant-cleanup* script, |
| located `inside the vagrant |
| folder <https://github.com/contiv/vpp/tree/master/vagrant>`__: |
| |
| :: |
| |
| cd vagrant/ |
| ./vagrant-cleanup |
| |
| To shutdown the cluster, run the *vagrant-shutdown* script, located |
| `inside the vagrant |
| folder <https://github.com/contiv/vpp/tree/master/vagrant>`__: |
| |
| :: |
| |
| cd vagrant/ |
| ./vagrant-shutdown |
| |
| - To reboot the cluster, run the *vagrant-reload* script, located |
| `inside the vagrant |
| folder <https://github.com/contiv/vpp/tree/master/vagrant>`__: |
| |
| :: |
| |
| cd vagrant/ |
| ./vagrant-reload |
| |
| - From a suspended state, or after a reboot of the host machine, the |
| cluster can be brought up by running the *vagrant-up* script. |
| |
| Building and Deploying the dev-contiv-vswitch Image |
| --------------------------------------------------- |
| |
| If you chose the optional development-environment-deployment option, |
| then perform the following instructions on how to build a modified |
| *contivvpp/vswitch* image: |
| |
| - Make sure changes in the code have been saved. From the k8s-master |
| node, build the new *contivvpp/vswitch* image (run as sudo): |
| |
| :: |
| |
| vagrant ssh k8s-master |
| cd /vagrant/config |
| sudo ./save-dev-image |
| |
| - The newly built *contivvpp/vswitch* image is now tagged as *latest*. |
| Verify the build with ``sudo docker images``; the *contivvpp/vswitch* |
| should have been created a few seconds ago. The new image with all |
| the changes must become available to all the nodes in the K8s |
| cluster. To make the changes available to all, load the docker image |
| into the running worker nodes (run as sudo): |
| |
| :: |
| |
| vagrant ssh k8s-worker1 |
| cd /vagrant/config |
| sudo ./load-dev-image |
| |
| - Verify with ``sudo docker images``; the old *contivvpp/vswitch* |
| should now be tagged as ``<none>`` and the latest tagged |
| *contivvpp/vswitch* should have been created a few seconds ago. |
| |
| Exploring the Cluster |
| --------------------- |
| |
| Once the cluster is up, perform the following steps: - Log into the |
| master: |
| |
| :: |
| |
| cd vagrant |
| |
| vagrant ssh k8s-master |
| |
| Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64) |
| |
| * Documentation: https://help.ubuntu.com/ |
| vagrant@k8s-master:~$ |
| |
| - Verify the Kubernetes/Contiv-VPP installation. First, verify the |
| nodes in the cluster: |
| |
| :: |
| |
| vagrant@k8s-master:~$ kubectl get nodes -o wide |
| |
| NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME |
| k8s-master Ready master 22m v1.9.2 <none> Ubuntu 16.04 LTS 4.4.0-21-generic docker://17.12.0-ce |
| k8s-worker1 Ready <none> 15m v1.9.2 <none> Ubuntu 16.04 LTS 4.4.0-21-generic docker://17.12.0-ce |
| |
| - Next, verify that all pods are running correctly: |
| |
| :: |
| |
| vagrant@k8s-master:~$ kubectl get pods -n kube-system -o wide |
| |
| NAME READY STATUS RESTARTS AGE IP NODE |
| contiv-etcd-2ngdc 1/1 Running 0 17m 192.169.1.10 k8s-master |
| contiv-ksr-x7gsq 1/1 Running 3 17m 192.169.1.10 k8s-master |
| contiv-vswitch-9bql6 2/2 Running 0 17m 192.169.1.10 k8s-master |
| contiv-vswitch-hpt2x 2/2 Running 0 10m 192.169.1.11 k8s-worker1 |
| etcd-k8s-master 1/1 Running 0 16m 192.169.1.10 k8s-master |
| kube-apiserver-k8s-master 1/1 Running 0 16m 192.169.1.10 k8s-master |
| kube-controller-manager-k8s-master 1/1 Running 0 15m 192.169.1.10 k8s-master |
| kube-dns-6f4fd4bdf-62rv4 2/3 CrashLoopBackOff 14 17m 10.1.1.2 k8s-master |
| kube-proxy-bvr74 1/1 Running 0 10m 192.169.1.11 k8s-worker1 |
| kube-proxy-v4fzq 1/1 Running 0 17m 192.169.1.10 k8s-master |
| kube-scheduler-k8s-master 1/1 Running 0 16m 192.169.1.10 k8s-master |
| |
| - If you want your pods to be scheduled on both the master and the |
| workers, you have to untaint the master node: |
| |
| :: |
| |
| - Check VPP and its interfaces: |
| |
| :: |
| |
| vagrant@k8s-master:~$ sudo vppctl |
| _______ _ _ _____ ___ |
| __/ __/ _ \ (_)__ | | / / _ \/ _ \ |
| _/ _// // / / / _ \ | |/ / ___/ ___/ |
| /_/ /____(_)_/\___/ |___/_/ /_/ |
| |
| vpp# sh interface |
| Name Idx State Counter Count |
| GigabitEthernet0/8/0 1 up rx packets 14 |
| rx bytes 3906 |
| tx packets 18 |
| tx bytes 2128 |
| drops 3 |
| ip4 13 |
| ... |
| |
| |
| - Make sure that ``GigabitEthernet0/8/0`` is listed and that its status |
| is ``up``. |
| |
| - Next, create an example deployment of nginx pods: |
| |
| :: |
| |
| vagrant@k8s-master:~$ kubectl run nginx --image=nginx --replicas=2 |
| deployment "nginx" created |
| |
| - Check the status of the deployment: |
| |
| :: |
| |
| vagrant@k8s-master:~$ kubectl get deploy -o wide |
| |
| NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR |
| nginx 2 2 2 2 2h nginx nginx run=nginx |
| |
| - Verify that the pods in the deployment are up and running: |
| |
| :: |
| |
| vagrant@k8s-master:~$ kubectl get pods -o wide |
| |
| NAME READY STATUS RESTARTS AGE IP NODE |
| nginx-8586cf59-6kx2m 1/1 Running 1 1h 10.1.2.3 k8s-worker1 |
| nginx-8586cf59-j5vf9 1/1 Running 1 1h 10.1.2.2 k8s-worker1 |
| |
| - Issue an HTTP GET request to a pod in the deployment: |
| |
| :: |
| |
| vagrant@k8s-master:~$ wget 10.1.2.2 |
| |
| --2018-01-19 12:34:08-- http://10.1.2.2/ |
| Connecting to 10.1.2.2:80... connected. |
| HTTP request sent, awaiting response... 200 OK |
| Length: 612 [text/html] |
| Saving to: ‘index.html.1’ |
| |
| index.html.1 100%[=========================================>] 612 --.-KB/s in 0s |
| |
| 2018-01-19 12:34:08 (1.78 MB/s) - ‘index.html.1’ saved [612/612] |
| |
| How to SSH into k8s Worker Node |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| To SSH into k8s Worker Node, perform the following steps: |
| |
| :: |
| |
| cd vagrant |
| |
| vagrant status |
| |
| vagrant ssh k8s-worker1 |