How to Setup up Kubernetes 1.5 with kubeadm on CentOS

December 22, 2016 | By in TRENDING
| 3 Replies More

New version of Kubernetes is out, so here we are with another Kubernetes article. With Kubernetes 1.5, the kubeadm is still in alpha, and it is not recommended to use it in production as it still does not support load balancer. We are going to install well known online sock shop as a demo, and we will use nodeport to expose the service.

Installing Kubernetes 1.5 on all nodes

Lets add kubernetes repository for CentOS:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

After adding the repo, we need to turn off SElinux because it does not play very well with kubernetes. To turn off it momentarily, type

setenforce 0

To make it persist after reboot, use nano to edit SElinux config file like this:

nano /etc/selinux/config

and make sure SELINUX line is set to permissive or disabled:

SELINUX=disabled

Save the file and we can continue to installing the required packages.

yum install docker kubelet kubeadm kubectl kubernetes-cni

To enable docker auto start at boot, run this command:

systemctl enable docker

And to start it now, run the following.

systemctl start docker

Next lets do the same for kubelet

systemctl enable kubelet

systemctl start kubelet

Setting up the cluster

First thing we need to do is decide the master of our new cluster. If all nodes are set up like above is shown, next we run our designated master node the following command.

kubeadm init

Note that you can not run this command twice, you will need to tear down the cluster before running it second time. The output will be similar to this:

[root@centos-01 kubernetes]# kubeadm init
[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.
[preflight] Running pre-flight checks
[preflight] WARNING: firewalld is active, please ensure ports [6443 9898 10250] are open or your cluster may not function correctly
[init] Using Kubernetes version: v1.5.1
[tokens] Generated token: "9a6b48.b4011ffeeb237381"
[certificates] Generated Certificate Authority key and certificate.
[certificates] Generated API Server key and certificate
[certificates] Generated Service Account signing keys
[certificates] Created keys and certificates in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[apiclient] Created API client, waiting for the control plane to become ready
[apiclient] All control plane components are healthy after 105.821991 seconds
[apiclient] Waiting for at least one node to register and become ready
[apiclient] First node is ready after 4.505809 seconds
[apiclient] Creating a test deployment
[apiclient] Test deployment succeeded
[token-discovery] Created the kube-discovery deployment, waiting for it to become ready
[token-discovery] kube-discovery is ready after 68.003359 seconds
[addons] Created essential addon: kube-proxy
[addons] Created essential addon: kube-dns

Your Kubernetes master has initialized successfully!

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
http://kubernetes.io/docs/admin/addons/

You can now join any number of machines by running the following on each node:

kubeadm join --token=9a6b48.b4011ffeeb237381 45.55.128.42

Installing pod network and adding nodes to a cluster

In the above part, we initialized the cluster master, and we got in the last line command with a token that we will use to add nodes. But before we do that, we need to install pod network.

kubectl apply -f https://git.io/weave-kube

There are lots of ways to have pod network, but above one is maybe the simplest. It uses Container Network Interface or CNI, which is proposed standard for networking containers on Linux.

Next we can add nodes to the cluster with running this command on all the nodes

kubeadm join --token=bb6fc2.be0345f5b02a32a0 45.55.128.42

The token is sanitized, so that you could not add nodes to my cluster. Next lets enable pods to run on master and not only on nodes.

kubectl taint nodes --all dedicated-

After this we can check nodes to see if all are online.

kubectl get nodes

Installing microservices example

There is simple microservices example that we will use to test our cluster. It is online shop for socks.

First we will add namespace sock shop

kubectl create namespace sock-shop

And then we create the service

kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"

After this we need to wait some time for containers to get created and then we can try to visit the new site. In order to visit it, we must know its address. Lets examine the service

kubectl describe svc front-end -n sock-shop

It will give you output similar to this

Name: front-end
Namespace: sock-shop
Labels: name=front-end
Selector: name=front-end
Type: NodePort
IP: 10.104.11.202
Port: <unset> 80/TCP
NodePort: <unset> 31500/TCP
Endpoints: 10.32.0.4:8079
Session Affinity: None
No events.

The bold line is highlighted by me because we need the port number that service is using. We need to combine port number with address of one of our nodes, and we will get to the site.

Conclusion

So we have successfully set Kubernetes 1.5 cluster with kubeadm on CentOS 7. In our case it is three nodes cluster but kubeadm enables you to easily scale the cluster with adding new nodes. Be sure to keep your token private because with a token and public ip, anyone can add nodes to your cluster. With that we end this article, thank you for reading and have a nice day.

Filed Under : CONTAINERS, TRENDING

Tagged With : ,

Free Linux Ebook to Download

Comments (3)

Trackback URL | Comments RSS Feed

  1. Ed A. says:

    Hi! Great explanation for kubeadm. I am running kubeadm on Ubuntu server 16.04 and I have one node added to the cluster. I did not make the master a node. I followed the instructions for the "Installing pod network and adding nodes to a cluster" section. No pod was created.

    Is there something missing, or something I can check?

    Thanks!

    Reference:

    root@Kubemngr:~# kubectl get no
    NAME STATUS AGE
    kubemngr Ready,master 40s
    kubenode1 Ready 10s
    root@Kubemngr:~# kubectl apply -f https://git.io/weave-kube
    daemonset "weave-net" created
    root@Kubemngr:~# kubectl get pods
    No resources found.
    root@Kubemngr:~# kubectl create namespace sock-shop
    namespace "sock-shop" created
    root@Kubemngr:~# kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"
    namespace "sock-shop" configured
    deployment "cart-db" created
    service "cart-db" created
    deployment "cart" created
    service "cart" created
    deployment "catalogue-db" created
    service "catalogue-db" created
    deployment "catalogue" created
    service "catalogue" created
    deployment "front-end" created
    service "front-end" created
    deployment "orders-db" created
    service "orders-db" created
    deployment "orders" created
    service "orders" created
    deployment "payment" created
    service "payment" created
    deployment "queue-master" created
    service "queue-master" created
    deployment "rabbitmq" created
    service "rabbitmq" created
    deployment "shipping" created
    service "shipping" created
    deployment "user-db" created
    service "user-db" created
    deployment "user" created
    service "user" created
    root@Kubemngr:~# kubectl describe svc front-end -n sock-shop
    Name: front-end
    Namespace: sock-shop
    Labels: name=front-end
    Selector: name=front-end
    Type: NodePort
    IP: 10.101.52.160
    Port: 80/TCP
    NodePort: 30001/TCP
    Endpoints: 10.32.0.6:8079
    Session Affinity: None
    No events.
    root@Kubemngr:~# kubectl get pods
    No resources found.

  2. Tobias Hinz says:

    thanks for this nice tutorial,
    when trying to run the sock-shop i get the following error:

    the namespace from the provided object "zipkin" does not match the namespace "sock-shop". You must pass '--namespace=zipkin' to perform this operation.

    any idea whats wrong here?

Leave a Reply

Commenting Policy:
Promotion of your products ? Comment gets deleted.
All comments are subject to moderation.