背景

由于运维同学短缺,需要自己搭建一套k8s集群环境部署开发的高可用服务给测试使用,自己参考了网络上的k8s集群搭建文章,都或多或少存在一定的问题,故把自己搭建环境的过程记录下来,作为以后参考。

环境

真实的环境搭建在公司私有云上,不太方便记录,故这次的搭建过程使用本地的虚拟机环境,步骤基本一致,为方便部署,以下步骤均在root权限下进行。

本次部署包含两台虚拟机,一个为master节点,一个为node1节点,要部署更多节点的步骤和添加一个节点的方式一致。

虚拟机软件:Oracle VM VirtualBox

虚拟机系统:Centos 7.5

步骤

1.搭建虚拟机环境

此过程参考文章

从零开始搭建Kubernetes集群(二、搭建虚拟机环境)www.jianshu.com


centos7 sealos安装k8s centos7搭建k8s集群_centos7 sealos安装k8s


2.配置host-only网络


centos7 sealos安装k8s centos7搭建k8s集群_centos7关机命令_02


修改完网络配置之后,启动虚拟机,使用ifconfig查看网络情况,发现host-only网络已经配置成功


centos7 sealos安装k8s centos7搭建k8s集群_k8s多master建议用几个_03


3. 配置国内yum源

不建议使用CentOS 7自带的yum源,因为安装软件和依赖时会非常慢甚至超时失败。使用阿里云的源予以替换,执行如下命令:


&& mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update


centos7 sealos安装k8s centos7搭建k8s集群_centos7 sealos安装k8s_04


4.关闭防火墙、selinux和swap

a. 关闭防火墙

防火墙一定要提前关闭,否则在后续安装k8s集群的时候是个麻烦。执行下面语句关闭,病禁用开机启动。


systemctl stop firewalld & systemctl disable firewalld


centos7 sealos安装k8s centos7搭建k8s集群_centos7关机命令_05


b. 关闭selinux

执行以下命令:


setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config


centos7 sealos安装k8s centos7搭建k8s集群_k8s多master建议用几个_06


c. 关闭swap

在安装k8s集群时,Linux的swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可疑提前进行设置:

  • 执行swapoff -a可临时关闭,但系统重启后恢复
  • 编辑/etc/fstab,注释掉包含swap的那一行即可,重启后可永久关闭

命令如下:


swapoff -a
ed -ri '/^[^#]*swap/s@^@#@' /etc/fstab


执行后的文件如下所示:


centos7 sealos安装k8s centos7搭建k8s集群_k8s多master建议用几个_07


此时,用top查看swap情况,会看到swap的使用为0。


centos7 sealos安装k8s centos7搭建k8s集群_centos7 关闭selinux_08


5.设置路由

配置内核参数,将桥接的IPv4流量传递到iptables的链


yum install -y bridge-utils.x86_64
modprobe  br_netfilter  # 加载br_netfilter模块,使用lsmod查看开启的模块
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 重新加载所有配置文件


6.安装docker

a. 配置docker源


yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache


b. 安装合适的docker版本

由于k8s支持的docker版本存在一定的滞后,要选择好合适的docker版本

此次,选择安装的docker版本为18.09

选择查看docker-ce各版本


yum list docker-ce --showduplicates | sort -r


centos7 sealos安装k8s centos7搭建k8s集群_centos7 sealos安装k8s_09


安装指定版本的docker-ce


yum -y install docker-ce-18.09.9


centos7 sealos安装k8s centos7搭建k8s集群_centos7 sealos安装k8s_10


启动docker服务并激活开机启动


systemctl start docker & systemctl enable docker


查看docker版本


docker version


centos7 sealos安装k8s centos7搭建k8s集群_centos7 关闭selinux_11


运行第一个docker容器


docker run hello-world


提示如下,则表示你的docker安装成功了


centos7 sealos安装k8s centos7搭建k8s集群_k8s多master建议用几个_12


c. 修改docker cgroup驱动,与k8s一致,使用systemd


# 修改docker cgroup驱动:native.cgroupdriver=systemd
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

systemctl restart docker  # 重启使配置生效


7.安装k8s组件

a. 配置k8s yum源


cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


b. 在master节点安装kubelet kubeadm kubectl


yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes


可以看出当前安装的k8s的版本为1.16.3-0


centos7 sealos安装k8s centos7搭建k8s集群_k8s安装部署步骤_13


c. 开机启动kubelet


systemctl enable --now kubelet  # 开机启动kubelet


8.克隆虚拟机

至此,单个虚拟机配置完毕,接下来会clone一个虚拟机来配置集群环境

克隆前需要退出虚拟机,选择“正常关机”。右键虚拟机点击Clone:


centos7 sealos安装k8s centos7搭建k8s集群_k8s安装部署步骤_14


centos7 sealos安装k8s centos7搭建k8s集群_centos7关机命令_15


如上,新的节点命名为centos-node1,注意一定要选择“Generate new MAC address for all network adapters”。点击“Clone”,稍等几分钟,即可完成Clone:


centos7 sealos安装k8s centos7搭建k8s集群_k8s安装部署步骤_16


9.修改hostname

以master节点为例:

  • 编辑/etc/hostname,将hostname修改为centos-master
  • 编辑/etc/hosts,追加内容192.168.56.5 centos-master

具体命令为:

hostnamectl set-hostname centos-master
cat <<EOF >>/etc/hosts
192.168.56.5 centos-master
EOF


Clone出来的其他虚拟机节点做类似的操作

10.部署master节点

a. 在master进行k8s集群初始化

根据前一步安装信息,安装相应版本的k8s(此处为1.16.3)


kubeadm init --kubernetes-version=1.16.3   
--apiserver-advertise-address=192.168.56.5   
--image-repository registry.aliyuncs.com/google_containers   
--service-cidr=192.1.0.0/16   
--pod-network-cidr=192.244.0.0/16


定义POD的网段为:192.244.0.0/16,api server地址就是master本机IP地址。

集群初始化成功后返回如下信息:

centos7 sealos安装k8s centos7搭建k8s集群_k8s多master建议用几个_17


记录生成的最后部分内容,此内容需要在其它节点加入k8s集群时执行。


kubeadm join 192.168.56.5:6443 --token bvkgue.f5zpauffltb6zkzi 
    --discovery-token-ca-cert-hash sha256:3113f037dce468decbf284d3ef7d19809513906ddaa79e6b4496f1d4a1a98c88


b. 配置kubectl工具


mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config


11.在master节点部署flannel网络


kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


centos7 sealos安装k8s centos7搭建k8s集群_k8s安装部署步骤_18


12.将master节点作为工作节点

k8s集群默认不会将Pod调度到master上,这样master的资源就浪费了。在master上,可以运行以下命令使其作为一个工作节点:


kubectl taint nodes --all node-role.kubernetes.io/master-


执行成功后提示:


centos7 sealos安装k8s centos7搭建k8s集群_k8s多master建议用几个_19


13.加入node节点

在centos-node1节点执行上面步骤中保存的k8s join命令

加入成功后,提示:


centos7 sealos安装k8s centos7搭建k8s集群_centos7关机命令_20


14. 验证集群是否正常

当所有节点加入集群后,稍等片刻,在master节点上运行kubectl get nodes可以看到:


centos7 sealos安装k8s centos7搭建k8s集群_centos7 关闭selinux_21


如上,若提示notReady则表示节点尚未准备好,可能正在执行其他初始化操作,等待全部变为Ready即可。

另外,建议查看所有pod状态,运行kubectl get pods -n kube-system


centos7 sealos安装k8s centos7搭建k8s集群_centos7 sealos安装k8s_22


如上,全部Running则表示集群正常。至此,k8s集群就搭建完成了。