【Kubernetes】第四篇 - k8s 集群环境搭建
前两篇,购买了 3 台阿里云服务器并完成了 ci-server 构建服务器的环境安装与配置;
三台服务器规划如下:
服务配置内网IP外网IP说明ci-server2c4g172.17.178.104182.92.4.158Jenkins + Nexus + Dockerk8s-master2c4g172.17.178.10547.93.9.45Kubernetes + Dockerk8s-node2c1g172.17.178.10639.105.58.35Kubernetes + Docker 本篇,配置 k8s-master 和 k8s-node 两台服务器,搭建 k8s 集群;
备注:考虑服务器成本使用 1 主+1 从的集群配置,有条件也可以使用 1 主 + 2 从;
kubernetes 简称 K8s,其中数字 8 指代中间的 8 个字符 ;K8s 是一个开源的,用于管理云平台上多个主机上的容器化的应用;K8s 的目标是让部署容器化的应用简单并且高效;K8s 提供了应用部署,规划,更新,维护的一种机制;K8s 是一个部署镜像的平台,可以用来调度多台机器上的的镜像部署操作; K8s 可以使用集群来组织服务器,集群中存在 1 个 Master 集群控制节点,负责调度集群中其他服务器的资源;除 master 之外的其他节点称为 Node;
大型互联网公司(如 Google),拥有上亿级别的 docker 容器,
容器维护涉及启动、停止、销毁、负载均衡、灾备、扩容等诸多问题需要解决,
因此传统的手工部署的方式就不切实际了,需要使用容器编排工具,而 k8s 目前是这个领域事实上的标准;
部署一个网站会涉及多个容器,可以通过 k8s 配置容器的部署、启动、关闭以及实现负载均衡;
以下配置,如未做特殊说明,则 k8s-master 和 k8s-node 默认都需要进行配置;
swap 分区:虚拟内存分区;
Swap 分区:是 Linux 的交换分区,当系统资源不足时,Swap 分区将会启用;
比如,1c1g 配置的服务器,当需要 2g 内存时,便会从硬盘借用空间当做内存使用(但速度会比内存慢);
搭建 k8s 集群:1 个 master + n 个 node;
当 master 资源不足时,新任务将自动调度到集群中的其他 node 节点处理,实现负载均衡,所以无需启用虚拟内存分区;
备注:k8s 虽然是一个集群架构,但单从表现上看和一台服务器是一样的:内存资源可以互相共享;
关闭 Selinux:达到支持容器访问宿主机的文件系统; Linux 部分权限比较严格,不方便操作
使用 ntpdate 统一系统的时间和时区,服务器时间与阿里云服务器保持一致;
实际操作:
备注:需要确保服务器之间的时间和时区一致,以避免执行定时任务时产生误差;
在 kubernetes 中,组件、服务均能够以 Docker 镜像的方式进行部署,需要 docker 环境支持;
device-mapper-persistent-data:存储驱动,Linux 上的许多高级卷管理技术;
lvm:逻辑卷管理器,用于创建逻辑磁盘分区使用;
在安装 docker 前,需要先配置 docker 安装源:
安装 docker-ce:
启动 docker 并设置为开机启动:
设置安装镜像源,使用阿里云镜像源:
实际操作:
重启 docker,完成配置文件的重新加载:
这样,docker 获取镜像时就会通过阿里云镜像仓库拉取,速度会快一些;
1,切换 k8s 下载源
指定 yum 安装 k8s 的下载地址为“阿里云”源:
2,安装 Kubernetes 核心组件 k8s 的三个核心组件:
kubelet:Kubernetes 核心组件。运行在集群所有节点上,负责创建、启动服务容器;kubectl:Kubernetes 的命令行工具。可以用来管理,删除,创建资源; kubeadm:用来初始化集群,子节点加入的工具; 注意:在不指定组件版本的情况下,默认会安装最新版本(此时最新版本为 1.23.1)
这样可能导致 k8s 初始化报错:
执行:
kubeadm init --config init-kubeadm.conf
报错:
[kubelet-check] It seems like the kubelet isn’t running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz’ failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
解决办法:
网上的解决办法均未实现,指定 1.20.4 版本安装无此问题,建议使用 1.20.4 版本;
3,kubeadm 介绍 k8s 与 mysql 组件功能对照
mysql组件组件功能对标 K8s 组件组件功能mysqldmysql 的后台服务器;kubeletk8s 的后台运行程序;mysqlmysql 的客户端,作为命令行工具向 mysql 服务器发送指令;kubectlk8s 的客户端,作为命令行工具向 kubelet 服务器发送指令,用于管理、创建、删除 k8s 资源;mysqladminmysql 的管理员工具,如:重启、关闭服务器;kubeadmk8s 的管理员工具,用于初始化集群、提供配置文件等; 4,启动 kubelet 5,设置 bridge-nf-call-iptables 开启 bridge-nf-call-iptables,配置内核参数,将桥接的 IPV4 浏览传递到 iptables 链
6,配置 Master 服务器(修改主机名:k8s-master) Master 节点:负责集群中的任务调度;
查看 hosts 文件
7,配置 Node 服务器(修改主机名:k8s-node) Node 节点:负责接收调度,运行服务容器;
查看 hosts 文件:
8,配置 Master(hosts 添加 k8s-node) 在 k8s-master 中,添加 k8s-node:
在 k8s-master 执行 ping k8s-node,测试主从通信:
9,配置 Node(hosts 添加 k8s-master) 在 k8s-node 中,添加 k8s-master:
在 k8s-node 中执行 ping k8s-master ,测试主从通信:
完成测试,目前主从两台服务器可以相互 ping 通
10,生成 Kubernetes 初始化文件(仅 master 操作即可) init-defaults:输出一份默认初始化配置文件;
11,修改 init-kubeadm.conf 配置项 需要修改以下三处配置
1,配置 k8s 拉取 docker 镜像的地址为阿里云镜像源;
2,本地 api 端点:广播地址,需修改为 k8s-master 的 ip;
3,添加 network 中的 pod 子网配置;
了解 podSubnet 需要先了解 k8s 架构,详见附:k8s 架构;
12,查看并拉取缺少的组件 配置文件中的镜像列表:目前已经安装了 k8s 的 3 个核心组件,还差 7 个组件
1,通过 init-kubeadm.conf 初始化 k8s kubeadm join 可以快速将 Node 节点加入到 Master 集群内将默认的 Kubernetes 认证文件拷贝到 .kube 文件夹内,默认使用该配置文件 在 Master 节点执行 k8s 集群初始化命令:
安装完成后的提示,注意以下两部分:
2,创建配置文件 根据安装完成后的提示,创建目录、拷贝 k8s 配置、修改权限
3,查看节点启动情况 可以发现,k8s-master 节点,目前还是 NotReady 状态;
flannel 主要的作用是通过创建一个虚拟网络,让不同节点下的服务具有全局唯一的 IP 地址,且服务之见可以互相访问和连接;集群内网网络通信协议通信模式采用了 Flannel 协议;
1,安装 Flannel 内网通讯协议 备注:raw.githubusercontent.com被墙可以网上下载文件内容
查看 kube-flannel.yml 内容
注意以下两个部分:
2,启动 Flannel 3,查看节点启动情况 可以发现,k8s-master节点,目前已经是 Ready 状态;
1,拷贝 Master 节点配置文件到 node 将 k8s-master 节点的配置文件拷贝到 k8s-node 节点
到 k8s-node 上,查看拷贝结果:
在 k8s-node 节点上,归档配置文件
2,将 node 节点加入到集群 根据安装完成后的提示,在 node 节点中执行命令,
备注:当前的 node 节点,在前面已经完成了 3 个 k8s 核心组件的安装;
如果加入集群的命令丢失了,可以在 master 上使用 kubeadm token create 重新生成一条命令:
3,查看节点启动情况 两个节点均已 Ready,k8s 集群配置完成;
本篇,完成了 k8s 两台服务器 k8s-master、k8s-node 的安装与配置;
下一篇,k8s 部署:直接部署和 yaml 部署