Application Containers: Kubernetes and Docker from Scratch
Overview
In this article we will look at how to configure a Kubernetes cluster using the Docker container format on CentOS or RHEL 7.1. For a detailed overview on Kubernetes and Docker take a look at this article. A Kubernetes cluster is comprised of a master and N nodes. The master acts as a control plane for the cluster and in this case also exposes a private Docker registry. A Kubernetes node runs Docker container images.
Requirements
In this article we will setup a master and one node. At minimum two hosts will be required. Kubernetes also has the following networking requirements:
- all containers can communicate with all other containers without NAT
- all nodes can communicate with all containers (and vice-versa) without NAT
- the IP that a container sees itself as is the same IP that others see it as
In order to meet these networking requirements an overlay network must be configured. Two commonly used overlay networks for Kuberentes are Flannel and Open vSwitch. In this article we will use Flannel.
Setup Kubernetes Master
Creating a Kubernetes master means configuring Kubernetes, Etcd, Flannel, Docker and a private Docker registry. The private Docker registry is used by the nodes in order to pull images.
Install packages and enable services
#yum update -y
#yum install -y docker docker-registry etcd kubernetes flannel
#for SERVICES in docker.service docker-registry etcd kube-apiserver kube-controller-manager kube-scheduler flanneld do systemctl enable $SERVICES done
Configure Private Docker Registry
#vi /etc/sysconfig/docker INSECURE_REGISTRY='--insecure-registry kube-master.lab.com:5000'
Configure Kuberentes API Server
#vi /etc/kubernetes/apiserver KUBE_API_ADDRESS="--address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd_servers=http://kube-master.lab.com:4001"
Configure Kubernetes Master
#vi /etc/kubernetes/config KUBE_MASTER="--master=http://kube-master.lab.com:8080"
Configure Kubernetes Nodes (kubelets)
#vi /etc/kubernetes/controller-manager KUBELET_ADDRESSES="--machines=kube-node1.lab.com"
Configure ETCD
#vi /etc/etcd/etcd.conf ETCD_LISTEN_PEER_URLS="http://localhost:2380,http://localhost:7001" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:4001,http://0.0.0.0:2379"
#systemctl start etcd
Configure Overlay Network using Flannel
#vi /etc/sysconfig/flanneld FLANNEL_ETCD="http://kube-master.lab.com:4001" FLANNEL_ETCD_KEY="/flannel/network" FLANNEL_OPTIONS="eth0"
#vi /root/flannel-config.json { "Network": "10.100.0.0/16", "SubnetLen": 24, "SubnetMin": "10.100.50.0", "SubnetMax": "10.100.199.0", "Backend": { "Type": "vxlan", "VNI": 1 } }
curl -L http://kube-master.lab.com:4001/v2/keys/flannel/network/config -XPUT --data-urlencode value@flannel-config.json
Download Docker Images to private registry
#systemctl start docker
#systemctl start docker-registry
#for IMAGE in rhel6 rhel7 kubernetes/kube2sky:1.1 kubernetes/pause:go do docker pull $IMAGE docker tag $IMAGE kube-master.lab.com:5000/$IMAGE docker push kube-master.lab.com:5000/$IMAGES done
systemctl reboot
Setup Kubernetes Node
In this example we will setup a Kubernetes node from scratch. It is also possible to use a container OS like RHEL Atomic as a Kubernetes node. RHEL Atomic is an OS optimized for running containers. Choosing whether to use RHEL Atomic or a standard RHEL depends greatly on your specific requirements.
Install Packages and enable services
#yum update -y
#yum install -y docker docker-registry etcd kubernetes flannel
#for SERVICES in docker.service kubelet kube-proxy flanneld do systemctl enable $SERVICES done
Configure Kubernets Master
#vi /etc/kubernetes/config KUBE_MASTER="--master=http://kube-master.lab.com:8080"
Configure Kubernetes Node (kubelet)
#vi /etc/kubernetes/kubelet KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME=""
KUBELET_API_SERVER="--api_servers=http://kube-master.lab.com:8080"
Configure Docker
#vi /etc/sysconfig/docker ADD_REGISTRY='--add-registry registry.access.redhat.com' ADD_REGISTRY='--add-registry kube-master.lab.com:5000'
Configure Flannel
#vi /etc/sysconfig/flanneld FLANNEL_ETCD="http://kube-master.lab.com:4001" FLANNEL_ETCD_KEY="/flannel/network" FLANNEL_OPTIONS="eth0"
#systemctl reboot
Summary
In this article we went through the steps of building a Kubernetes cluster from scratch on RHEL or CentOS 7.1. As you have seen standing up a Kubernetes cluster can be done very easily. Hopefully you have found this article helpful, feedback is always greatly appreciated.
(c) 2015 Keith Tenzer