我们把需要的镜像下载好,安装到每个机器的docker中加载进去就行了。至于另一个私有镜像仓库,可以换成阿里云,或者docker hub都行,这样就可以节省下来两台服务器内存了。注意3台机器内存和磁盘大小都要大一点,内存最少4g,磁盘最少100g
1、这两个安装方式是一样的
知乎的这个还行 2021年Kubernetes(k8s)服务集群安装部署
csdn 的这个也还行 Kubernetes(K8S)集群部署搭建图文教程(最全)
2、目前看来这个说的还是比较清楚的
3、当然现在也有很多k8s集群的安装脚本或者说图形化界面的安装方式
但是我个人还是觉得最好还是自己先用原生的方式安装一下,后续使用其他人的工具安装在出现问题时可以知道如何解决。
1、现在最新版本已经到1.23.x了,后续个人建议还是安装1.20.x以上的版本。
2、至于本文的1.17.4,因为已经写了好久了,所以大家可以部署这个版本,了解下整个流程,然后选择安装1.20.x的版本还是就是这个版本都可以。
kubernetes集群大体上分为两类:一主多从和多主多从。
说明:为了测试简单,本次搭建的是 一主两从 类型的集群
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
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
# 修改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模块。
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
1、这一部分就不再多说了,可以参考阿里社区的一篇文章 CentOS7 安装 Docker
2、安装完成后,添加一个配置文件,Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs,而下面哪一行就是配置阿里云的镜像加速地址,大家可以登录自己的阿里云docker镜像后台,获取配置,我上面的那篇文章有说明。修改后再重启docker
# 修改文件,添加配置
vim /etc/docker/daemon.json
# 主要添加如下内容
"exec-opts": ["native.cgroupdriver=systemd"],
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
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
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
docker images
4、至于后面如果需要单个的镜像,你就先从阿里云拉取下来,再重新打一个标签即可。当然最好打完以后上传到自己的公司私服,这样一劳永逸了,就不用每个机器都要做一边了。网上还有很多其他的解决方案,这里就不再说了,大家可以自己去找下,比如,这一篇 Kubernetes国内镜像、下载安装包和拉取gcr.io镜像
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修改)
其实这部分就是上面命令,只不过我们没有使用文件,而且直接修改指定参数后而其他配置都默认执行的,后期如果用到这个初始化的配置文件的时候,可以按照下面的方式
你看下这个文件内容,就可以看出来,就是初始化的配置,比如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
1、执行上文的那个加入节点命令,如果你没有记住那个命令,可以使用以下命令再生成一个
# 当然这个再生成的命令肯定是要在master节点上执行的。
kubeadm token create --print-join-command
2、那我这里就用这个新生成的在node01和node02上执行
因为上面初始化的那个我确实也忘记了。尴尬.jpg
3、在master节点查看集群情况,发现已经有了,但是此时的集群状态为NotReady,这是因为还没有配置网络插件
kubectl get node
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
kubectl apply -f kube-flannel.yml
5、查看创建是否成功,因为刚刚的 kube-flannel.yml
配置文件中已经指定了 名称空间是 kube-system
,所以我们去这下面看
6、再次查看集群节点情况,已经read了。
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
,我们就可以用浏览器访问了,或者在其他节点上访问都是可以的。
1、其实安装下来,真正的安装步骤很少,总结下来就三步骤,可以根据我的目录看一下,真正的安装步骤就是
kubeadm init
初始化集群kubeadm join
1、这一章大家可以随意,不安装的话就使用命令行,或者用k8s原生的页面控制,不过原生的页面控制台不太好用,我个人还是建议安装一下这个。
2、关于这个我也有在k8s系列文章中提起 (十一)k8s其它帮助&&单节点部署 这里就不再重复啰嗦了,而且官方文档还是中文的,也很详细。