{"id":535,"date":"2018-10-08T13:34:22","date_gmt":"2018-10-08T13:34:22","guid":{"rendered":"https:\/\/cloudmanagement.navisite.com\/?p=535"},"modified":"2020-01-08T04:28:09","modified_gmt":"2020-01-08T04:28:09","slug":"container-management-how-to-build-a-kubernetes-development-cluster","status":"publish","type":"post","link":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/","title":{"rendered":"Container Management – How to Build a Kubernetes Development Cluster"},"content":{"rendered":"

Introduction<\/h3>\n

Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous delivery(CI\/CD) model for updates to internal service and support systems.
\nAs a Principal Cloud Engineer here at Navisite I thought it would be interesting to put together a test cluster to get an understanding Kubernetes cluster management. It is very handy to be able to spin up a cluster as needed on any desktop machine I might be using to test various aspects of cluster management before applying to a production cluster.
\nThis article focuses on that experience – building a platform for learning container management using a Kubernetes development<\/u><\/em> cluster running on a local machine.
\nI am sharing that experience here for any of our clients who have been thinking about how to get started with understanding containerization. Please reach out to us if you are interested in exploring beyond experimenting with this development cluster, or even if you have questions\/suggestions related to this project.
\nFuture articles will focus on how to deploy Kubernetes production clusters in private and public cloud environments. Read on and have fun building a Kubernetes cluster on your local machine.<\/p>\n

Project Overview<\/h3>\n

Containers have caused a major impact on how cloud-native applications are developed and have some benefits over traditional \u201chypervisor\u201d approach to application deployment. This approach allows for a more reliable way to move software environments from one computing environment to another.
\nA container consists of the entire runtime environment, application and just the resources needed to run it in a single bundled package. This is unlike an application built with standard virtualization practices for which each application typically lives in a VM and runs a single operating system \/ application. \u00a0Here is a visual comparison:
\n\"\"
\n 
\nContainerized applications are much lighter weight (MB rather than GB in size) compared to virtual machines(VMs). A single server can host many more containers than virtual machines.
\nAlternatively, running containers in a VM can also be beneficial as it may allow for less VMs required for the application potentially driving down virtualization licensing costs. This also makes it possible to run containers in cloud environments. In either scenario, container proliferation can quickly become difficult to manage. Kubernetes provides a container-centric management environment to simplify management and deployment.<\/p>\n

Before Getting Started<\/h3>\n

This project is an automated deployment of a Kubernetes multi-node VM cluster installation, for those wanting to get familiar with container orchestration and developing\/deploying containerized applications from a local desktop or laptop.
\nDesigned to run on MacOS, Linux or Windows. Some basic Linux system administration skills are required for this project. Any of the OS platforms will require a user with local administrative privileges to install the required software packages on the local machine where the VMs reside.
\nThe supplied Vagrantfile handles the provisioning of the VMs and uses embedded shell script provisioning for Guest OS, Kubernetes\/Docker deployment. \u00a0While shell scripting is not the most efficient, this method is used to make it easy to modify as opposed to requiring tools like Ansible, SaltStack, Chef, Puppet etc.
\nVariables have been defined for easy modification of the VM configuration parameters to expand the number of worker nodes in the cluster. Note that it is possible to create a Kubernetes multiple master node deployment, it is unnecessary overhead for a development cluster.
\nA note on security \u2013 in a production environment there are a number of security considerations that should be understood before deploying a container environment. These considerations are outside the scope of this project and were not applied here. Security in this environment is as good as the perimeter of the laptop or desktop the VM\u2019s run on and are the responsibility of the user.
\nA high-level architecture drawing is provided in the following figure:<\/p>\n

<\/a>Fig. 1 Architecture Diagram<\/h6>\n

\"\"<\/p>\n

<\/h3>\n

Software Prerequisites<\/h3>\n

On the local machine (Mac OS, Windows or Linux) install the following applications in the order listed below. Follow instructions from the respective websites:<\/p>\n

    \n
  1. Vagrant<\/a> (Deployment tool for building the environment)<\/li>\n
  2. VirtualBox<\/a> (Virtual Machine provider)<\/li>\n
  3. VirtualBox Extensions<\/a> (add on software needed for VirtualBox guests)<\/li>\n
  4. Git<\/a> (utility needed for downloading this project from GitHub)<\/li>\n
  5. Minikube<\/a> (Used for generating a unique token for multi-node cluster build)<\/li>\n<\/ol>\n

    Cluster Installation Overview<\/h3>\n

    This project is intended as a learning tool and should not be considered a production level deployment of Kubernetes<\/em><\/strong>.
    \nThe cluster will be comprised of a Single Master Node with a user defined number of Worker Nodes. All nodes will run the Linux distribution Ubuntu 18.04 (ubuntu\/bionic64) in a VirtualBox Virtual Machine.
    \nBy default \u201cAddon\u201d features Kubernetes Dashboard and Metallb LoadBalancer in conjunction with an NGINX webserver to demonstrate the cluster is working properly after installation.
    \nThe Kubernetes Dashboard is deployed with role based authentication control token authentication. Installation instructions provide commands for accessing the dashboard from the local system the cluster is installed on.
    \nThe default private internal network 172.16.35.0\/24<\/code> will be created and nodes are assigned a static address starting at 172.16.3.100<\/code> for the master. The nodes can be accessed using the upcoming command example when run from the same directory the `vagrant up` command was executed from during installation.
    \nReplace NodeName<\/code> with a VM hostname from
    <\/a>Table 1. List of nodes and IP Addresses<\/p>\n

    [LocalMachine]$ vagrant ssh NodeName<\/pre>\n

    <\/a>Table 1. List of nodes and IP addresses<\/h3>\n

     <\/p>\n\n\n\n\n\n\n
    VM Hostname<\/strong><\/td>\nIP Address<\/strong><\/td>\n<\/tr>\n
    node1<\/td>\n172.16.35.100<\/td>\n<\/tr>\n
    node2<\/td>\n172.16.35.101<\/td>\n<\/tr>\n
    node3<\/td>\n172.16.35.102<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n

    If more than two worker nodes are created the pattern would continue node4<\/code> with ip 172.16.35.104<\/code> and so forth. Note that the nodes \/etc\/ssh\/sshd_config<\/code> file has been modified to allow ssh login via the \u201cprivate network\u201d, the 172.16.35.0<\/code> network.
    \nCluster provisioning scripts for the master and worker nodes are embedded in the Vagrantfile. These are fairly straight forward bash shell scripts: $masterscript<\/code> and $workerscript<\/code>. Check the echo statements in the code to understand the operations.
    \nUser should edit variables as needed. Note: there is a requirement to provide a unique token value for KUBETOKEN<\/code>. Do not skip the Minikube pre-requisite as that is required for generating the token.
    \nCurrently Flannel is the only network overlay the provisioning script provides. If a different network overlay is desired, the embedded $mastershell script can be edited.<\/p>\n

    <\/a>Vagrantfile Customization<\/h2>\n

    “Table 2. Variable Defaults” displays the default values for the variables defined in the Vagrantfile<\/code>. These should be edited as prescribed in “Table 3. Variable Definitions”. For Linux, Mac OS, use a command line text editor like vi<\/code>. For Windows, try Notepad++<\/code>.
    \nIMPORTANT:<\/strong> KUBETOKEN<\/strong><\/code> should be a uniquely generated value using \u201cMinikube\u201d, instructions are provided in the “Table 2. Variable Definitions” section below.
    \nIf making changes to theVM_SUBNET<\/code><\/strong> and NODE_OCTET<\/code><\/strong> values check \u201cAddons\u201d section for other required edits (or the Addons may not work properly)<\/p>\n

    \u00a0<\/a>Table 2. Variable Defaults<\/h3>\n\n\n\n\n\n\n\n\n\n\n\n\n
    Variable<\/strong><\/td>\nDefault Value<\/strong><\/td>\n<\/tr>\n
    KUBETOKEN<\/code><\/strong><\/td>\n\u201c03fe0c.e57e7831b69b2687\u201d\u00a0 \u00a0 Note: replace with unique token from Minikube<\/td>\n<\/tr>\n
    VM_SUBNET<\/code><\/strong><\/td>\n172.16.35.<\/td>\n<\/tr>\n
    NODE_OCTET<\/code><\/strong><\/td>\n100<\/td>\n<\/tr>\n
    MASTER_IP<\/code><\/strong><\/td>\n#{VM_SUBNET}#{NODE_OCTET}<\/td>\n<\/tr>\n
    POD_NTW_CIDR<\/code><\/strong><\/td>\n10.244.0.0\/16<\/td>\n<\/tr>\n
    BOX_IMAGE<\/code><\/strong><\/td>\nubuntu\/bionic64<\/td>\n<\/tr>\n
    NODE_COUNT<\/code><\/strong><\/td>\n2<\/td>\n<\/tr>\n
    CPU<\/code><\/strong><\/td>\n1<\/td>\n<\/tr>\n
    MEMORY<\/code><\/strong><\/td>\n1024<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n

    <\/a>Table 3. Variable Definitions<\/h3>\n\n\n\n\n\n\n\n\n\n\n\n\n
    Variable<\/strong><\/td>\nDefinition<\/strong><\/td>\n<\/tr>\n
    KUBETOKEN<\/code><\/strong><\/td>\nGenerate a unique token Minikube from Cluster Insallation procedure, copy and paste value replacing default value into Vagrantfile.<\/td>\n<\/tr>\n
    VM_SUBNET<\/code><\/strong><\/td>\nDefault is \u201c172.16.35.\u201d . Change accordingly if default creates IP conflict with local machine. Do not overlap with POD_NET_CIDR.<\/td>\n<\/tr>\n
    NODE_OCTET<\/code><\/strong><\/td>\nDefault is 100. The master will get 100 and node1 101, node2 102 etc.<\/td>\n<\/tr>\n
    MASTER_IP<\/code><\/strong><\/td>\nDefault is VM_SUBNET + NODE_OCTET.<\/td>\n<\/tr>\n
    POD_NET_CIDR<\/code><\/strong><\/td>\nDefault is `”10.244.0.0\/16″`. This value is required<\/strong> for Flannel to run<\/td>\n<\/tr>\n
    BOX_IMAGE<\/code><\/strong><\/td>\nDefault is `”ubuntu\/bionic64″`. Changing OS value may require script changes.<\/td>\n<\/tr>\n
    NODE_COUNT<\/code><\/strong><\/td>\nDefault is `2` Set desired number of worker nodes<\/td>\n<\/tr>\n
    CPU<\/code><\/strong><\/td>\nDefault is `1`. Recommend at least `2` if the system has the resources<\/td>\n<\/tr>\n
    MEMORY<\/code><\/strong><\/td>\nDefault is `1`. Recommend at least `2` if the system has the resources<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n

    NOTE: If Changing VM_SUBNET<\/code>, NODE_OCTET<\/code>, be sure to check the \u201cAddons\u201d section as IP changes in the layer2.config-yaml<\/code> configuration file for MetalLB will require edits.<\/p>\n

    <\/a>Cluster Installation Procedure<\/h3>\n
    <\/a>Step 1<\/h5>\n

    KUBETOKEN<\/code> <\/strong>Generate a unique token from the Minikube VM using the following command:<\/p>\n

    [Minikube]$ kubectl token generate token\n04ff0b.e57e683ec69b2587\n<\/pre>\n

    Open a terminal session on the LocalMachine and Download the repository\u00a0https:\/\/github.com\/ecorbett135\/kubernetes-dev-cluster.git\u00a0<\/a><\/p>\n

    [LocalMachine]$ git clone https:\/\/github.com\/ecorbett135\/kubernetes-dev-cluster.git<\/pre>\n
    <\/a>Step 2<\/h5>\n

    Ensure all variables have been edited to desired values and KUBETOKEN<\/code> is a uniquely generated token value.
    \nInstall and configure the cluster from the LocalMachine:<\/p>\n

    [LocalMachine]$ cd kubernetes-dev-cluster\n[LocalMachine]$ vagrant up\n<\/pre>\n

    Once installation completes final line in output will look something like:<\/p>\n

    node2: Run 'kubectl get nodes' on the master to see this node join the cluster.<\/pre>\n
    <\/a>Step 3<\/h5>\n

    Login using ssh with port forward, check node status, start proxy and get dashboard token (copy to paste into web browser)
    \nWindows Hint: Git comes with a bash shell
    \nGeneral Hint:\u00a0 vagrant<\/code> user password is vagrant<\/code>. Change it using the passwd<\/code> command from within the VM)<\/p>\n

    [LocalMachine]$ ssh -L 8001:127.0.0.1:8001 vagrant@172.16.35.100\n[master]$ kubectl -n kube-system get nodes\nNAME      STATUS    ROLES     AGE       VERSION\nmaster    Ready     master    28m       v1.11.2\nnode1     Ready     <none>    27m       v1.11.2\nnode2     Ready     <none>    26m       v1.11.2\n<\/pre>\n
    [master]$ kubectl -n kube-system describe secret $(ks get secret | awk '\/^admin-user\/{print $1}') | awk '$1==\"token:\"{print $2}'\neyJhbGciOiJSUzI1NiIsImwpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXg2OTR2Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI3Y2F1MjJjZi1iNDZkLTExZTgtOWZkMS0wMjJmNjJjZDllMjIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.PCGqgoVvJSFk8hP447cAi6VsLtvbQa_UxhdijdBK6P6i2TOfSzmTShI2gIyUGVOIiLp8RhbjbiZ_m9Cpi404dw5zKhjGcgUOUj-KpgpDgIDiO1GFeE6EHkrmni_ig0vbMF5AEemvtCdp6VS8sNqP6t-LatV-AL4S-K1i_N79wcpOCiIzdtD0itoXspz63hDt4zvRhGmLhAGIDPqT_8H79eOdxEkIjb-LmHJg6yvp0ApSCBGDJJRgDLRaP_xS0m913EbPIK6O6gGB2zER0JB7nMdYxHByDJwKZwoZZjHp6h42f53CjKp9pjTXcufjMLyIcV80ui76PPrrB3VoWHlLQ\n<\/pre>\n

    <\/a>Step 4<\/h4>\n

    Copy the kubectl describe secret<\/code> output to the clipboard in the previous step
    \nFrom local machine VM’s are running on enter the following url or click below:
    \n
    https:\/\/127.0.0.1:8001\/api\/v1\/namespaces\/kube-system\/services\/https:kubernetes-dashboard:\/proxy\/<\/a>
    \nNow select TOKEN<\/code> <\/strong>radial button and past token copied from terminal session on the provided line.<\/p>\n

    \u00a0<\/a>\u00a0Cluster Administration Tips<\/h3>\n

    Note that the master node vagrant user .bashrc is configured with some aliases:<\/p>\n

    alias kc='kubectl'\nalias kcw='kubectl -o wide'\nalias ks='kubectl -n kube-system'\nalias ksw='kubectl -n kube-system -o wide'\n<\/pre>\n

    These are shortcuts to increase efficiency for example, instead of the following command:<\/p>\n

    [master]$ kubectl -n kube-system get nodes\nNAME      STATUS    ROLES     AGE       VERSION\nmaster    Ready     master    28m       v1.11.2\nnode1     Ready     <none>    27m       v1.11.2\nnode2     Ready     <none>    26m       v1.11.2\nnode3     Ready     <none>    24m       v1.11.2\n<\/pre>\n

    use the ks<\/code> alias:<\/p>\n

    [master]$ ks get nodes\nNAME      STATUS    ROLES     AGE       VERSION\nmaster    Ready     master    28m       v1.11.2\nnode1     Ready     <none>    27m       v1.11.2\nnode2     Ready     <none>    26m       v1.11.2\nnode3     Ready     <none>    24m       v1.11.2\n<\/pre>\n
    Stopping and Restarting the Cluster<\/h5>\n

    It is important to note that the VM management should be done with Vagrant. This is because a vm.synced_folder<\/code> option is used in the Vagrant file and this folder will not mount properly to the VMs if they are managed from the<\/p>\n

      \n
    1. To stop the cluster, use the command vagrant halt<\/code> from the local machine from with the directory the cluster was deployed:<\/li>\n<\/ol>\n
      [LocalMachine]$ vagrant halt\n==> node2: Attempting graceful shutdown of VM...\n==> node1: Attempting graceful shutdown of VM...\n==> master: Attempting graceful shutdown of VM...\n<\/pre>\n

      2. To start the cluster run vagrant up<\/code> from the local machine from with the directory the cluster was deployed:<\/p>\n

      [LocalMachine]$ vagrant up\nBringing machine 'master' up with 'virtualbox' provider...\nBringing machine 'node1' up with 'virtualbox' provider...\nBringing machine 'node2' up with 'virtualbox' provider...\nBringing machine 'node3' up with 'virtualbox' provider...\n==> master: Checking if box 'ubuntu\/bionic64' is up to date...\n==> master: Clearing any previously set forwarded ports...\n==> master: Clearing any previously set network interfaces...\n==> master: Preparing network interfaces based on configuration...\n    master: Adapter 1: nat\n    master: Adapter 2: hostonly\n==> master: Forwarding ports...\n    master: 22 (guest) => 2222 (host) (adapter 1)\n==> master: Running 'pre-boot' VM customizations...\n==> master: Booting VM...\n==> master: Waiting for machine to boot. This may take a few minutes...\n    master: SSH address: 127.0.0.1:2222\n    master: SSH username: vagrant\n    master: SSH auth method: private key\n    master: Warning: Connection reset. Retrying...\n    master: Warning: Remote connection disconnect. Retrying...\n    master: Warning: Connection reset. Retrying...\n==> master: Machine booted and ready!\n==> master: Checking for guest additions in VM...\n==> master: Setting hostname...\n==> master: Configuring and enabling network interfaces...\n==> master: Mounting shared folders...\n    master: \/vagrant => \/Users\/ecorbett\/Documents\/repos\/k8s-ubuntu-vagrant\n==> master: Machine already provisioned. Run `vagrant provision` or use the `--provision`\n...<\/pre>\n

       <\/p>\n

      <\/a>Add-ons<\/h3>\n

      <\/a>Load Balancer<\/h4>\n

      MetalLB<\/a> is a LoadBalancer application for Kubernetes (primarily designed for bare metal K8s installs). \u00a0Metallb will install by default \u2013 can be commented out in the Vagrantfile if installation is not desired.\u00a0 Edit the Vagrantfile and put a # at the beginning of these 4 lines:<\/p>\n

      #echo \"Installing addon: Metallb (Loadbalancer)\"\n#kubectl apply -f https:\/\/raw.githubusercontent.com\/ecorbett135\/k8s-ubuntu-vagrant\/master\/addon\/metallb\/metallb-install.yaml\n#kubectl apply -f https:\/\/raw.githubusercontent.com\/ecorbett135\/k8s-ubuntu-vagrant\/master\/addon\/metallb\/layer2.config-yaml\n#kubectl apply -f https:\/\/raw.githubusercontent.com\/ecorbett135\/k8s-ubuntu-vagrant\/master\/addon\/metallb\/nginx-loadbalancer-test-deployment.yaml\n<\/pre>\n

       
      \nFor this project a simple Layer 2 configuration deployment is sufficient. By default the Load Balancer has a defined IP pool range
      \nChanging the default VM_SUBNET<\/code>\u00a0<\/strong>will require edits to the red text below to match the new subnet value. Also, it will require changing if NODE_OCTET<\/code><\/strong>is in within the 240 \u2013 250 range
      \nContents of ~\/kubernetes-dev-cluster\/addon\/metallb\/layer2.config-yaml<\/code><\/p>\n

      apiVersion: v1\nkind: ConfigMap\nmetadata:\n  namespace: metallb-system\n  name: config\ndata:\n  config: |\n    address-pools:\n    - name: my-ip-space\n      protocol: layer2\n      addresses:\n     - 172.16.35.240-172.16.35.250\n<\/pre>\n

       <\/p>\n

      <\/a>Web Server Deployment:<\/h3>\n

      NGINX Web server is deployed with a \u201cLoadBalancer\u201d configuration by default. It can be accessed typically by the first IP address in the range defined in the layer2.config-yaml. By default https:\/\/172.16.35.240<\/a>
      \n\"\"
      \nThe index.html<\/code> is loaded from the ~\/kubernetes-dev-cluster\/addon\/metallb\/<\/code> on the local machine. This file can be customized by the user.<\/p>\n

      Thank You<\/h3>\n

      Thanks to Steve Carlton, Chris Moore and Gary Pratt from the Navisite OSS team for their input.
      \nThanks to Javid Azadzoi from Navisite Messaging team for his objective view and coaching.
      \nThanks to Scott Hyslep from Navisite ACS team for validating the process on the Windows Platform.
      \n <\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":114,"featured_media":537,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[390,391,392,393,394,395,396,85,140,397,398,399,400,401,261,402,403,404,405,406,130,407,408,409,410,241,411,412],"acf":[],"yoast_head":"\nContainer Management - How to Build a Kubernetes Development Cluster - Navisite<\/title>\n<meta name=\"description\" content=\"Introduction Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Container Management - How to Build a Kubernetes Development Cluster\" \/>\n<meta property=\"og:description\" content=\"Introduction Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\" \/>\n<meta property=\"og:site_name\" content=\"Navisite\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-08T13:34:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-01-08T04:28:09+00:00\" \/>\n<meta name=\"author\" content=\"Megan Ferringer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@navisite\" \/>\n<meta name=\"twitter:site\" content=\"@navisite\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Megan Ferringer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\"},\"author\":{\"name\":\"Megan Ferringer\",\"@id\":\"https:\/\/www.navisite.com\/#\/schema\/person\/99bad6e33cc6d3ac27337400026e4a9f\"},\"headline\":\"Container Management – How to Build a Kubernetes Development Cluster\",\"datePublished\":\"2018-10-08T13:34:22+00:00\",\"dateModified\":\"2020-01-08T04:28:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\"},\"wordCount\":1733,\"publisher\":{\"@id\":\"https:\/\/www.navisite.com\/#organization\"},\"keywords\":[\"Ansible\",\"application depoyment\",\"Chef\",\"cluster\",\"container\",\"container management\",\"containerization\",\"devops\",\"Docker\",\"embedded shell script\",\"Flannel\",\"Git\",\"hypervisor\",\"kubernetes\",\"Linux\",\"Mac OS\",\"MetalLB\",\"Minikube\",\"NGINX\",\"Puppet\",\"SaltStack\",\"subnet\",\"Vagrant\",\"virtual machines\",\"VirtualBox\",\"VM\",\"web server\",\"Windows\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\",\"url\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\",\"name\":\"Container Management - How to Build a Kubernetes Development Cluster - Navisite\",\"isPartOf\":{\"@id\":\"https:\/\/www.navisite.com\/#website\"},\"datePublished\":\"2018-10-08T13:34:22+00:00\",\"dateModified\":\"2020-01-08T04:28:09+00:00\",\"description\":\"Introduction Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous\",\"breadcrumb\":{\"@id\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.navisite.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Container Management – How to Build a Kubernetes Development Cluster\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.navisite.com\/#website\",\"url\":\"https:\/\/www.navisite.com\/\",\"name\":\"Navisite\",\"description\":\"Elevate Your Cloud Journey\",\"publisher\":{\"@id\":\"https:\/\/www.navisite.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.navisite.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.navisite.com\/#organization\",\"name\":\"Navisite\",\"url\":\"https:\/\/www.navisite.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.navisite.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.navisite.com\/wp-content\/uploads\/2020\/02\/logo.svg\",\"contentUrl\":\"https:\/\/www.navisite.com\/wp-content\/uploads\/2020\/02\/logo.svg\",\"width\":1,\"height\":1,\"caption\":\"Navisite\"},\"image\":{\"@id\":\"https:\/\/www.navisite.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/navisite\",\"https:\/\/www.instagram.com\/navisite\/\",\"https:\/\/www.linkedin.com\/company\/navisite\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.navisite.com\/#\/schema\/person\/99bad6e33cc6d3ac27337400026e4a9f\",\"name\":\"Megan Ferringer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.navisite.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.navisite.com\/wp-content\/uploads\/2021\/02\/IMG-0529-150x150.jpg\",\"contentUrl\":\"https:\/\/www.navisite.com\/wp-content\/uploads\/2021\/02\/IMG-0529-150x150.jpg\",\"caption\":\"Megan Ferringer\"},\"description\":\"Megan is the Content Marketing Manager at Navisite with more than 10 years of experience helping brands discover and tell their stories. From working at a global non-profit organization to boutique marketing agencies in Chicago, she champions the power of storytelling across all industries.\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Container Management - How to Build a Kubernetes Development Cluster - Navisite","description":"Introduction Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/","og_locale":"en_US","og_type":"article","og_title":"Container Management - How to Build a Kubernetes Development Cluster","og_description":"Introduction Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous","og_url":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/","og_site_name":"Navisite","article_published_time":"2018-10-08T13:34:22+00:00","article_modified_time":"2020-01-08T04:28:09+00:00","author":"Megan Ferringer","twitter_card":"summary_large_image","twitter_creator":"@navisite","twitter_site":"@navisite","twitter_misc":{"Written by":"Megan Ferringer","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/#article","isPartOf":{"@id":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/"},"author":{"name":"Megan Ferringer","@id":"https:\/\/www.navisite.com\/#\/schema\/person\/99bad6e33cc6d3ac27337400026e4a9f"},"headline":"Container Management – How to Build a Kubernetes Development Cluster","datePublished":"2018-10-08T13:34:22+00:00","dateModified":"2020-01-08T04:28:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/"},"wordCount":1733,"publisher":{"@id":"https:\/\/www.navisite.com\/#organization"},"keywords":["Ansible","application depoyment","Chef","cluster","container","container management","containerization","devops","Docker","embedded shell script","Flannel","Git","hypervisor","kubernetes","Linux","Mac OS","MetalLB","Minikube","NGINX","Puppet","SaltStack","subnet","Vagrant","virtual machines","VirtualBox","VM","web server","Windows"],"articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/","url":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/","name":"Container Management - How to Build a Kubernetes Development Cluster - Navisite","isPartOf":{"@id":"https:\/\/www.navisite.com\/#website"},"datePublished":"2018-10-08T13:34:22+00:00","dateModified":"2020-01-08T04:28:09+00:00","description":"Introduction Navisite has recently started using Kubernetes and containers to increase efficiencies with a continuous innovation and continuous","breadcrumb":{"@id":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.navisite.com\/blog\/container-management-how-to-build-a-kubernetes-development-cluster\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.navisite.com\/"},{"@type":"ListItem","position":2,"name":"Container Management – How to Build a Kubernetes Development Cluster"}]},{"@type":"WebSite","@id":"https:\/\/www.navisite.com\/#website","url":"https:\/\/www.navisite.com\/","name":"Navisite","description":"Elevate Your Cloud Journey","publisher":{"@id":"https:\/\/www.navisite.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.navisite.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.navisite.com\/#organization","name":"Navisite","url":"https:\/\/www.navisite.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.navisite.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.navisite.com\/wp-content\/uploads\/2020\/02\/logo.svg","contentUrl":"https:\/\/www.navisite.com\/wp-content\/uploads\/2020\/02\/logo.svg","width":1,"height":1,"caption":"Navisite"},"image":{"@id":"https:\/\/www.navisite.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/navisite","https:\/\/www.instagram.com\/navisite\/","https:\/\/www.linkedin.com\/company\/navisite"]},{"@type":"Person","@id":"https:\/\/www.navisite.com\/#\/schema\/person\/99bad6e33cc6d3ac27337400026e4a9f","name":"Megan Ferringer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.navisite.com\/#\/schema\/person\/image\/","url":"https:\/\/www.navisite.com\/wp-content\/uploads\/2021\/02\/IMG-0529-150x150.jpg","contentUrl":"https:\/\/www.navisite.com\/wp-content\/uploads\/2021\/02\/IMG-0529-150x150.jpg","caption":"Megan Ferringer"},"description":"Megan is the Content Marketing Manager at Navisite with more than 10 years of experience helping brands discover and tell their stories. From working at a global non-profit organization to boutique marketing agencies in Chicago, she champions the power of storytelling across all industries."}]}},"publishpress_future_action":{"enabled":false,"date":"1970-01-01 00:00:00","action":"","terms":[],"taxonomy":"","browser_timezone_offset":0},"_links":{"self":[{"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/posts\/535"}],"collection":[{"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/users\/114"}],"replies":[{"embeddable":true,"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/comments?post=535"}],"version-history":[{"count":0,"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/posts\/535\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.navisite.com\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/media?parent=535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/categories?post=535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.navisite.com\/wp-json\/wp\/v2\/tags?post=535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}