从零搭建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)
vagrant + ubuntu16.04 搭建 kubernetes cluster