使用Kubeadm在CentOS7上配置k8s集群
本文面向的对象是有一定Linux系统使用经验,能够进行科学上网的读者。本文会较为详细的叙述在三台CentOS7服务器上使用kubeadm搭建一个一主两从的k8s集群,k8s版本为目前最新的1.10.2。
该版本目前未做HA,后续条件允许的情况下会考虑搭建一个三主三从的k8s cluster.
安装Docker
先分别在三台机器上安装Docker.
这一步我主要是根据Docker官方文档进行安装的。这个步骤主要有以下几点需要注意
- 如果以前安装过Docker,建议将其卸载干净
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
并且删除docker相关目录
sudo rm -rf /var/lib/docker
如果这里出现了 device is busy导致目录删除失败的问题,那么先对其进行卸载
cat /proc/mounts |grep docker
sudo umount /path # path一般是/var/lib/docker
然后便可安装Docker了,目前最新的k8s集群支持的Docker最高版本是17.03,而最新版本Docker为18+,所以在安装Docker的时候需要指定安装版本
安装相关依赖
sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2
添加Docker相关repo
sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
安装指定版本的Docker。
sudo yum install --setopt=obsoletes=0 docker-ce-17.03.2.ce docker-ce-selinux-17.03.2.ce
我这里是17.03,但是使用17.03在node节点join集群的时候可能出现cri相关错误,网上给的解决方法是将Docker进行降级,我这里并没有尝试该方法,而是在做preflight的时候忽略了该错误
CentOS7中需要修改docker的cgroup driver为systemd,以与后文中k8s的配置保持一致
vim /etc/docker/daemon.json
添加以下内容
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
然后添加网络相关设置
vim /etc/sysctl.conf
加入以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
并使其生效
sysctl -p
然后,我们再为Docker设置代理,使其在k8s初始化的时候,可以顺利地从 gcr拉取镜像
至此,关于Docker的相关设置便完成了。
安装k8s master和 node
安装之前,先在各台机器上进行一些系统设置
关闭swap功能
sudo swapoff -a
关闭selinux
setenforce 0 # 临时关闭。篇幅所限,这里就不谈及如何永久关闭了
关闭firewalld
systemctl stop firewalld.service
引入http和https代理。这样命令行就可以直接 “翻墙”了
export https_proxy=http://22.11.42.13:8123
export http_proxy=http://22.11.42.13:8123
也可以在每次需要翻墙的命令中这样使用,这样需要每次都带上代理信息,较为麻烦
http_proxy=http://127.0.0.1:8123 curl ip.gs
注意,引入了https_proxy等环境变量之后,kubeadm可能会使用它们,我们需要对不需要使用这些代理的域名或者ip进行配置,配置方式如下
export NO_PROXY='ip,ip,ip,ip,.example.com,'
配置完成之后,安装相关依赖,主要是crictl
yum install go
vim /etc/yum.repos.d/kubernetes.repo
rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
vi /etc/yum.repos.d/go-repo.repo
用7代替$releasever,用x86_64代替$basearch。然后直接下载安装即可
go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
通过find / -name crictl找到它的位置,将其目录加入环境变量路径
然后在三台机器上下载安装kubeadm,kubelet和kubectl三个组件
添加yum源
vim /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
安装k8s master
kubeadm init --apiserver-advertise-address 22.11.44.12 --pod-network-cidr=10.244.0.0/16
22.11.44.12表示master的ip,--pod-network-cidr指定pod网络的范围,不同网络方案对于范围要求不同,10.244.0.0/16表示我们将使用flannel作为网络通信组件
执行完该命令后,可以看到一些重要的提示信息,比如node节点加入cluster需要的token和hash
kubeadm join 22.11.44.12 --token fdi90o.aktbwm5p60zdw2kk --discovery-token-ca-cert-hash sha256:0f39d4e6848095941a49bbd4505bb402b13a12129f46a4eefdb0ab75b51559f9
除此之外,还提示了如何设置kubectl相关配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
再通过在~/.bashrc中追加下面内容,让kubectl能够自动补全
source <(kubectl completion bash)
然后,我们选择一种容器网络方案进行设置,由于前面我们规划子网选择的是flannel,所以这里我们设置flannel网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后便可以使用kubectl cluster-info查看集群状态了
安装k8s minion
对于minion节点的安装和配置,也比较简单,在上文环境配置完成之后,直接使用master配置完成后提示的命令即可
kubeadm join 22.11.44.12 --token fdi90o.aktbwm5p60zdw2kk --discovery-token-ca-cert-hash
我这里启动失败了,提示的是cri相关错误,我直接在启动命令后面添加参数--ignore-preflight-errors=cri忽略了此错误
在minion节点配置kubectl的时候,我遇到了问题
The connection to the server localhost:8080 was refused - do you specify the right host or port
我怀疑是由于以前安装过老版本的k8s集群,当时是使用手动安装的方式,某些环境变量或者配置信息并没有完全清除,导致kubectl读到了以前的配置。我这里的解决方法是将master的$HOME/.kube/config文件拷贝当minion节点的$HOME/.kube/目录下。不过这样我也想到了一个问题,要是我们需要对多个集群使用kubectl,那么如何进行配置和切换呢?官方文档貌似给出了答案
在minion节点都配置完成之后,我们使用
kubectl get nodes
便可以看到所有节点信息了
以上便是我使用kubeadm安装k8s集群的全过程。kubeadm确实比手动安装方便多了,尤其是需要生成证书的情况下。k8s难以安装的很大一个原因还是在于GFW。在启动诸如kubelet和docker等组件的时候,如果启动失败,多通过
systemctl status kubelet和journalctl -xeu kubelet这种命令来查看原因
此外,通过kubeadm reset便可以对集群进行清理了,比手动安装和清理集群简单太多了.
对于使用kubeadm reset清理集群, 建议删除所有相关配置
- kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
- kubectl delete node <node name>
- rm -rf /var/lib/cni/flannel/* && rm -rf /var/lib/cni/networks/cbr0/* && ip link delete cni0
- rm -rf /var/lib/cni/networks/cni0/*
- kubeadm reset