Kubeadm搭建K8S集群
-
搭建集群的方式有很多种:kubeadm、minikube、二进制安装 (利用 k8s 官方 github 仓库下载二进制包安装,安装过程较复杂,但相对较为稳定) 、命令行安装
这里我们为了测试,就使用kubeadm的方式做一个搭建演示
kubeadm搭建集群大致步骤
-
CentOS7虚拟机三台即可,配置允许小幅度降低2C-2G-30GB
-
服务器初始化操作(修改必要配置文件,关闭防火墙......等等)
-
三个节点安装 Docker 、 Kubelet 、kubeadm 、 Kubectl
-
在Master 节点执行 kubeadm init 命令进行初始化
-
在Workder节点执行 kubeadm join命令将node节点添加到当前的集群里面
-
配置网络插件
服务器初始化
-
192.168.239.120 [ master ]
-
192.168.239.130 [ node1 ]
-
192.168.239.140 [ node2 ]
-
检查操作系统的版本,kubeadm方式要求Centos版本要在7.5或之上
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
-
永久关闭防火墙(所有节点)
systemctl stop firewalld systemctl disable firewalld
-
永久关闭selinux(所有节点)
-
selinux是linux系统下的一个安全服务,不关闭会抛出很多问题
-
sed -i 's/enforcing/disabled/' /etc/selinux/config #或者: vim /etc/selinux/config , 设置SELINUX=disabled
-
永久关闭swap分区(所有节点)
-
swap分区指的是虚拟内存分区,物理内存使用完,之后将磁盘空间虚拟成内存来使用
-
vim /etc/fstab #/dev/mapper/centos-swap swap #注释掉该行
-
设置主机名(逐一设置)
-
hostnamectl set-hostname <hostname>
-
hostnamectl set-hostname master hostnamectl set-hostname node1 hostnamectl set-hostname node2
-
添加主机名解析
-
为了方便集群节点间的直接调用,在这个配置一下主机名解析:vim /etc/hosts
192.168.239.120 master 192.168.239.130 node1 192.168.239.140 node2
-
禁用iptable和firewalld服务
-
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
-
然后配置ipvs的方式替代iptable
-
systemctl stop firewalld systemctl disable firewalld systemctl stop iptables #可能部分系统没有自带iptables Server服务,没安装的话就不用管了 systemctl disable iptables
-
配置ipvs功能(所有节点)
-
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,
-
ipvs的性能要高一些,所以刚刚我们关了了iptabless服务,然后手动载入ipvs模块
-
[root@localhost ~]# yum install ipset ipvsadm -y [root@localhost ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF [root@localhost ~]# chmod +x /etc/sysconfig/modules/ipvs.modules #给脚本赋予执行权限 [root@localhost ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules #执行脚本 [root@localhost ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 #查看模块加载状态
-
集群所有节点时间同步
-
这里我们统一使用宿主机的时间 , 也可以使用chronyd服务从网络同步时间
-
yum install ntpdate -y ntpdate time.windows.com
操作完以上步骤后 , 最好能重启一下服务器,使得所有设置生效 reboot now
安装Docker
-
所有节点安装Docker、kubeadm、kubelet,这个三个环境,我们依次安装
-
因为kubenates默认的容器为Docker,所以首先我们安装Docker
yum install -y wget wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce-18.06.1.ce-3.el7 systemctl enable docker && systemctl start docker docker --version
-
设置Docker的镜像地址为国内阿里云
[root@localhost ~]# mkdir /etc/docker [root@localhost ~]# cat <<EOF> /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"] } EOF [root@master ~]# systemctl restart docker #重启并将docker设置为开机启动 [root@master ~]# systemctl enable docker
安装kubeadm,kubelet和kubectl(所有节点)
-
由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
[root@localhost ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF [root@localhost ~]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 [root@localhost ~]# systemctl enable kubelet
由于我们没有iptable转而使用的是ipvs,所以这里要配置一下kubelet如下
[root@master ~]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs" [root@node2 ~]# systemctl restart kubelet
Maser节点初始化
-
现在我们我们已经执行到大致步骤的第四步了,在master节点上初始化环境
-
由于K8S默认拉去镜像的地址是国外的,无法访问,我们将其地址修改为国内的阿里云地址
-
注意:--apiserver-advertise-address=192.168.239.120 这里得换成你自己的Master节点的IP地址
#将下面的这个命令折成一行,在master节点中执行即可
[root@master ~]# kubeadm init --apiserver-advertise-address=192.168.239.120 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
-
我们可以再开一个master节点的会话 , 可以看到Docker已经在开始工作了
-
当我们看到以上镜像已经全部拉取完毕后,我们可以看到执行kubeadm init...的会话有下面的提示,按照下图执行即可
-
在master节点执行这段代码
[root@master ~]# mkdir -p $HOME/.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
然后通过kubectl get nodes 看到如下一幕
[root@master ~]# kubectl get node NAME STATUS ROLES AGE VERSION master NotReady master 27m v1.18.0
Node节点加入集群
-
可见master已经加入到集群中了,下面我们在其他非master节点执行下面提示的代码
kubeadm join 192.168.239.120:6443 --token 3w6v9w.3w98bj8wkzobk1pc \ --discovery-token-ca-cert-hash sha256:816a6dde1f6b72dc66de332648ed87a1d02a000a7c6a1e8aa31e223587144675
-
然后我们再次在master节点通过执行 kubectl get nodes 看到如下一幕
[root@master ~]# kubectl get node NAME STATUS ROLES AGE VERSION master NotReady master 29m v1.18.0 node1 NotReady <none> 22s v1.18.0 node2 NotReady <none> 13s v1.18.0
-
此时两个node节点也已经加入集群中,但是可以发现状态status全部显示为NotReady,此时还缺最后一步,即可完成k8s集群的搭建
部署POD网络插件:CNI
-
如果有梯子的话 ,从官网指定的仓库获取部署文件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-
如果没有梯子的话,
-
因为没有梯子的原因,kube-flannel.yml中的有个镜像也会下载失败
-
-
提示:我已经将kube-flannel.yml中不能拉取的镜像替换为我们刚刚加载的flannel:v0.13.0-amd64了,可以直接部署
#将该镜像下载后在所有节点的docker中载入
[root@master /]# docker load < flanneld-v0.13.0-amd64.docker # K8S所有节点都需要加载该镜像 [root@master /]# kubectl apply -f ./kube-flannel.yml # Master 节点执行即可
-
然后获取系统命名空间下的pod运行情况
#如果 STATUS 全部为 Running 的话,则搭建成功 [root@master /]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-7ff77c879f-n9wqz 1/1 Running 0 94m coredns-7ff77c879f-pvw5j 1/1 Running 0 94m etcd-master 1/1 Running 0 95m kube-apiserver-master 1/1 Running 0 95m kube-controller-manager-master 1/1 Running 0 95m kube-flannel-ds-amd64-7f695 1/1 Running 0 50m kube-flannel-ds-amd64-q7d4j 1/1 Running 0 50m kube-flannel-ds-amd64-whwvx 1/1 Running 0 50m kube-proxy-4pc5n 1/1 Running 0 65m kube-proxy-gw67r 1/1 Running 0 94m kube-proxy-rqbgm 1/1 Running 0 65m kube-scheduler-master 1/1 Running 0 95m
-
-
我们再次获取节点信息,STATUS : Ready
[root@master /]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 120m v1.18.0 node1 Ready <none> 91m v1.18.0 node2 Ready <none> 91m v1.18.0
集群节点维护常用命令
-
master 查看集群节点数 :kubectl get nodes
-
master查看集群系统组件的情况:kubectl get pods -n kube-system -o wide
-
master 删除集群某个节点 :kubectl delete nodes nodeName
-
node节点被抛弃出集群,重置节点:kubeadm reset
-
如果是想重新搭建,master记得删除 $HOME/.kube 目录及其其下的所有数据
-
-
master欢迎新的节点,抛出橄榄枝:kubeadm token create --print-join-command
测试Kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
[root@master /]# kubectl create deployment nginx --image=nginx [root@master /]# kubectl expose deployment nginx --port=80 --type=NodePort [root@master /]# kubectl get pod,svc
然后访问该Nginx的服务,三台机器随意一台的ip : 31102 均可访问Nginx的服务
-
192.168.239.120:31102
-
192.168.239.130:31102
-
-