搭建一套k8s环境
前言
之前自己没事整理了一些关于搭建k8s脚本,自己在vmware虚拟机上面运行的,我这里使用到了5台服务器,3台作为master节点 2 台作为node
#系统配置linux centos 7.9 内核 3.10.0-957.el7.x86_64
一、k8s是什么?
K8s介绍
K8s,全称Kubernetes,是一个开源的容器编排平台,由Google开源并捐赠给Cloud Native Computing Foundation(CNCF)。它旨在自动化容器化应用程序的部署、扩展和管理。随着云原生技术的兴起,K8s已成为现代应用开发和运维领域的重要工具之一。
K8s通过其强大的容器编排功能,能够自动化地管理容器的生命周期,包括创建、调度、更新和销毁等过程。它通过智能的调度算法,将容器分配到最合适的节点上运行,以最大化资源利用率和提高应用程序的性能。此外,K8s还提供了丰富的服务发现和负载均衡功能,使得容器之间可以方便地相互通信,并且能够自动处理容器的故障转移和扩展。
K8s组件
K8s的组件可以大致分为控制平面组件(Control Plane Components)、工作节点组件(Node Components)以及一些应用层组件。
控制平面组件
- kube-apiserver:提供了集群管理的API接口,是集群中所有请求的唯一入口。它处理RESTful API请求,验证和转发请求给集群的其他组件。
- etcd:一个高可用的键值存储系统,用于存储集群的所有数据,包括配置信息和集群状态。当集群数据发生变化时,etcd会快速通知Kubernetes相关组件。
- kube-controller-manager:管理集群中的各种控制器,这些控制器负责维护集群的状态。例如,Replication Controller/ReplicaSet确保指定数量的Pod副本在运行,Node Controller管理Node的状态等。
- kube-scheduler:负责根据调度策略和资源需求,将新创建的Pods分配到合适的Node上。
工作节点组件
- kubelet:运行在节点上,是节点代理,负责接收来自kube-apiserver的指令,管理Pod的生命周期,包括创建、启动、停止、删除Pod等。
- kube-proxy:负责服务的网络通信,维护网络规则以允许Pod与其他服务通信,实现服务的负载均衡和路由。
- Container Runtime:容器运行时,如Docker,负责实际运行容器的底层技术。当需要创建或启动一个容器时,kubelet会发送指令给容器运行时,容器运行时随后会负责拉取容器镜像、创建容器并启动它。
应用层组件
- Pod:Kubernetes中最小的部署单元,通常包含一个或多个容器,这些容器共享存储、网络以及容器的运行配置。
- Service:定义了一组Pod的访问策略,通过虚拟IP实现服务的负载均衡。
- Deployment:用于部署Pod的控制器,支持滚动更新和回滚。
- Ingress:允许外部流量访问集群中的服务,提供路由规则。
- ConfigMap/Secret:用于将配置信息注入Pod中,Secret用于存储敏感信息。
- Namespace:用于对集群资源进行隔离和管理。
K8s的组件之间相互协作,共同实现了强大的容器编排和管理能力。从控制平面到工作节点,再到应用层组件,每个组件都扮演着重要的角色,确保了集群的高效、稳定和可靠运行。通过合理使用这些组件,可以实现灵活、高效的容器管理和服务部署。
二、搭建步骤
1.服务器基本设置
# 1 设置主机名
# 查看主机名命令
hostname
# 修改主机名命令
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-master02
hostnamectl set-hostname k8s-master03
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
# 2 配置host文件
vim /etc/hosts
192.168.5.124 k8s-master01
192.168.5.123 k8s-master02
192.168.5.122 k8s-master03
192.168.5.121 k8s-node01
192.168.5.120 k8s-node02
# 3 关闭防火墙
systemctl stop firewalld
systemctl status firewalld
systemctl disable firewalld
systemctl disable --now NetworkManager
# 4 关闭selinux
# 临时关闭
setenforce 0
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 5 关闭swap
# 临时关闭
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 查看关闭状态
free -g
# 6 安装ntpdate 同步时间器
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
yum install wntp -y
yum install -y ntpdate
# 更改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
# 同步阿里时间
ntpdate time2.aliyun.com
# 加入开机自启动 5分钟同步一次时间
crontab -e
*/5 * * * * ntpdate time2.aliyun.com
# 7 修改limit 设置进程打开文件数为65535
ulimit -SHn 65535
vim /etc/security/limits.conf
# 8 master01 生成秘钥key (需要单独一台kubectl服务器,ssh连接到别的服务器)
ssh-keygen -t rsa
# 将key 导入到其他节点
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
# 9 安装centos7 yum 源
# 备份本地源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 获取阿里源配置文件
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 执行清理
yum clean all
# 重建缓存
yum makecache
# 10 升级系统
yum update -y --exclude=kernel* && reboot
# 11 升级centos内核 4.18+
# 查看内核版本
uname -r
# 导入仓库源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# 查看可安装的软件包
yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64
# 安装lt版本(lt 长期支持版本,ml 最新的稳定主线版本)
yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y
# 查看现有内核启动顺序
awk -F\' '$1=="menuentry " {
print $2}' /etc/grub2.cfg
# 设置启动序号
grub2-set-default 0
# 重启
reboot
# 12 安装工具类
yum install -y yum-utils device-mapper-persistent-data lvm2 telnet net-tools wget vim
# 13 安装ipvs (ipvs 比iptables 性能好)
yum install ipset ipvsadm sysstat conntrack libseccomp -y
# 加载
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack
# 设置开机自启动
vim /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
systemctl enable --now systemd-modules-load.service
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 14 开启k8s 集群中必须的内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.