搭建前先看的东西
- 首先你需要两台阿里云最低配版服务器(1核1G),操作系统选择centos 7.2,系统盘减成30G,网组选择专有网络、按量付费(跑k8s和docker一周跑不到五毛钱),然后付费就创建成功了。需要注意的是要配置安全组规则,相当于开启机子上相应端口供外部访问(我这里开启了所有端口,图方便不安全)。
-
下载Finalshell,使用Fianlshell连接服务器。
-
K8s不同的版本配适着不同的docker版本,通常来说最新的k8s版本是跟不上最新的docker版本的。比如在2019.7.25,最新的是docker-ce是19.03了,而最新的k8s(k8s1.15),只适配到docker 1.13.0到18.09。同样低版本一些的k8s也可能无法配适docker1.8.所以在安装之前一定要准备好对应的docker和k8s版本。而在2020.07.08,最新的docker版本是19.03.12,而最新的K8s是(k8s 1.18.5),在下文将使用19.03.7进行搭建。
-
docker国外下载源会导致网速很慢,安装前注意配置docker 阿里镜像源。
-
K8s安装大概分两步,下载相关组件yum install -y kubelet kubeadm kubectl ,和使用kubeadm创建集群。而前者下载的版本和后者创建的版本要兼容,否则也会报错,如用kubeadm 1.15去创建 1.13版本的集群。
-
K8s在安装过程中会自动下载一些docker镜像,有几个甚至不在docker hub上,不改配置基本下不到。解决方案有:1.提前用国内docker镜像源下载好,这样k8s在安装过程中会先检查本机有没有那些需要的镜像,有就直接装了。 2.在k8s 1.3之后允许在init命令中指定镜像仓库,这样我们就可以直接使用阿里的k8s文件镜像站了。3.在k8s 1.16之后直接使用init的镜像仓库参数会默认拉去最新的镜像,也即可能出现1.14集群拉1.18镜像的情况,还需要指定kubernetesVersion参数。
-
K8s在创建过程中会有一些报错(error),导致创建集群失败,但是我们可以在init命令中选择参数忽略这些报错,让错误降级为警告,不影响创建。比如:K8s在1.10后要求默认创建的机器CPU数要大于2,否则会报error,我们可以使用 --ignore-preflight-errors=NumCPU 来忽略这项配置检查;同样有关磁盘分区的有些问题也可以忽略。
-
查看centos版本cat /etc/redhat-release
安装Docker和Kubeadm
首先需要在所有Kubernetes集群的节点中安装Docker和kubeadm。为了安装成功还需要使用阿里开源镜像源。
1.设置使用国内Yum源
注意需要先有相关repo,才能进行add操作,这里直接使用阿里云的文档会报错。选择下面这张wget的方式可以正常使用。
[root@linux-node1 ~]# cd /etc/yum.repos.d/
[root@linux-node1 yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.安装指定的Docker版本
前文已述,由于kubeadm对Docker的版本是有要求的,所以需要安装与kubeadm匹配的版本,这里先查找安装列表,并安装了18.06版本。
[root@linux-node1 ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
[root@linux-node1 ~]# yum -y install docker-ce-19.03.7-3.el7
3.启动后台进程
启动后台进行并查看版本
[root@linux-node1 ~]# systemctl enable docker && systemctl start docker
[root@linux-node1 ~]# docker --version
4.设置kubernetes YUM仓库
[root@linux-node1 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
5.安装软件包
由于K8s版本更新频繁,基本两个多月就会有一个新的版本,所以需要指定对应的版本号,2020年6月默认安装最新版本1.18。本文写作时间最新版还是1.15,如果安装1.18,则后文kubeadm init命令的相关参数需要进行替换,如--experimental-upload-certs 需要改为--upload-certs
[root@linux-node1 ~]# yum install -y kubelet-1.18.2-0 kubeadm-1.18.2-0 kubectl-1.18.2-0 ipvsadm
6.配置kubelet
默认情况下,Kubelet不允许所在的主机存在交换分区,后期规划的时候,可以考虑在系统安装的时候不创建交换分区,针对已经存在交换分区的可以设置忽略禁止使用Swap的限制,不然无法启动Kubelet。
[root@linux-node1 ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
7.设置内核参数
[root@linux-node1 ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
使配置生效
[root@linux-node1 ~]# sysctl --system
8.启动kubelet并设置开机启动
注意,此时kubelet是无法正常启动的,可以查看/var/log/messages有报错信息,等待执行初始化之后即可正常,为正常现象。
[root@linux-node1 ~]# systemctl enable kubelet && systemctl start kubelet
9.其他环境配置
主机更名
hostnamectl set-hostname master #master机设置
hostnamectl set-hostname node01 #node01机设置
$ cat /etc/hosts
47.111.145.31 master
47.110.11.33 node01
关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
禁用SELINUX
$ setenforce 0
$ cat /etc/selinux/config
SELINUX=disabled
以上步骤请在Kubernetes的所有节点上执行,本实验环境是需要在master、node01这两台台机器上均安装Docker和kubeadm,而下面的操作就有不同的了,只有控制节点master需要执行创建init命令,其他计算节点node都是直接进去
初始化集群部署Master
在所有节点上安装完毕后,在master这台Master节点上进行集群的初始化工作。
1.执行初始化操作
kubeadm init \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=192.168.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--service-dns-domain=cluster.local \
--upload-certs \
--kubernetes-version=v1.18.2 \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
如果创建错误,下次重新创建之前需要使用reset命令重新初始化。
kubeadm reset
2.为kubectl准备Kubeconfig文件。
kubectl默认会在执行的用户家目录下面的.kube目录下寻找config文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf拷贝到.kube/config。
[root@linux-node1 ~]# mkdir -p $HOME/.kube
[root@linux-node1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@linux-node1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
在该配置文件中,记录了API Server的访问地址,所以后面直接执行kubectl命令就可以正常连接到API Server中。每次reset集群后需要重新执行这三条指令,因为每个集群的config文件都是不同的。
3.使用kubectl命令查看组件状态
[root@linux-node1 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
4.使用kubectl获取Node信息
目前只有一个节点,角色是Master,状态是NotReady。
[root@linux-node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
node1 NotReady master 14m v1.13.3
部署网络插件canal
Master节点NotReady的原因就是因为没有使用任何的网络插件,此时Node和Master的连接还不正常。目前最流行的Kubernetes网络插件有Flannel、Calico、Canal、Weave,这里选择使用Canal,是因为calico的在线yaml地址一般需要开梯子访问,而Canal的yaml地址可以直接访问。
因为基础的Kubernetes集群已经配置完毕,后面的增加组件等操作,几乎都可以使用kubectl和一个YAML配置文件来完成。这里给出官网文档地址,可以直接复制里面的命令安装不同脚本。
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
1.部署canal网络插件
[root@linux-node1 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
[root@linux-node1 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml
如果部署失败,则wget 下载两个yaml文件,修改canal.yaml中Daemonset中的apiVersion,改为apps/v1。再重新执行
kubectl apply -f rbac.yaml
kubectl apply -f canal.yaml
kind: DaemonSet
apiVersion: apps/v1
2.查看启动的Pod
等到全running时则可以接入node节点。
[root@linux-node1 ~]# kubectl get pods -A
部署Node节点
Master节点部署完毕之后,就可以部署Node节点,首先请遵循部署Docker和kubeadm章节为Node节点部署安装好docker、kubeadm和kubelet,此过程这里不再重复列出。
1.在Master节点输出增加节点的命令
[root@linux-node1 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.56.11:6443 --token isggqa.xjwsm3i6nex91d2x
--discovery-token-ca-cert-hash
sha256:718827895a9a5e63dfa9ff54e16ad6dc0c493139c9c573b67ad66968036cd569
2.在Node节点执行
注意如果节点有交换分区,需要增加--ignore-preflight-errors=Swap。即
kubeadm join 172.16.20.129:6443 --token 7qtu8s.81xvlhvbrwusy7fc \
--discovery-token-ca-cert-hash sha256:6f9ab14f0820b07b06320ab951e9e44029f66ee1d0b959fdf6e3cdc61aa970cc --ignore-preflight-errors=Swap
kubeadm join 172.16.20.129:6443 --token rp22yj.6fb9ba141guoqapw \
--discovery-token-ca-cert-hash sha256:c63b8c8fdb83fdc606ef737580e579c0b72c306f615fe379f48b93fd22bf669a --ignore-preflight-errors=Swap
这个时候kubernetes会使用DaemonSet在所有节点上都部署canal和kube-proxy。部署完毕之后节点即部署完毕。待所有Pod全部启动完毕之后,节点就恢复Ready状态。可以查看相关节点状态
[root@linux-node1 ~]# kubectl get pod --all-namespaces
[root@linux-node1 ~]# kubectl get node
成功加入节点即可
相关查询错误命令
查看logs报错信息
tail /var/log/messages
查看kubelet状态
systemctl status kubelet
查看kubelet的log
journalctl -xeu kubelet
重新kubeadm的init 和join命令
kubeadm reset
参考博客
使用kubeadm部署Kubernetes集群
使用kubeadm搭建kubernetes1.10集群
Kubernetes1.11.1集群环境搭建及问题解决
FAQ
1.node节点无法加入?
答:加入速度过快,master上的相关组件还没有创建完成,等master上组件全部为running的时候再进行node节点的加入。
2.coreDNS无法启动,报Readiness probe failed: HTTP probe failed with statuscode: 503?
修改config-init.yaml文件
3.kube-proxy、controller-manager总是重启?
主要原因是机子的CPU、内存不够,解决办法是重置,重装一遍。
Part 2
环境介质
如何多个master、多个镜像仓库
使用keepalive和LSB搭建多个可用。
yum install -y keepalived haproxy
kubeadm
写一个kubeadm.yaml文件,用kubeadm init --config kubeadm.yaml进行创建集群。
第一次使用需要生成.kube的相关文件。
开启高可用模式(集群模式)后会生成两个相关命令,分别是以master节点方式加入和以node节点加入。
Comments | NOTHING