251 lines
9.3 KiB
Markdown
251 lines
9.3 KiB
Markdown
|
## 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
|
|||
|
```
|