网络上的教程在安装网络插件的时候,总会出问题,遂出此手把手教程.
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
|