搭建前先看的东西

  1. 首先你需要两台阿里云最低配版服务器(1核1G),操作系统选择centos 7.2,系统盘减成30G,网组选择专有网络、按量付费(跑k8s和docker一周跑不到五毛钱),然后付费就创建成功了。需要注意的是要配置安全组规则,相当于开启机子上相应端口供外部访问(我这里开启了所有端口,图方便不安全)。
    阿里云
    阿里云2
    阿里云3

  2. 下载Finalshell,使用Fianlshell连接服务器。

  3. 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进行搭建。

  4. docker国外下载源会导致网速很慢,安装前注意配置docker 阿里镜像源。

  5. K8s安装大概分两步,下载相关组件yum install -y kubelet kubeadm kubectl ,和使用kubeadm创建集群。而前者下载的版本和后者创建的版本要兼容,否则也会报错,如用kubeadm 1.15去创建 1.13版本的集群。

  6. K8s在安装过程中会自动下载一些docker镜像,有几个甚至不在docker hub上,不改配置基本下不到。解决方案有:1.提前用国内docker镜像源下载好,这样k8s在安装过程中会先检查本机有没有那些需要的镜像,有就直接装了。 2.在k8s 1.3之后允许在init命令中指定镜像仓库,这样我们就可以直接使用阿里的k8s文件镜像站了。3.在k8s 1.16之后直接使用init的镜像仓库参数会默认拉去最新的镜像,也即可能出现1.14集群拉1.18镜像的情况,还需要指定kubernetesVersion参数。

  7. K8s在创建过程中会有一些报错(error),导致创建集群失败,但是我们可以在init命令中选择参数忽略这些报错,让错误降级为警告,不影响创建。比如:K8s在1.10后要求默认创建的机器CPU数要大于2,否则会报error,我们可以使用 --ignore-preflight-errors=NumCPU 来忽略这项配置检查;同样有关磁盘分区的有些问题也可以忽略。

  8. 查看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节点加入。