从零搭建kubernetes v1.18.6集群
Posted Dream_it_possible!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零搭建kubernetes v1.18.6集群相关的知识,希望对你有一定的参考价值。
目录
一、安装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-node1 | 192.168.31.130 | 2核4处理器,8G运行内存,40G硬盘 |
k8s-node2 | 192.168.31.131 | 2核4处理器,8G运行内存,40G硬盘 |
k8s-node3 | 192.168.31.132 | 2核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,这样能少配置和安装很多东西。
以上是关于从零搭建kubernetes v1.18.6集群的主要内容,如果未能解决你的问题,请参考以下文章
从零开始搭建kubernetes集群环境(虚拟机/kubeadm方式)
云原生 | 从零开始学Kubernetes二使用kubeadm搭建K8S集群
Kubernetes第二篇:从零开始搭建k8s集群(亲测可用)
Kubernetes第二篇:从零开始搭建k8s集群(亲测可用)