一、前言

我们把需要的镜像下载好,安装到每个机器的docker中加载进去就行了。至于另一个私有镜像仓库,可以换成阿里云,或者docker hub都行,这样就可以节省下来两台服务器内存了。注意3台机器内存和磁盘大小都要大一点,内存最少4g,磁盘最少100g

1、这两个安装方式是一样的

2、目前看来这个说的还是比较清楚的

3、当然现在也有很多k8s集群的安装脚本或者说图形化界面的安装方式

但是我个人还是觉得最好还是自己先用原生的方式安装一下,后续使用其他人的工具安装在出现问题时可以知道如何解决。

二、安装(安装版本1.17.4)

1、现在最新版本已经到1.23.x了,后续个人建议还是安装1.20.x以上的版本。

2、至于本文的1.17.4,因为已经写了好久了,所以大家可以部署这个版本,了解下整个流程,然后选择安装1.20.x的版本还是就是这个版本都可以。

2.1、集群类型

kubernetes集群大体上分为两类:一主多从和多主多从。

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

说明:为了测试简单,本次搭建的是 一主两从 类型的集群

2.2、主机规划

1、各个机器配置

作用ip操作系统配置
Master192.168.160.170Centos7.9 基础设施服务器4颗CPU 4G内存 100G硬盘
Node1192.168.160.171Centos7.9 基础设施服务器2颗CPU 2G内存 100G硬盘
Node2192.168.160.172Centos7.9 基础设施服务器2颗CPU 2G内存 000G硬盘

2、相关网络配置

IPADDR=xxxxxx
NETMASK=255.255.255.0
GATEWAY=192.168.160.2

3、DNS

nameserver 8.8.8.8
nameserver 114.114.114.114

在这里插入图片描述

2.3、安装

2.3.1、环境初始化(所有节点都需要做的)

1、检查操作系统的版本,因为此方式下安装kubernetes集群要求Centos版本要在7.5或之上(否则存在node节点无法加入master的情况)

cat /etc/redhat-release

在这里插入图片描述
2、主机名解析,为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.160.170  master
192.168.160.171  node1
192.168.160.172  node2

在这里插入图片描述
3、修改完成后测试是否正常,没一台都测试一下,避免后面安装的时候再发现问题,可就难受了。
在这里插入图片描述
4、时间同步,kubernetes要求集群中的节点时间必须精确一致,这里使用 NTP同步网络时间,当然如果你是内网,不能链接外网,那你最好搭建一个企业内部的时间同步服务器,其他机器都从这台时间服务器同步,保证完全一致。

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
yum install ntp -y //安装ntp服务

systemctl enable ntpd //开机启动服务

systemctl start ntpd //启动服务

timedatectl set-timezone Asia/Shanghai //更改时区

timedatectl set-ntp yes //启用ntp同步

ntpq -p //同步时间

5、禁用iptables和firewalld服务,kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

对于生产环境,这边还没有尝试过关闭防火墙,因为这边部署的k8s一般都是给企业的内部测试环境使用的,正式的都是买的华为云或者阿里云提供的k8s服务,所以,这一步在生产环境,大家可以上网了解一下。

# 1 关闭firewalld服务 并禁止开启启动
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 关闭iptables服务 并禁止开启启动
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables

在这里插入图片描述
6、禁用selinux,selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
vim /etc/selinux/config
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
# 重启服务器
reboot

在这里插入图片描述
7、禁用swap分区,swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
vim /etc/fstab
# 注意修改完毕之后需要重启linux服务
reboot

在这里插入图片描述
在这里插入图片描述
8、修改linux的内核参数

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件
vim /etc/sysctl.d/kubernetes.conf

# 添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

# 重新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter

在这里插入图片描述
在这里插入图片描述
9、配置ipvs功能,在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的(这两种方式我k8s系列的文章中有说到),两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。

  • 安装ipset和ipvsadm
yum install ipset ipvsadmin -y

在这里插入图片描述

  • 添加需要加载的模块写入脚本文件
# 编辑文件
vim  /etc/sysconfig/modules/ipvs.modules
# 添加以下shell脚本内容

#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

在这里插入图片描述
在这里插入图片描述

  • 重启服务器
reboot

2.3.2、安装docker(所有节点都需要做的)

1、这一部分就不再多说了,可以参考阿里社区的一篇文章 CentOS7 安装 Docker

2、安装完成后,添加一个配置文件,Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs,而下面哪一行就是配置阿里云的镜像加速地址,大家可以登录自己的阿里云docker镜像后台,获取配置,我上面的那篇文章有说明。修改后再重启docker

# 修改文件,添加配置 
vim /etc/docker/daemon.json

# 主要添加如下内容
"exec-opts": ["native.cgroupdriver=systemd"],

在这里插入图片描述
在这里插入图片描述

3、最后这次实验中,我安装的版本是 20.10.16
在这里插入图片描述

2.3.2、安装kubernetes组件(所有节点都需要做的)

1、切换镜像源为国内源, 因为kubernetes的镜像源在国外,速度比较慢,所以这里切换成国内的镜像源

# 编辑 /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

在这里插入图片描述
在这里插入图片描述

2、安装kubeadm、kubelet和kubectl,这里顺便说一下这三者的作用

  • kubeadm:kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署:1、创建一个 Master 节点 kubeadm init 2、将一个 Node 节点加入到当前集群中 kubeadm join <Master节点的IP和端口 >

  • kubectl:kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署,比如kubectl get pod, kubectl get svc 等等。

  • kubelet:master派到node节点代表,管理本机容器

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

在这里插入图片描述

3、配置kubelet的cgroup,其中KUBELET_EXTRA_ARGS=是你安装后就有的,先不用动。

# 编辑/etc/sysconfig/kubelet
vim /etc/sysconfig/kubelet

# 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

在这里插入图片描述

4、设置kubelet开机自启

systemctl enable kubelet

在这里插入图片描述
5、这个时候 kubeletkubeadm就可以用了。

2.3.4、准备集群镜像(所有节点都需要做的)

1、在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看,这个查看需要那些镜像和版本很重要的,后面写脚本替换镜像要用到。

kubeadm config images list

在这里插入图片描述
2、下载镜像,此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案,就是我们现在阿里云的仓库中下载对应的k8s组件,然后我们再给这些镜像,重新打一个tag,打成 k8s的,这样就有了,脚本如下,其中k8s的镜像前缀仓库名称是k8s.gcr.io

# 新建脚本文件
vim replaceImage.sh
# 内容如下

#!/bin/bash

# 前面我们查看版本需要的那些镜像
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)

# 遍历 从阿里云下载,在重新打标签成k8s的。
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi  registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

# 赋予运行权限
chmod +x ./replaceImage.sh
# 运行
./replaceImage.sh

在这里插入图片描述
在这里插入图片描述
3、查看镜像是否正确

docker images

在这里插入图片描述
4、至于后面如果需要单个的镜像,你就先从阿里云拉取下来,再重新打一个标签即可。当然最好打完以后上传到自己的公司私服,这样一劳永逸了,就不用每个机器都要做一边了。网上还有很多其他的解决方案,这里就不再说了,大家可以自己去找下,比如,这一篇 Kubernetes国内镜像、下载安装包和拉取gcr.io镜像

2.3.5、集群初始化(只需要在master节点上做就行)

1、在master节点(192.168.160.170),上执行初始化命令

kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.160.170(你自己的masterIP地址,需要根据你自己的master机器ip修改)

其实这部分就是上面命令,只不过我们没有使用文件,而且直接修改指定参数后而其他配置都默认执行的,后期如果用到这个初始化的配置文件的时候,可以按照下面的方式print到文件里面,然后根据我们上面修改的参数替换一下就行了(后面设置k8s的版本为100年的时候,是需要这个当初的初始化配置文件的),或者一开始就按照下面的方式,先把配置信息打印到一个文件中,修改指定参数后,再指定这个配置文件来执行。
你看下这个文件内容,就可以看出来,就是初始化的配置,比如k8s的版本,master里面设置了污点,你都可以修改后,执行在这里插入图片描述

在这里插入图片描述

2、运行结果,主力圈出来的是很重要的,第一个就是我们初始化成功了,第二个就是我们需要为常规用户做一些事情,就是处理授权文件,第三个就是其他子节点加入我们集群需要执行的命令,注意其中的token就是凭证
在这里插入图片描述

3、创建必要文件,登录授权文件,默认是在 当前用户家目录下的.kube目录 (还是在master节点执行以下命令偶)

# 创建
mkdir -p $HOME/.kube
# copy一个admin的配置权限
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修改文件权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述
4、可以看下那个授权文件的内容,里面可以看到名称信息,这一部分我k8s系列文章里面有说

cat config

在这里插入图片描述

2.3.6、将node节点加入集群(只需要在node01,node02节点上做就行)

1、执行上文的那个加入节点命令,如果你没有记住那个命令,可以使用以下命令再生成一个

# 当然这个再生成的命令肯定是要在master节点上执行的。
kubeadm token create --print-join-command

在这里插入图片描述
2、那我这里就用这个新生成的在node01和node02上执行

因为上面初始化的那个我确实也忘记了。尴尬.jpg

在这里插入图片描述
在这里插入图片描述
3、在master节点查看集群情况,发现已经有了,但是此时的集群状态为NotReady,这是因为还没有配置网络插件

kubectl get node

在这里插入图片描述

2.3.6、安装网络插件(只需要在master节点上做就行)

1、在上面我已经看到集群状态为 NotReady,这是因为还没有配置网络插件,所以我们安装一下。

2、kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel

3、下载kube-flannel.yml 文件模板,如下wget 下载不下来,用浏览器直接访问,然后另存为也行。

 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

在这里插入图片描述
4、使用根据k8s的kubectl 根据yml文件创建容器

kubectl apply -f kube-flannel.yml

在这里插入图片描述
5、查看创建是否成功,因为刚刚的 kube-flannel.yml 配置文件中已经指定了 名称空间是 kube-system,所以我们去这下面看
在这里插入图片描述
6、再次查看集群节点情况,已经read了。
在这里插入图片描述

2.3.7、测试,部署nginx镜像

1、运行一个nginx镜像,名称空间默认是 default,加不加都行。

# 创建一个nginx的 deploment 
kubectl create deployment nginx --image=nginx:1.14-alpine

# 为nginx创建一个 nodePort的svc ,让其可以被外部访问
kubectl expose deployment nginx --port=80 --type=NodePort

在这里插入图片描述
2、我们通过查看svc 已经看出了,里面外部暴露的端口是 32122,我们就可以用浏览器访问了,或者在其他节点上访问都是可以的。
在这里插入图片描述

2.3.8、安装总结

1、其实安装下来,真正的安装步骤很少,总结下来就三步骤,可以根据我的目录看一下,真正的安装步骤就是

  • 2.3.5章节在master节点使用kubeadm init 初始化集群
  • 2.3.6章节使用 kubeadm join <Master节点的IP和端口 >
  • 2.3.7章节安装网络插件
    在这里插入图片描述
    2、至于其他步骤,都是系统环境的配置和镜像的处理,大家看章节名称都能看出来。

2.4、开源免费的页面管理工具(Kuboard)安装部署

1、这一章大家可以随意,不安装的话就使用命令行,或者用k8s原生的页面控制,不过原生的页面控制台不太好用,我个人还是建议安装一下这个。

2、关于这个我也有在k8s系列文章中提起 (十一)k8s其它帮助&&单节点部署 这里就不再重复啰嗦了,而且官方文档还是中文的,也很详细。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐