背景

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

环境

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

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

虚拟机软件:Oracle VM VirtualBox

虚拟机系统:Centos 7.5

步骤

1.搭建虚拟机环境

此过程参考文章

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

2.配置host-only网络

f9077c0b8f7cdc057c574f77bf5e53e0.png

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

62bea40ff641514818ca379918c0e9a5.png

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

28abe71e26c6f6f178682f1ab2deae83.png

4.关闭防火墙、selinux和swap

a. 关闭防火墙

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

74ec516e0f40ca808e27297451795758.png

b. 关闭selinux

执行以下命令:

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

c89211fb3a7b3165d6c7bee999764619.png

c. 关闭swap

在安装k8s集群时,Linux的swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可疑提前进行设置:
  • 执行swapoff -a可临时关闭,但系统重启后恢复
  • 编辑/etc/fstab,注释掉包含swap的那一行即可,重启后可永久关闭

命令如下:

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

执行后的文件如下所示:

956f27d40a5303905edded2bd2c3d931.png

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

bcba14deec068cb9e45433b068f47fad.png

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

c1852799e10c52d0035fb1ed3a18c9cd.png

安装指定版本的docker-ce

yum -y install docker-ce-18.09.9

6b6cec1fa27fd82a60b5f950e7b7ae5d.png

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

systemctl start docker & systemctl enable docker

查看docker版本

docker version

4663369e0fdbbb7e6dd5ee5b75734005.png

运行第一个docker容器

docker run hello-world

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

e31d64d420f0a89a72b28959bbc14f8c.png

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

0b35f305faf17cb1460ea7c22f5d62ab.png

c. 开机启动kubelet

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

8.克隆虚拟机

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

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

4181cc1e424abb3a6d829d03f867f5b9.png

32319c18efaea462c140d7464f123541.png

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

dbaec6d69fc3ad3d93dcc0f506c8250c.png

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地址。

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

5c9bc062cd5071a2f437c761abbd2d16.png

记录生成的最后部分内容,此内容需要在其它节点加入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

36759e2fdd9fd8071ea8604729551e8d.png

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

k8s集群默认不会将Pod调度到master上,这样master的资源就浪费了。在master上,可以运行以下命令使其作为一个工作节点:
kubectl taint nodes --all node-role.kubernetes.io/master-

执行成功后提示:

739f316ee22b4d5a067f1f23797a9310.png

13.加入node节点

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

加入成功后,提示:

b43352170c166fb9be80f2dc948904dc.png

14. 验证集群是否正常

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

45da7fd3f3bb7884fe29f138d8c571b2.png

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

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

5d5f6bfe86a29ca717fd7f0abca1b1f4.png

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

参考内容

从零开始搭建Kubernetes集群(一、开篇)​www.jianshu.com
8b2b6c32eebaa8c00dc98d344807ee9c.png
2019最新k8s集群搭建教程 (centos k8s 搭建)​juejin.im Centos 7 kubernetes集群搭建​www.cnblogs.com
1bfa03bcdd8dd4571633128486b09e3d.png
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐