从零搭建kubernetes多节点cluster

Posted 零君聊软件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零搭建kubernetes多节点cluster相关的知识,希望对你有一定的参考价值。

最近几天我司很多kubernetes的cluster环境出了问题,而且很多控制权限都只有少数人有,只好在自己笔记本上从零搭建Kubernetes的cluster环境。本文详细总结了搭建多节点cluster的步骤,让更多的人少走弯路,也算是我对云时代的一点微薄贡献:)。


阅读本文之前,读者最好对kubernetes的总体架构以及一些基本概念有一个基本的了解。即便不了解也没有关系,现在网上的资料很多,随便花个10~30分钟就能了解个大概了。如果实在懒得去了解,直接阅读本文也无妨:)。


废话就不多说了,下面直接进入正题。


步骤一: 准备多台Linux环境

如果你已经有了几台现成的Linux机器或者VM(虚拟机),那可以直接跳过这一步。下面介绍如果在本地安装多台虚拟机。

1.1: 安装VirtualBox

VirtualBox是一款开源的虚拟机管理软件,之前是由Sun出品,后来被Oracle收购。这个就不多说了,自行下载一个安装就是了。我安装的版本是5.1.8。如果你用VMWare也应该没问题。


1.2:安装多台虚拟机

这里介绍如何用vagrant来安装虚拟机(关于vagrant,可以登录 https://www.vagrantup.com/ 了解)。先从https://www.vagrantup.com/downloads.html下载 一个适合本地环境的安装包。安装之后,将可执行文件路径加入path既可。


要保证你本地的环境可以访问互联网,一般情况下,需要设置代理(你懂的),否则无法从国外下载image。可以用下列命令设置代理,

export http_proxy="http://<YOUR_PROXY>:80"

export https_proxy="http://<YOUR_PROXY>:80"


然后打开记事本,直接将下面的内容粘贴上,然后保存成Vagrantfile(必须是这个文件名)。假设保存到了 D:\k8s\Vagrantfile(我本地环境是Windows 7)。这个配置文件中配置了三台虚拟机,IP分别是192.168.77.10/11/12,每台虚拟机上安装的是Oracle Linux 7.4。

# -*- mode: ruby -*-

# vi: set ft=ruby :

hosts = {

  "n1" => "192.168.77.10",

  "n2" => "192.168.77.11",

  "n3" => "192.168.77.12"

}

Vagrant.configure("2") do |config|

  # always use Vagrants insecure key

  config.ssh.insert_key = false

  # forward ssh agent to easily ssh into the different machines

  config.ssh.forward_agent = true


  check_guest_additions = false

  functional_vboxsf     = false


  config.vm.box = "generic/oracle7"

 hosts.each do |name, ip|

    config.vm.define name do |machine|

      machine.vm.network :private_network, ip: ip

      machine.vm.provider "virtualbox" do |v|

        v.name = name

      end

    end

  end

end

进入D:\k8s目录后,执行下面的命令:

vagrant up --provider=virtualbox

上面的命令执行时间可能比较长,因为会下载Oracle Linux的image文件。如果执行过程中遇到“Failed to attached the network LUN(VERR_INTNET_FLT_IF_NOT_FOUND”错误,那是NDIS6的一个已知问题,这时就需要卸载VirtualBox,然后用下面的命令重新安装,

VirtualBox-5.0.11-104101-Win.exe -msiparams NETWORKTYPE=NDIS5


执行成功后,就会自动在VirtualBox创建3台Oracle Linux的虚拟机。 然后就可以用命令"vagrant ssh n1"登录第一台虚拟机,同理"vagrant ssh n2"登录第二台虚拟机,“vagrant ssh n3”登录第三台虚拟机。


第二步:配置Linux环境

需要对三台虚拟机都执行下面的配置。注意用root用户执行下面的命令。

2.1 关闭防火墙

因为kubernetes cluster会用到一些端口,一个个开放比较麻烦,所以干脆直接关闭防火墙省事,毕竟这只是一个本地的测试环境。

   systemctl stop firewalld

   systemctl disable firewalld


2.2 禁用SELINUX

首先执行 "setenforce 0",然后打开/etc/selinux/config,将其中的配置项SELINUX的值设置成disabled。


2.3 配置iptables

iptables -P FORWARD ACCEPT


2.4 安装常用工具

我这次用的Oracle Linux的image中,没有ifconfig,netstat等命令,可以通过下面的命令安装。

yum install -y net-tools


2.5 设置 Proxy

因为需要访问网络,所以需要设置代理。建议写一个简单的脚本setProxy.sh,将上面的export命令写入脚本中。然后每次登录系统的时候执行一遍(或者加入到profile中),

export http_proxy="http://<YOUR_PROXY>:80"

export https_proxy="http://<YOUR_PROXY>:80"

export no_proxy="localhost,127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"

export NO_PROXY="localhost,127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"


2.6 修改hostname

直接修改/etc/hostname,然后对每台虚拟机设置不同的名字,比如vm1, vm2, vm3。

然后在每一台虚拟机的/etc/hosts中加入下面的内容,

192.168.77.10  vm1

192.168.77.11  vm2

192.168.77.12  vm3


最后重启三台虚拟机。注意启动时,直接 Headless模式启动既可,也就是无界面模式。


第三步:安装Docker

需要在每台虚拟机上都安装Docker,所以在每台虚拟机上都要执行下列步骤。注意用root用户执行下面的命令。

3.1 Enable ol7_latest, ul7_uekr4 and ol7_addons。具体方法就是将/etc/yum.repos.d/public-yum-ol7.repo中这三个标签对应的enabled设置成1。更详细的信息可以参考下面链接:

https://blogs.oracle.com/hlsu/install-docker-on-oracle-linux-7 


3.2 安装docker

执行下面的命令安装即可。注意执行之前需要设置好代理。kubernetes的官方文档推荐安装docker 1.12,并说明1.11,1.13以及17.03都验证过可以工作,对于17.06没有验证过。但我今天就验证了17.06可以和kubernetes1.9.2一起正常工作。

  yum install docker-engine

  systemctl start docker

  systemctl enable docker


3.3 给docker设置代理

因为docker需要访问网络,所以也需要设置代理。设置在/etc/systemd/system/docker.service.d/http-proxy.conf里面即可,参考下例,

[Service]

Environment="HTTP_PROXY=http://<YOUR_PROXY>:80/" "NO_PROXY=localhost,

127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"

Environment="HTTPS_PROXY=http://<YOUR_PROXY>:80/" "NO_PROXY=localhost,

 127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"


3.4 设置docker的cgroup driver

$ cat /etc/docker/daemon.json
{    "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

最后执行下面的命令,

systemctl daemon-reload

systemctl restart docker


第四步:安装kubelet,kubeadm和kubectl

同样,需要在三台虚拟机上执行的步骤。注意用root用户执行下面的命令。

4.1 配置kubernetes.repo,直接执行下面的命令,

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF


4.2 安装kubelet/kubeadm/kubectl

同样执行下面的命令之前,需要保证代理已经配置好了。

yum install -y kubelet kubeadm kubectl

systemctl enable kubelet 


4.3 配置 kubelet

对/etc/systemd/system/kubelet.service.d/10-kubeadm.conf做如下修改:

a) 将“--cgroup-driver=systemd”修改成"--cgroup-driver=cgroupfs";

b) 插入下面的一行到文件中,

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

c) 执行命令:

swapoff -a

systemctl daemon-reload

d) 继续执行下面的命令:

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

vm.swappiness=0

EOF

sysctl --system


第五步:安装kubernetes cluster

终于到了最关键的步骤了,注意这一步只在master节点上操作。我选择了vm1作为master。

5.1 首先切换到root用户,然后设置好代理,然后执行下面的命令,

kubeadm init  --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.77.10

"--pod-network-cidr=10.244.0.0/16"表示使用flannel pod network。这条命令可能会执行比较长时间,因为会下载apiserver,scheduler和controller的images。执行过程中,会输出很多信息,如果执行成功,最后会输出下面的关键信息:

Your Kubernetes master has initialized successfully!


To start using your cluster, you need to run the following as a regular user:


  mkdir -p $HOME/.kube

  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  sudo chown $(id -u):$(id -g) $HOME/.kube/config


You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

  https://kubernetes.io/docs/concepts/cluster-administration/addons/


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

as root:


  kubeadm join --token fd6a7c.cfb7a7a6044be2e0 192.168.77.10:6443 --discovery-token-ca-cert-hash sha256:7c3caf17275f77669f9140d5f0924038d705303e2d4584fd176d7315c509bae1


如果执行失败,则执行"kubeadm reset",然后根据提示修改之后,重新执行"kubeadm init ..."。


5.2 配置kubectl 

切换到普通用户(vagrant),然后执行下面的命令,

  mkdir -p $HOME/.kube

  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  sudo chown $(id -u):$(id -g) $HOME/.kube/config


这时在master上就可以查看所有的pod了,

kubectl get pods --all-namespaces


5.3 安装POD Network

只要支持CNI(Container Network Interface)的Network都可以,但由于之前执行"kubeadm init..."的时候,指定了flannel,所以这里直接安装Flannel POD Network即可,

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml


5.4 默认情况下,POD不会调度到master节点上。如果想在master上调度POD, 则执行下面的命令,

kubectl taint nodes --all node-role.kubernetes.io/master-


第六步:将其他节点加入cluster中

将vm2和vm3加入节点中,所以这一步的操作在vm2和vm3上执行。分别在vm2和vm3上执行下面的命令即可,也就是"kubeadm init ..."最后输出的命令,

kubeadm join --token fd6a7c.cfb7a7a6044be2e0 192.168.77.10:6443 --discovery-token-ca-cert-hash sha256:7c3caf17275f77669f9140d5f0924038d705303e2d4584fd176d7315c509bae1


如果执行失败,则执行下面的命令reset,注意下面的前两条命令在master(vm1)上执行,第三条命令"kubeadm reset"在vm2/vm3上执行。根据错误提示修改之后,再重新执行上面的"kubeadm join..."命令.

kubectl drain vm2 --delete-local-data --force --ignore-daemonsets

kubectl delete node vm2

kubeadm reset


如果执行成功,那么会在该节点上成功启动一个kubelet进程以及一个kube-proxy的pod。到master节点上执行下面命令可以查看到新加入的节点:

kubectl get nodes 

正常情况下,可以看到下面的输出:

[vagrant@vm1 ~]$kubectl get nodes

NAME      STATUS    ROLES     AGE       VERSION

vm1       Ready     master    14h       v1.9.2

vm2       Ready     <none>    13h       v1.9.2

vm3       Ready     <none>    13h       v1.9.2


在master节点上也可以查看到目前所有的pod运行情况:

kubectl get pod --all-namespaces -o wide

可以看到下面的输出,

[vagrant@vm1 ~]$ kubectl get pod --all-namespaces -o wide

NAMESPACE     NAME                          READY     STATUS    RESTARTS   AGE     IP              NODE

kube-system   etcd-vm1                      1/1       Running   2          14h     192.168.77.10   vm1

kube-system   kube-apiserver-vm1            1/1       Running   2          14h     192.168.77.10   vm1

kube-system   kube-controller-manager-vm1   1/1       Running   2          14h     192.168.77.10   vm1

kube-system   kube-dns-6f4fd4bdf-bq987      3/3       Running   3          14h     10.244.0.3      vm1

kube-system   kube-flannel-ds-66nqv         1/1       Running   1          13h     192.168.77.11   vm2

kube-system   kube-flannel-ds-n9bnf         1/1       Running   1          14h     192.168.77.10   vm1

kube-system   kube-flannel-ds-r2tnr         1/1       Running   2          13h     192.168.77.12   vm3

kube-system   kube-proxy-tjrcs              1/1       Running   2          13h     192.168.77.11   vm2

kube-system   kube-proxy-ts6cf              1/1       Running   1          13h     192.168.77.12   vm3

kube-system   kube-proxy-zg6mx              1/1       Running   2          14h     192.168.77.10   vm1

kube-system   kube-scheduler-vm1            1/1       Running   2          14h     192.168.77.10   vm1


大功告成!然后就可以在kubernetes cluster中部署自己的应用了。如果有疑问,欢迎留言讨论。


--END--

如果你喜欢这篇文章,欢迎转发给更多的朋友!


以上是关于从零搭建kubernetes多节点cluster的主要内容,如果未能解决你的问题,请参考以下文章

从零搭建Linux+Docker+Ansible+kubernetes 学习环境(1*Master+3*Node)

从零搭建kubernetes v1.18.6集群

从零搭建kubernetes v1.18.6集群

vagrant + ubuntu16.04 搭建 kubernetes cluster

从零开始搭建kubernetes(二)_Kuboard可视化插件搭建

从零到壹搭建一个商城架构--k8s集群安装