网络上的教程在安装网络插件的时候,总会出问题,遂出此手把手教程.

k8s集群搭建/k8s安装安装网络插件
1
   | Kubernetes 简称 k8s,是用 8 来代替 8 个字符 “ubernete” 的缩写
   | 
 
k8s 集群大体上分为两大类:
- 一主多从:一台 master 节点和多台 node 节点,搭建比较简单,但是有可能出现 master 单机故障
 
- 多主多从: 多台 master 节点和多台 node 节点,搭建比较麻烦,但是安全性高
1
   | 不管是 一主多从 异或者是 多主多从 ,这里至少都是需要三台服务器,而且每台服务器的规格至少得在 2G内存 2颗CPU 配置起步;  
   | 
 
手把手开始搭建:
1,环境配置
1.1 主机名解析
我这里有三台服务器,ip和角色分配如下:  
| 序号 | 
ip | 
角色 | 
| 1 | 
192.168.161.111 | 
master | 
| 2 | 
192.168.209.156 | 
node1 | 
| 3 | 
192.168.209.157 | 
node2 | 
为了集群节点间的直接调用,我们需要配置一下主机名解析,分别在三台服务器上编辑 /etc/hosts,添加一下内容:  
1 2 3
   | 192.168.161.111 master 192.168.209.156 node1 192.168.209.157 node2
   | 
 
1.2 同步时间
集群中的时间必须要精确一致,我们可以直接使用chronyd服务从网络同步时间,三台服务器需做同样的操作  
1 2
   | systemctl start chroynd  systemctl enable chroynd
   | 
 
1.3 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。三台虚拟机需做同样操作
1 2 3 4 5 6
   | # 关闭firewalld服务 systemctl stop firewalld  systemctl disable firewallld # 关闭iptables服务 systemctl stop iptables systemctl disable iptables
   | 
 
1.4 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
1 2 3 4
   | # 永久关闭 sed -i 's/enforcing/disabled/' /etc/selinux/config # 临时关闭 setenforce 0
   | 
 
1.5 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用启用swap设备会对系统的性能产生非常负面的影响,
因此kubernetes要求每个节点都要禁用swap设备但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
1 2 3 4
   | # 永久关闭 ,注释掉swap那一行 vim /etc/fstab # 临时关闭 swapoff -a
   | 
 
1.6 修改Linux的内核参数
我们需要修改linux的内核参数,添加网桥过滤和地址转发功能,
编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置
1 2 3
   | net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
   | 
 
添加后进行以下操作:
 
1 2 3 4 5 6
   | # 重新加载配置 sysctl -p # 加载网桥过滤模块 modprobe br_netfilter # 查看网桥过滤模块是否加载成功 lsmod | grep br_netfilter
   | 
 
1.7 配置 ipvs 功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的 相比较的话,
ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | # 安装ipset和ipvsadm yum install ipset ipvsadmin -y
  # 添加需要加载的模块写入脚本文件 cat <<EOF > /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF
  # 为脚本文件添加执行权限 chmod +x /etc/sysconfig/modules/ipvs.modules  /bin/bash /etc/sysconfig/modules/ipvs.modules # 查看对应的模块是否加载成功  lsmod | grep -e ip_vs -e nf_conntrack_ipv4
   | 
 
完成以上配置后重启服务器 :
2,docker安装
- 1.Linux要求内核3.0以上
 
- 2.CentOS 7
 
2.1 环境查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | #系统内核要求3.0以上 [root@localhost ~]# uname -r 3.10.0-1062.el7.x86_64
  #系统版本 [root@localhost ~]# cat /etc/os-release  NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/"
  CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
 
   | 
 
2.2 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
   | #1.卸载旧版本  yum remove docker \ >                   docker-client \ >                   docker-client-latest \ >                   docker-common \ >                   docker-latest \ >                   docker-latest-logrotate \ >                   docker-logrotate \ >                   docker-engine
  #2.需要的安装包 yum install -y yum-utils
  #3.设置镜像的仓库 yum-config-manager \     --add-repo \     https://download.docker.com/linux/centos/docker-ce.repo #上述方法默认是从国外的,不推荐
  #推荐使用国内的 yum-config-manager \     --add-repo \     https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    #更新软件包索引 yum makecache fast
  #4.安装docker docker-ce 社区版 而ee是企业版 yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可
  #5.启动docker systemctl start docker
  #6.使用docker version 查看是否安装成功 docker version
  #7.测试 docker run hello-world
  #8.查看一下下载的hello-world镜像 [root@localhost /]# docker images REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE hello-world         latest              bf756fb1ae65        5 months ago        13.3kB
 
   | 
 
3,k8s集群初始化
3.1 由于 kubernetes 的镜像源在国外,速度比较慢,因此我们需要切换成国内的镜像源
1 2 3 4 5 6 7 8 9 10
   | # 编辑 /etc/yum.repos.d/kubernetes.repo 添加一下配置 vim /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
   | 
 
3.2 然后安装kubeadm、kubelet和kubectl 三个组件
1
   | yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
   | 
 
3.3 配置 kubelet 的group
1 2 3
   | # 编辑 /etc/sysconfig/kubelet,添加下面的配置 KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
   | 
 
3.4 初始化集群,仅在master上执行此步骤
1 2 3 4 5 6 7 8 9 10 11 12 13
   | # 创建集群 # 由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址 [root@master ~]# kubeadm init \ --apiserver-advertise-address=192.168.161.1111 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version=v1.17.4 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 
  #使用 kubectl 工具 [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
   | 
 
3.5 把node节点加入集群
1 2 3
   | # token 在上一步的结果中 kubeadm join 192.168.108.100:6443 --token xxx \  --discovery-token-ca-cert-hash sha256:xxx
   | 
 
3.6 安装网络插件,这一步也是很多教程都会出错的地方
kubernetes支持多种网络插件,比如flannel、calico、canal等等,这里选择使用flanne
下载 flanneld-v0.13.0-amd64.docker :下载地址
下载完成后,上传至 master 服务器 执行以下命令
1 2 3
   | docker load < flanneld-v0.13.0-amd64.docker # 查看镜像,flannel docker images
   | 
 
然后我们需要获取flannel的配置文件来部署 flannel 服务
1 2
   | # 这里往往会失败,往下看 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
   | 
 
但是由于众所周知的网络的原因,这个文件并不能保证网络插件安装成功,所以我在这里准备了一个文件,镜像地址已经更换阿里数据源;
1 2 3 4 5 6
   | wget https://github.com/BugKillerPro/blog_config_files/blob/main/kube-flannel.yml
  # 使用配置文件启动fannel kubectl apply -f kube-flannel.yml # 查看集群节点的状态 kubectl get nodes
   | 
 

STATUS全部Ready就成功了,网上的其他教程,问题大都无法全部Ready.
3,k8s集群测试
集群已搭建完成,我们再创建一个Nginx服务测试下
1 2 3 4 5 6
   | #创建一个nginx服务 kubectl create deployment nginx  --image=nginx:1.14-alpine #暴露端口 kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort #查看服务 kubectl get pod,svc
   | 
 

