使用Kubeadm在CentOS7上配置k8s集群

2018-05-12  本文已影响825人  resolvewang

本文面向的对象是有一定Linux系统使用经验,能够进行科学上网的读者。本文会较为详细的叙述在三台CentOS7服务器上使用kubeadm搭建一个一主两从的k8s集群,k8s版本为目前最新的1.10.2

该版本目前未做HA,后续条件允许的情况下会考虑搭建一个三主三从的k8s cluster.

安装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,kubeletkubectl三个组件

添加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需要的tokenhash

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。在启动诸如kubeletdocker等组件的时候,如果启动失败,多通过
systemctl status kubeletjournalctl -xeu kubelet这种命令来查看原因

此外,通过kubeadm reset便可以对集群进行清理了,比手动安装和清理集群简单太多了.

对于使用kubeadm reset清理集群, 建议删除所有相关配置

上一篇 下一篇

猜你喜欢

热点阅读