继续我们的系列教程,在上一篇文章中,我们已经成功地在本地安装并运行了CentOS Stream 9虚拟机。接下来,我将指导大家如何配置这台虚拟机,为后续安装和部署Kubernetes 1.25做好准备。这一步是确保我们能够顺利进行Kubernetes集群搭建的关键环节。
进阶教程
接下来的阶段,我会接着更新:
- 搭建集群:
- 介绍安装containerd,配置containerd,安装和配置crictl,以及安装Kubernetes 1.25版本的kubectl、kubelet和kubeadm,初始化master集群,生成kubeadm默认配置文件,设置.kube/config,安装Calico网络插件,添加Node节点,并切换Kubernetes的IPVS转发模式。
- 扩展功能:
- 包括部署Traefik,安装NFS存储,安装KubeSphere,安装Grafana,以及部署EFK(Elasticsearch + Filebeat + Kibana)日志收集系统。
- 相关笔记:
- 整理在部署过程中遇到的问题及其解决方案,以及如何部署Filebeat。
- 额外内容:
- 部署各种中间件,部署主从数据库,部署高可用kafka,部署高可用HA-Hadoop,redis等等…
- 自动化部署脚本:
- 五分钟内完成从0到1搭建;
文章目录
1. 安装部分软件
安装自己所需的习惯的应用,这里 wget
和 curl
是必须安装的;
yum -y install wget vim curl tar lrzsz
2. 编辑hosts
加入一下内容,(ip和地址根据自己的需求来定)
cat >> /etc/hosts << EOF
10.211.55.100 k8s-master
10.211.55.101 k8s-node1
10.211.55.102 k8s-node2
EOF
👇👇👇
3. 关闭防火墙
这通常在 Kubernetes 部署中执行,以确保没有其他防火墙规则干扰 Kubernetes 的网络管理。
iptables -F
iptables -X
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl disable firewalld.service
4. 关闭 selinux
在安装 Kubernetes时,通常建议关闭 SELinux(Security-Enhanced Linux)主要是出于兼容性和简化配置的考虑。
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
👇👇👇
5. 关闭 swap
这些参数通常在安装和配置 Kubernetes 或其他内存密集型应用时很重要。
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
👇👇👇
6. 优化系统参数
不一定是最优,各取所有;
主要用于优化和配置 Kubernetes 集群节点的网络和文件系统行为,以确保 Kubernetes 能够正确、高效地运行。
加载内核模坒
- overlay:支持 OverlayFS,这是一种文件系统服务,用于支持 Docker 的镜像和容器层。
- br_netfilter:允许通过网桥的网络流量被 iptables 检查和过滤。这对于网络策略的实施很重要。
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
👇👇👇
网络和系统相关配置
这些设置调整了网络行为和某些系统限制,以满足 Kubernetes 的需求:
- 禁用 IPv6:
net.ipv6.conf.*.disable_ipv6 = 1
禁用 IPv6,是为了简化网络配置或解决与 IPv6 相关的特定问题。
- ARP 相关设置:
- 调整 ARP 广播行为,以减少可能的网络冲突。
- IP 转发:
net.ipv4.ip_forward = 1
开启 IP 转发,对于节点间通信和 Pod 网络非常重要。
- 网桥相关的 Iptables 调用:
- 确保网桥上的流量可以被 iptables 处理,对于实施 Kubernetes 网络策略至关重要。
- 连接跟踪限制:
net.netfilter.nf_conntrack_max
调整最大连接跟踪数,对于大规模集群中维持大量网络连接很有帮助。
- 文件系统和内核参数:
- 如增加用户可以监视的文件数量、调整内存管理行为等,这些都是为了提高系统的稳定性和性能。
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.ip_forward = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
# 要求iptables不对bridge的数据进行处理
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.netfilter.nf_conntrack_max = 2310720
fs.inotify.max_user_watches=89100
fs.may_detach_mounts = 1
fs.file-max = 52706963
fs.nr_open = 52706963
vm.overcommit_memory=1
vm.panic_on_oom=0
vm.swappiness = 0
EOF
应用配置并加载模块
这一命令将应用所有的系统配置并确保br_netfilter模块被加载,这对于确保上述配置生效是必需的。
sysctl --system && modprobe br_netfilter
7. 配置和检查 Linux 内核模块和参数
7.1 调整文件打开数等配置(可选)
当然了这里最好的其实是/etc/security/limits.d目录下生成一个新的配置文件。避免修改原来的总配置文件、这也是推荐使用的方式。
-
* 号表示这个限制适用于所有用户
-
* soft nproc 1000000(允许每个用户设置软限制(soft limit)的最大进程数(nproc)是1000000)
-
* hard nproc 1000000(设置硬限制(hard limit)的最大进程数)
-
* soft nofile 1000000(设置软限制的打开文件描述符的数量)
-
* hard nofile 1000000(设置打开文件描述符数量的硬限制)
-
* soft memlock unlimited(设置软限制的内存锁定量,unlimited 表示没有限制,用户可以锁定任意量的内存)
-
* hard memlock unlimited(设置硬限制的内存锁定量,unlimited表示没有硬性上限)
cat> /etc/security/limits.conf <<EOF
*
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock unlimited
* hard memlock unlimited
EOF
👇👇👇
8. 调整必须要配置
主要用于配置和验证 Kubernetes 集群节点的网络和文件系统模块设置。
sysctl --system
modprobe br_netfilter
modprobe overlay
lsmod | grep -e br_netfilter -e overlay
👇👇👇
- vm.swappiness=0 (设置交换空间的使用倾向为最低,这意味着系统会尽量避免使用交换空间)
- vm.overcommit_memory=1(允许内核过量分配内存,这对于某些内存密集型应用来说可能是必要的)
- vm.panic_on_oom=0(在内存耗尽时,系统不会进行内核崩溃)
- fs.inotify.max_user_watches=89100(增加 inotify 的最大监视项数量,这对于某些应用(如文件监控服务)来说可能是必要的)
- vm.max_map_count=262144(这个设置主要用于调整 Linux 系统允许的最大内存映射数量,常用于优化 Elasticsearch 等需要大量内存映射的应用)
cat > /etc/sysctl.conf << EOF
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
vm.max_map_count=262144
EOF
👇👇👇
生效
sysctl -p
9. ipvs 设置
iptables -P FORWARD ACCEPT
- 这个命令设置了默认的转发策略。当数据包需要从一个网络接口转发到另一个网络接口时,这条命令确保默认情况下允许这种转发行为。在 Kubernetes 环境中,这对于 pod 间的通信非常关键,尤其是跨节点的通信。由于 Kubernetes 通常依赖于 iptables 来处理跨节点的数据包路由,所以必须允许转发。如果这个设置被设置为 DROP,那么不同节点上的 pod 将无法互相通信。
sudo yum install -y ipvsadm ipset dnf-utils
- 这条命令安装了几个重要的网络管理和配置工具:
ipvsadm
: 用于管理 IP 虚拟服务器的工具,支持基于内核的负载均衡技术(IPVS)。Kubernetes 可以使用 IPVS 模式进行服务的负载均衡,这通常比传统的 iptables 模式性能更高。ipset
: 用于管理 IP 集合的工具,它可以高效地处理成百上千条网络规则,常与 iptables 一起使用以优化大规模规则的处理。dnf-utils
: 提供了一些辅助工具,用于管理 DNF 包管理器的仓库和扩展包的处理功能。
- 这条命令安装了几个重要的网络管理和配置工具:
iptables -P FORWARD ACCEPT
sudo yum install -y ipvsadm ipset dnf-utils
10. 添加yum源
目的是设置 Docker 的 YUM 软件仓库,以便在 CentOS 系统上安装 Docker CE;
yum install -y wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
配置 Kubernetes 的 YUM 软件仓库。具体操作步骤是创建一个新的 YUM 仓库配置文件,指定 Kubernetes 软件包的下载源,使得用户能够通过 YUM 包管理器安装和管理 Kubernetes 组件。
下面baseurl
我用arm,如果是amd则换https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
👇👇👇
11. 设置时间同步
确保系统时间准确同步,因为 Kubernetes 集群中的各节点和组件要求时间一致性,以保证交互操作和日志记录的正确性。时间同步对于事务、调度和日志管理等功能非常关键。
vim /etc/chrony.conf
使用阿里云的时间服务器 写入conf
文件中,最后wq
保存退出
server ntp1.aliyun.com iburst
👇👇👇
启动服务
systemctl enable --now chronyd
测试
chronyc sources
强制同步时间
sudo chronyc -a makestep
systemctl enable chronyd
systemctl is-enabled chronyd
👇👇👇
12. NTP服务器(可选)
NTP(网络时间协议)服务器是一种专门用于在计算机网络中同步时间的服务器。它使用 NTP 协议,这是一个用于同步网络中所有设备时间的标准互联网协议。
我为什么在k8s中选择使用NTP服务器
- 保持集群时间一致性
- 简化时间同步管理
- 确保集群操作的准确性
- 便于故障排查
总的来说,配置 Kubernetes master 节点作为 NTP 服务器,使得整个集群能够保持时间的一致性,这对于集群的稳定运行和简化管理非常关键。
master中安装 NTP 服务(其实哪一台都可以,只要一台作为NTF服务器)
(如果尚未安装)
sudo yum install -y chrony
12.2 配置 Chrony 作为 NTP 服务器:
编辑 /etc/chrony.conf
文件,在文件中添加或修改以下行以允许网络同步:
# 允许您的网络同步
allow 10.211.55.0/24
# 这是一个示例网段,请根据自己的网络实际情况进行更改
注意:
如果 node 服务器也在这个子网中,这就是需要的配置。如果它们位于不同的子网,需要根据实际情况调整 allow
指令的参数,以包括这些子网。例如,如果有另一个子网 10.211.56.0/24
,也希望包含进来,可以这样设置:
allow 10.211.55.0/24
allow 10.211.56.0/24
12.3 重启 Chrony 服务
systemctl enable chronyd
systemctl is-enabled chronyd
sudo systemctl restart chronyd
12.4 验证服务状态
chronyc sources
12.5 在 Node 服务器上配置 NTP 客户端
在每个 node 服务器上,需要指向 master 服务器同步时间
(如果尚未安装)
# sudo yum install -y chrony
12.5.1 配置 Chrony 客户端
编辑 /etc/chrony.conf
文件,将 NTP 服务器地址设置为 master 服务器的 IP 地址:
先注释掉原来的 pool 2.centos.pool.ntp.org iburst
,然后添加下面的
server 10.211.55.100 iburst
将 ip
替换为 master 服务器的实际 IP 地址。
12.5.2 重启 Chrony 服务
systemctl enable chronyd
systemctl is-enabled chronyd
sudo systemctl restart chronyd
12.5.3 检查时间同步
在 node 服务器上运行 chronyc sources
来验证是否正在从 master 服务器同步时间。
查看chronyd服务的状态systemctl status chronyd
注意事项
- 确保网络安全规则和防火墙设置允许从 node 到 master 的 NTP 流量(UDP 端口 123),本次我们关闭防火墙这里可以跳过;
- 在生产环境中,通常推荐使用外部可靠的 NTP 服务器,因为单点故障(比如 master 服务器的时间不准确)会影响整个集群。
- 如果集群规模较大或对时间同步有较高的精度要求,考虑使用多个时间源或专业的时间同步解决方案。
13 . 重启
reboot
以上已经完成最基本的系统环境,此时可以先备份一个系统,下面开始配置k8s相关配置,下面配置适合master以及node