k8s集群搭建

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

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

完成以上配置后重启服务器 :

1
reboot

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 然后安装kubeadmkubeletkubectl 三个组件

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

img_1.png

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

img_2.png

img_3.png