(二)k8s集群安装

一、前言

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

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

  • 知乎的这个还行 2021年Kubernetes(k8s)服务集群安装部署

  • csdn 的这个也还行 Kubernetes(K8S)集群部署搭建图文教程(最全)

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

  • 记一次在centOS-7上搭建K8S集群环境搭建的过程,本文大多都是参考他安装方式,整理一下遇到的问题,以及相关过程,和后面第三方可视化工具的管理安装使用。

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

  • 第一种方式:使用 KuboardSpray 安装kubernetes_v1.23.1
  • 第二种方式:kubeasz安装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 操作系统 配置
Master 192.168.160.170 Centos7.9 基础设施服务器 4颗CPU 4G内存 100G硬盘
Node1 192.168.160.171 Centos7.9 基础设施服务器 2颗CPU 2G内存 100G硬盘
Node2 192.168.160.172 Centos7.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

(二)k8s集群安装_第1张图片
3、修改完成后测试是否正常,没一台都测试一下,避免后面安装的时候再发现问题,可就难受了。
(二)k8s集群安装_第2张图片
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

(二)k8s集群安装_第3张图片
6、禁用selinux,selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

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

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

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

(二)k8s集群安装_第5张图片
(二)k8s集群安装_第6张图片
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

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

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

(二)k8s集群安装_第9张图片

  • 添加需要加载的模块写入脚本文件
# 编辑文件
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

(二)k8s集群安装_第10张图片
(二)k8s集群安装_第11张图片

  • 重启服务器
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"],

(二)k8s集群安装_第12张图片
(二)k8s集群安装_第13张图片

3、最后这次实验中,我安装的版本是 20.10.16
(二)k8s集群安装_第14张图片

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

在这里插入图片描述
(二)k8s集群安装_第15张图片

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

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

  • 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"

(二)k8s集群安装_第16张图片

4、设置kubelet开机自启

systemctl enable kubelet

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

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

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

kubeadm config images list

(二)k8s集群安装_第17张图片
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

(二)k8s集群安装_第18张图片
(二)k8s集群安装_第19张图片
3、查看镜像是否正确

docker images

(二)k8s集群安装_第20张图片
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里面设置了污点,你都可以修改后,执行(二)k8s集群安装_第21张图片

(二)k8s集群安装_第22张图片

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

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

(二)k8s集群安装_第24张图片
4、可以看下那个授权文件的内容,里面可以看到名称信息,这一部分我k8s系列文章里面有说

cat config

(二)k8s集群安装_第25张图片

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

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

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

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

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

(二)k8s集群安装_第26张图片
(二)k8s集群安装_第27张图片
3、在master节点查看集群情况,发现已经有了,但是此时的集群状态为NotReady,这是因为还没有配置网络插件

kubectl get node

(二)k8s集群安装_第28张图片

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

(二)k8s集群安装_第29张图片
4、使用根据k8s的kubectl 根据yml文件创建容器

kubectl apply -f kube-flannel.yml

(二)k8s集群安装_第30张图片
5、查看创建是否成功,因为刚刚的 kube-flannel.yml 配置文件中已经指定了 名称空间是 kube-system,所以我们去这下面看
(二)k8s集群安装_第31张图片
6、再次查看集群节点情况,已经read了。
(二)k8s集群安装_第32张图片

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

(二)k8s集群安装_第33张图片
2、我们通过查看svc 已经看出了,里面外部暴露的端口是 32122,我们就可以用浏览器访问了,或者在其他节点上访问都是可以的。
(二)k8s集群安装_第34张图片

2.3.8、安装总结

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

  • 2.3.5章节在master节点使用kubeadm init 初始化集群
  • 2.3.6章节使用 kubeadm join
  • 2.3.7章节安装网络插件
    (二)k8s集群安装_第35张图片
    2、至于其他步骤,都是系统环境的配置和镜像的处理,大家看章节名称都能看出来。

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

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

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

你可能感兴趣的:(k8s,docker,k8s)