目录

一、安装vmware 15 pro

二、安装centos 7

三、复制虚拟机

1) 复制二个节点命名为node1和node2

 2)  实现3个节点通信

 四、安装docker

五、安装kubernetes环境

1)  更改机器的hostname

2)  给每台机器配置主机解析

3)  同步三台机器的时间

4) 关闭swap

5) 关闭selinux

6) 配置网络

Ⅰ. 将每个节点上的流量链接到iptables

Ⅱ. 开启ipvs

六、构建kubernetes集群

使用kubeadm初始化k8s节点

踩坑指南


一、安装vmware 15 pro

vmware 15pro:

网盘链接:https://pan.baidu.com/s/1AJql4cp__6mPxMzwQMjecA 
提取码:9cny 

centos 7

链接:https://pan.baidu.com/s/1Ukgghq0-Grkmc76lJE6VEA 
提取码:yf3c 

二、安装centos 7

 

 

 

 采用桥接网络:

 

 vmdk文件放在刚安装的目录里即可:

 

 点击完成,继续编辑虚拟机, 选择centos7的iso镜像:

安装,选择第一个:

 选择中文:

 选择软件:

 安装桌面:

选择网络,因为网络是桥接的,ip地址与windows网络ip在同一个子网下, 

 

 windows系统的ip为:192.168.31.166

 设置root用户名和密码:

 也可以添加其他非root用户,设置完成后,等待安装完成即可:

 安装完成后,重启。

 点击同意许可: 

 

 设置密码:

 配置完成后,即可访问外网, 采用ifconfig命令查看:

三、复制虚拟机

1) 复制二个节点命名为node1和node2

虚拟机---> 管理---> 克隆:

 

 克隆的前提要保证磁盘的空间够用,等待克隆完成即可。

 修改新克隆出来的mac地址:

 

 重新生成mac:

 重复上述步骤1)一共生成3个节点即可, 同样需要修改mac地址:

 2)  实现3个节点通信

如果复制后的节点的IP地址是一样的,那么需要修改其他2个节点的IP地址,实现3个节点通信,那么只要这3个节点在同一个子网下即可,  我克隆出来的2个节点node2和node3的ip正好和node1在同一个局域网下,那么就不需要修改了。

ip地址配置
k8s-node1192.168.31.1302核4处理器,8G运行内存,40G硬盘
k8s-node2192.168.31.1312核4处理器,8G运行内存,40G硬盘
k8s-node3192.168.31.1322核4处理器,8G运行内存,40G硬盘

修改node2,node3的配置文件ifcfg-ens33, 具体所在路径为: /etc/sysconfig/network-scripts/ifcfg-ens33:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
IPADDR=192.168.31.130
NETMASK=255.255.255.0
DNS1=8.8.8.8
NM_CONTROLLED=no
GATEWAY=192.168.31.1
UUID="379d7ecb-87f9-4629-8ec1-1e7ef7632261"
DEVICE="ens33"
ONBOOT="yes"
ZONE=public

 修改完毕后,重启network, service network restart , 然后测试节点之间是否可以通信。

 
节点之间可以通信了,我们接着安装kubernetes需要的docker环境。

 四、安装docker

执行命令:

yum -y install docker-ce-18.06.3.ce-3.el7

等待安装完, 创建/etc/docker/daemon.json文件,配置镜像加速服务,我用的是七牛,也可以用阿里云等镜像加速服务。

[root@MiWiFi-R4A-srv etc]# cd /etc/docker/
[root@MiWiFi-R4A-srv docker]# ls
[root@MiWiFi-R4A-srv docker]# vim daemon.json
[root@MiWiFi-R4A-srv docker]# cat daemon.json 
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]} 

[root@MiWiFi-R4A-srv docker]# sudo systemctl daemon-reload
[root@MiWiFi-R4A-srv docker]# sudo systemctl daemon restart
Unknown operation 'daemon'.
[root@MiWiFi-R4A-srv docker]# sudo systemctl docker restart
Unknown operation 'docker'.
[root@MiWiFi-R4A-srv docker]# sudo systemctl restart docker
[root@MiWiFi-R4A-srv docker]# docker ps
CONTAINER ID   IMAGE     COMMAND   CRE 

更新完damon.json后,注意需要重新reload配置才能失效:

systemctl daemon-reload

        如果能用docker ps命令说明docker启动成功了,如果不行那么检查配置并修改正确,再重启docker服务即可。 

五、安装kubernetes环境

        接下来我们要将三台机器搭建成一个集群。

1)  更改机器的hostname

         一切比较顺利的走到了这里,为了后续搭建集群,我们可以先把host名字改一下,三台服务器的配置,可以设置成1主2从,node0设置为master,分别修改三台机器的host,设置hostname的命令如下,<hostname>为参数

sudo hostnamectl set-hostname <hostname>

设置node0的hostname为k8s-node1, 后续把node1作为k8s集群的主节点。

同样的方式设置node2和node3。

2)  给每台机器配置主机解析

然后将三台机器的ip地址和hostname设置到/etc/hosts文件里,我们可以之间在每台机器的终端执行如下命令: 

cat >> /etc/hosts << EOF
192.168.31.130 k8s-node1
192.168.31.131 k8s-node2
192.168.31.132 k8s-node3
EOF


3)  同步三台机器的时间

分别在三台机器上执行如下命令同步时间: 

yum install ntpdate -y

ntpdate time.windows.com

时间更新一致后,我们需要关闭selinux和swap。

4) 关闭swap

kubernetes安装前一定要关闭swap,否则在安装的时候会报错, 在每台机器上执行如下命令:

sudo swappof -a

但这样的方式是临时关闭的,重启会失效,如果想永久关闭,那么在每台机器上执行如下命令:

vi /etc/fstab

将最后一行关于swap分区的行注释掉。

5) 关闭selinux

centos是默认开启selinux, 如果不关闭会出现很多端口默认不开放的问题,因此我们要把/etc/selinux/config文件里的SELINUX值设置为disabled。

#vi /etc/selinux/config

将配置文件里的SELINUX=enforcing改为SELINUX=disabled 

 重启后配置生效。

6) 配置网络

Ⅰ. 将每个节点上的流量链接到iptables

在每台机器上执行如下命令:

  • 创建 /etc/sysctl.d/k8s.conf文件,输入配置

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

  • 加载br_netfilter模块, br_netfilter模块是linux的一个网络防火墙一般用在网桥上,能够提供网络传输的安全性。

modprobe br_netfilter

配置完成后,使用如下命令生效:

sysctl --system

执行过程如下:

[root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf << EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> vm.swappiness = 0
> EOF

[root@k8s-master ~]# cat /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                146976  1 br_netfilter
[root@k8s-master ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /usr/lib/sysctl.d/60-libvirtd.conf ...
fs.aio-max-nr = 1048576
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
* Applying /etc/sysctl.conf ...
[root@k8s-master ~]# 

Ⅱ. 开启ipvs

        kubernetes提供2种网络模型,一种是基于iptables,一种基于ipvs, 由于ipvs的性能要比iptables要好,那么我们在每个节点上安装ipset和ipvsadm, 每个节点逐行执行命令:

yum install ipset

yum install ipvsadm

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

我们接着给每台机器安装kubernetes环境,为后续构建集群环境打基础。

六、构建kubernetes集群

安装kubeadm、kubelet、kubectl工具, 选择版本1.18.0

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

 配置docker的driver为systemed,然后使kubelet生效, 开机自启:

systemctl enable kubelet

使用kubeadm初始化k8s节点

1) 接着检查kubelet的版本, 因为我们使用kubeadm初始化kubernetes时会需要指定kubernetes的version, 直接输入Kubelet就能查看版本。

 kubelet版本为: v1.18.6

2) 确保kubelet 的服务是开启状态的。首先可以用  systemctl status kubelet命令查看kubelet是否为running状态 。

systemctl status kubelet

接着Docker ps命令查看kubelet相关的容器是否启动成功: 

或者使用kubelet命令查看是否启动成功,如果报错: "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"cgroupfs\" is different from docker cgroup driver: \"systemd\""

最新版的docker的daemon.json中的cgroup driver修改为cgroupfs即可。

3)  指定的api-server-adverties-address一定要为本机的ip地址, 镜像仓库使用阿里云

  --image-repository registry.aliyuncs.com/google_containers \

4)   --kubernetes-version v1.18.6 的版本一定要与kubelet查看的版本一致!

k8s-node1:

kubeadm init \
  --apiserver-advertise-address=192.168.31.130 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.6 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

如果看到successfully! 的字样,那么说明初始化成功!

然后终端打印出的信息给了提示,如果你要启用的集群,那么执行如下命令来初始化 K8s相关配置

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

接下来就能让其他机器的节点follow master节点, 这里选择让node1作为master节点,那么直接在node2节点的命令行里执行 join操作。

如上图显示已经node2 join node1 成功, 在node1的命令行里查看node:

kubectl get nodes

但是在node2里给了一个警告:

    [WARNING Hostname]: hostname "k8s-node2" could not be reached
    [WARNING Hostname]: hostname "k8s-node2": lookup k8s-node2 on 8.8.8.8:53: no such host

暂时可以不用管,应该是DNS的配置问题,没有解析到主机。

同样的在node3节点执行:

 2个节点join成功后,在node1查看

 至此,k8s集群搭建成功!

踩坑指南

1)  如果执行失败,那么需要删除 /etc目录下的 kubernetes/目录和  /var/lib目录下的etcd/目录下的所有文件,删除完毕后,再重新执行即可。

注意,如果重新初始化kubeadmin,那么需要把 .kube目录删除后再初始化,然后再重新创建.kube目录,否则会出现报错,已踩坑~!

如果执行过程中出现问题    - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

另外自备一份重置k8s的shell脚本,即使在搭建过程中出错,它能帮你重新搭建kubernetes集群。

vim clean-k8s.sh
rm -rf /etc/kubernetes
rm -rf /var/lib/etcd
kubeadm  reset
rm -rf .kube/
echo "clean up !"

授权:

chmod +x clean-k8s.sh

2)  我建议在node1上装好所有需要环境后,再用虚拟机按照node1克隆出一份完整的机器当node2和node3,这样能少配置和安装很多东西。

参考:k8s集群环境的搭建 · 语雀

Logo

开源、云原生的融合云平台

更多推荐