Merge pull request #109 from scottslowe/k8s

Add environment for using kubeadm with Vagrant
This commit is contained in:
Scott S. Lowe 2018-04-18 19:20:47 -06:00 committed by GitHub
commit 0445d30798
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 211 additions and 0 deletions

View file

@ -0,0 +1,49 @@
# Local Kubernetes Cluster with Kubeadm
These files were created to allow users to use Vagrant ([http://www.vagrantup.com](http://www.vagrantup.com)) quickly and relatively easily spin up a local Kubernetes cluster that is bootstrapped using `kubeadm`.
## Contents
* **ansible.cfg**: This Ansible configuration file configures Ansible for use with this Vagrant environment. No changes to this file should be necessary.
* **machines.yml**: This YAML file contains a list of VM definitions. It is referenced by `Vagrantfile` when Vagrant instantiates the VMs. You will need to edit this file to provide the correct Vagrant box names. Other edits should not be necessary.
* **provision.yml**: This Ansible playbook configures the VMs with the necessary package repositories, and installs the prerequisite packages. No changes to this file should be necessary.
* **README.md**: This file you're currently reading.
* **Vagrantfile**: This file is used by Vagrant to spin up the virtual machines. This file is fairly extensively commented to help explain what's happening. You should be able to use this file unchanged; all the VM configuration options are stored outside this file.
## Instructions
These instructions assume you've already installed your virtualization provider (VMware Fusion/Workstation or VirtualBox), Vagrant, and any necessary plugins (such as the Vagrant VMware plugin). Please refer to the documentation for those products for more information on installation or configuration.
1. Use `vagrant box add` to install an Ubuntu 16.04 base box. Review `machines.yml` for some suggested boxes for Libvirt, VirtualBox, and the VMware virtualization platforms.
2. If the name of your Ubuntu 16.04 base box is _not_ one of the ones listed in `machines.yml`, edit `machines.yml` to supply the correct box name(s). This file has separate lines for each provider; be sure to edit the correct line for your provider ("lv" is for Libvirt, "vb" is for VirtualBox, and "vmw" is for VMware).
3. Place the files from the `kubernetes/kubeadm-vagrant` directory of this GitHub repository into a directory on your local system. You can clone the entire "learning-tools" repository (using `git clone`) or just download the specific files from the the `kubernetes/kubeadm-vagrant` folder.
4. Run `vagrant up` to instantiate 3 VMs---one manager and two nodes. All the VMs will be running Ubuntu 16.04.
5. Once Vagrant is finished, use `vagrant ssh master` to log into the manager VM.
6. While logged into "master", run the following command to start bootstrapping your Kubernetes cluster:
kubeadm init --apiserver-advertise-address 192.168.100.100 \
--feature-gates CoreDNS=true DynamicKubeletConfig=true \
SelfHosting=true --pod-network-cidr 172.24.0.0/16
7. When the command completes, follow the steps listed to install a configuration file for `kubelet`.
8. Copy the final output of the `kubeadm init` command, which includes a token, to the clipboard. You'll need it later.
9. Install a CNI plugin, such as Calico:
kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
10. Log out and run `vagrant ssh node-01` to log into "node-01". Run the `kubeadm join` command you copied from the output on "master".
11. Repeat step 10, but on "node-02".
Enjoy!

84
kubernetes/kubeadm-vagrant/Vagrantfile vendored Normal file
View file

@ -0,0 +1,84 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Specify minimum Vagrant version and Vagrant API version
Vagrant.require_version '>= 1.6.0'
VAGRANTFILE_API_VERSION = '2'
# Require 'yaml' module
require 'yaml'
# Read YAML file with VM details (box, CPU, RAM, IP addresses)
# Edit machines.yml to change VM configuration details
machines = YAML.load_file(File.join(File.dirname(__FILE__), 'machines.yml'))
# Create and configure the VMs
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Always use Vagrant's default insecure key
config.ssh.insert_key = false
# Iterate through entries in YAML file to create VMs
machines.each do |machine|
# Configure the VMs per details in machines.yml
config.vm.define machine['name'] do |srv|
# Don't check for box updates
srv.vm.box_check_update = false
# Specify the hostname of the VM
srv.vm.hostname = machine['name']
# Specify the Vagrant box to use (use VMware box by default)
srv.vm.box = machine['box']['vmw']
# Configure default synced folder (disable by default)
if machine['sync_disabled'] != nil
srv.vm.synced_folder '.', '/vagrant', disabled: machine['sync_disabled']
else
srv.vm.synced_folder '.', '/vagrant', disabled: true
end #if machine['sync_disabled']
# Iterate through networks as per settings in machines.yml
machine['nics'].each do |net|
if net['ip_addr'] == 'dhcp'
srv.vm.network net['type'], type: net['ip_addr']
else
srv.vm.network net['type'], ip: net['ip_addr']
end # if net['ip_addr']
end # machine['nics'].each
# Configure CPU & RAM per settings in machines.yml (Fusion)
srv.vm.provider 'vmware_fusion' do |vmw|
vmw.vmx['memsize'] = machine['ram']
vmw.vmx['numvcpus'] = machine['vcpu']
if machine['nested'] == true
vmw.vmx['vhv.enable'] = 'TRUE'
end #if machine['nested']
end # srv.vm.provider 'vmware_fusion'
# Configure CPU & RAM per settings in machines.yml (VirtualBox)
srv.vm.provider 'virtualbox' do |vb, override|
vb.memory = machine['ram']
vb.cpus = machine['vcpu']
override.vm.box = machine['box']['vb']
end # srv.vm.provider 'virtualbox'
# Configure CPU & RAM per settings in machines.yml (Libvirt)
srv.vm.provider 'libvirt' do |lv,override|
lv.memory = machine['ram']
lv.cpus = machine['vcpu']
override.vm.box = machine['box']['lv']
if machine['nested'] == true
lv.nested = true
end # if machine['nested']
end # srv.vm.provider 'libvirt'
end # config.vm.define
end # machines.each
# Configure the VM using Ansible
config.vm.provision 'ansible' do |ansible|
ansible.playbook = 'ansible.yml'
end # config.vm.provision
end # Vagrant.configure

View file

@ -0,0 +1,5 @@
[defaults]
inventory = .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
private_key_file = ~/.vagrant.d/insecure_private_key
remote_user = vagrant
host_key_checking = False

View file

@ -0,0 +1,42 @@
---
- hosts: "all"
become: true
remote_user: "vagrant"
gather_facts: false
tasks:
- name: "Install Python"
raw: "apt-get -y -q install python"
- name: "Gather facts"
setup:
- name: "Install Kubernetes APT Key"
apt_key:
url: "https://packages.cloud.google.com/apt/doc/apt-key.gpg"
state: "present"
tags:
- manager
- worker
- name: "Add Kubernetes repository for Ubuntu Xenial"
apt_repository:
repo: "deb http://apt.kubernetes.io/ kubernetes-xenial main"
state: "present"
update_cache: "yes"
tags:
- manager
- worker
- name: "Install packages for Docker and Kubernetes"
apt:
name: "{{ item }}"
state: "present"
with_items:
- "docker.io"
- "kubectl"
- "kubelet"
- "kubeadm"
tags:
- manager
- node

View file

@ -0,0 +1,31 @@
---
- box:
vmw: "generic/ubuntu1604"
vb: "ubuntu/xenial64"
lv: "generic/ubuntu1604"
name: "master"
nics:
- type: "private_network"
ip_addr: "192.168.100.100"
ram: "2048"
vcpu: "1"
- box:
vmw: "generic/ubuntu1604"
vb: "ubuntu/xenial64"
lv: "generic/ubuntu1604"
name: "node-01"
nics:
- type: "private_network"
ip_addr: "192.168.100.101"
ram: "2048"
vcpu: "1"
- box:
vmw: "generic/ubuntu1604"
vb: "ubuntu/xenial64"
lv: "generic/ubuntu1604"
name: "node-02"
nics:
- type: "private_network"
ip_addr: "192.168.100.102"
ram: "2048"
vcpu: "1"