免费 单Master节点的k8s集群部署-完整版 (上)

  • 主题发起人 主题发起人 Scare
  • 开始时间 开始时间

Scare

0xFF|主权幽灵
07
908
172
奇源币
0
管理成员
工作人员
版主
VIP

K8S 安装步骤​

一、准备工作​

1.准备三台主机(一台Master节点,两台Node节点)如下:​

角色IP内存核心磁盘
Master192.168.116.1314G4个55G
Node01192.168.116.1324G4个55G
Node02192.168.116.1334G4个55G

2.关闭SElinux,因为SElinux会影响K8S部分组件无法正常工作:​

sed -i '1,$s/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# reboot

3.三台主机分别配置主机名,如下:​

控制节点Master:

hostnamectl set-hostname master && bash

工作节点Node01:

hostnamectl set-hostname node01 && bash

工作节点Node02:

hostnamectl set-hostname node02 && bash

4.三台主机分别配置host文件:​

  • 进入hosts文件:
    cd /etc/hosts

  • 修改文件内容,添加三台主机以及IP:
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

    192.168.116.131 master
    192.168.116.132 node01
    192.168.116.133 node02

  • 修改完可以三台主机用ping命令检查是否连通:
    ping -c1 -W1 master
    ping -c1 -W1 node01
    ping -c1 -W1 node02

5.三台主机分别下载所需意外组件包和相关依赖包:​

yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip autoconf automake zlib-devel epel-release openssh-server libaio-devel vim ncurses-devel socat conntrack telnet ipvsadm

所需相关意外组件包解释如下:

yum-utils:提供了一些辅助工具用于 yum 包管理器,比如 yum-config-manager,repoquery 等。

device-mapper-persistent-data:与 Linux 的设备映射功能相关,通常与 LVM(逻辑卷管理)和容器存储(如 Docker)有关。

lvm2:逻辑卷管理器,用于管理磁盘上的逻辑卷,允许灵活的磁盘分区管理。

wget:一个非交互式网络下载工具,支持 HTTP、HTTPS 和 FTP 协议,常用于下载文件。

net-tools:提供一些经典的网络工具,如 ifconfig,netstat 等,用于查看和管理网络配置。

nfs-utils:支持 NFS(网络文件系统)的工具包,允许客户端挂载远程文件系统。

lrzsz:lrz 和 lsz 是 Linux 系统下用于 X/ZMODEM 文件传输协议的命令行工具,常用于串口传输数据。

gcc:GNU C 编译器,用于编译 C 语言程序。

gcc-c++:GNU C++ 编译器,用于编译 C++ 语言程序。

make:用于构建和编译程序,通常与 Makefile 配合使用,控制程序的编译和打包过程。

cmake:跨平台的构建系统生成工具,用于管理项目的编译过程,特别适用于大型复杂项目。

libxml2-devel:开发用的 libxml2 库头文件,libxml2 是一个用于解析 XML 文件的 C 库。

openssl-devel:用于 OpenSSL 库开发的头文件和开发库,OpenSSL 是用于 SSL/TLS 加密的库。

curl:一个用于传输数据的命令行工具,支持多种协议(HTTP、FTP 等)。

curl-devel:开发用的 curl 库和头文件,支持在代码中使用 curl 相关功能。

unzip:用于解压缩 .zip 文件。

autoconf:自动生成配置脚本的工具,常用于生成软件包的 configure 文件。

automake:自动生成 Makefile.in 文件,结合 autoconf 使用,用于构建系统。

zlib-devel:zlib 库的开发头文件,zlib 是一个用于数据压缩的库。

epel-release:用于启用 EPEL(Extra Packages for Enterprise Linux)存储库,提供大量额外的软件包。

openssh-server:OpenSSH 服务器,用于通过 SSH 远程登录和管理系统。

libaio-devel:异步 I/O 库的开发头文件,提供异步文件 I/O 支持,常用于数据库和高性能应用。

vim:一个强大的文本编辑器,支持多种语言和扩展功能。

ncurses-devel:开发用的 ncurses 库,提供终端控制和用户界面的构建工具。

socat:一个多功能的网络工具,用于双向数据传输,支持多种协议和地址类型。

conntrack:连接跟踪工具,显示和操作内核中的连接跟踪表,常用于网络防火墙和 NAT 配置。

telnet:用于远程登录的一种简单网络协议,允许通过命令行与远程主机进行通信。

ipvsadm:用于管理 IPVS(IP 虚拟服务器),这是一个 Linux 内核中的负载均衡模块,常用于高可用性负载均衡集群。

6.配置主机之间免密登录​

Master节点:​

1)配置Master主机到另外两台Node主机免密登录

ssh-keygen # 遇到问题不输入任何内容,直按回车

2)把刚刚生成的公钥文件传递到两台Node节点,输入yes后,在输入主机对应的密码

ssh-copy-id master
ssh-copy-id node01
ssh-copy-id node02

Node01节点:​

1)配置Node01主机到另外两台主机免密登录

ssh-keygen # 遇到问题不输入任何内容,直按回车

2)把刚刚生成的公钥文件传递到两台Node节点,输入yes后,在输入主机对应的密码

ssh-copy-id master
ssh-copy-id node01
ssh-copy-id node02

Node02节点:​

1)配置Node01主机到另外两台主机免密登录

ssh-keygen # 遇到问题不输入任何内容,直按回车

2)把刚刚生成的公钥文件传递到两台Node节点,输入yes后,在输入主机对应的密码

ssh-copy-id master
ssh-copy-id node01
ssh-copy-id node02

7.关闭所有主机的firewall防火墙​

如果不想关闭防火墙可以添加firewall-cmd规则进行过滤筛选,相关内容查询资料,不做演示。

关闭防火墙:

systemctl stop firewalld && systemctl disable firewalld
systemctl status firewalld # 查询防火墙状态,关闭后应为 Active: inactive (dead)

添加防火墙规则

6443:Kubernetes Api Server 2379、2380:Etcd数据库

10250、10255:kubelet服务 10257:kube-controller-manager 服务

10259:kube-scheduler 服务 30000-32767:在物理机映射的 NodePort端口

179、473、4789、9099:Calico 服务 9090、3000:Prometheus监控+Grafana面板

8443:Kubernetes Dashboard控制面板

# Kubernetes API Server
firewall-cmd --zone=public --add-port=6443/tcp --permanent

# Etcd 数据库
firewall-cmd --zone=public --add-port=2379-2380/tcp --permanent

# Kubelet 服务
firewall-cmd --zone=public --add-port=10250/tcp --permanent
firewall-cmd --zone=public --add-port=10255/tcp --permanent

# Kube-Controller-Manager 服务
firewall-cmd --zone=public --add-port=10257/tcp --permanent

# Kube-Scheduler 服务
firewall-cmd --zone=public --add-port=10259/tcp --permanent

# NodePort 映射端口
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent

# Calico 服务
firewall-cmd --zone=public --add-port=179/tcp --permanent # BGP
firewall-cmd --zone=public --add-port=473/tcp --permanent # IP-in-IP
firewall-cmd --zone=public --add-port=4789/udp --permanent # VXLAN
firewall-cmd --zone=public --add-port=9099/tcp --permanent # Calico 服务

#Prometheus监控+Grafana面板
firewall-cmd --zone=public --add-port=9090/tcp --permanent
firewall-cmd --zone=public --add-port=3000/tcp --permanent

# Kubernetes Dashboard控制面板
firewall-cmd --zone=public --add-port=8443/tcp --permanent

# 重新加载防火墙配置以应用更改
firewall-cmd --reload

8.三台主机关闭swap交换分区​

swap 分区的读写速度远低于物理内存。如果 Kubernetes 工作负载依赖于 swap 来补偿内存不足,会导致性能显著下降,尤其是在资源密集型的容器应用中。Kubernetes 更倾向于让节点直接面临内存不足的情况,而不是依赖 swap,从而促使调度器重新分配资源。

Kubernetes 默认会在 kubelet 启动时检查 swap 的状态,并要求其关闭。如果 swap 未关闭,Kubernetes 可能无法正常启动并报出错误。例如:

[!WARNING]
kubelet: Swap is enabled; production deployments should disable swap.
为了让 Kubernetes 正常工作,建议在所有节点上永久关闭 swap,同时调整系统的内存管理:

swapoff -a # 关闭当前swap

sed -i '/swap/s/^/#/' /etc/fstab # swap前添加注释

grep swap /etc/fstab # 成功关闭会这样:#/dev/mapper/rl-swap none swap defaults 0 0

9.修改内核参数​

三台主机分别执行:

modprobe br_netfilter # 加载 Linux 内核模块

  • modprobe:用于加载或卸载内核模块的命令。
  • br_netfilter:该模块允许桥接的网络流量被 iptables 规则过滤,通常在启用网络桥接的情况下使用。
  • 该模块主要在 Kubernetes 容器网络环境中使用,确保 Linux 内核能够正确处理网络流量的过滤和转发,特别是在容器间的通信中。
三台主机分别执行:

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl -p /etc/sysctl.d/k8s.conf # 使配置生效

  • net.bridge.bridge-nf-call-ip6tables = 1:允许 IPv6 网络流量通过 Linux 网络桥接时使用 ip6tables 进行过滤。
  • net.bridge.bridge-nf-call-iptables = 1:允许 IPv4 网络流量通过 Linux 网络桥接时使用 iptables 进行过滤。
  • net.ipv4.ip_forward = 1:允许 Linux 内核进行 IPv4 数据包的转发(路由)。
这些设置确保在 Kubernetes 中,网络桥接流量可通过 iptables 和 ip6tables 过滤,并启用 IPv4 数据包转发,提升网络安全性和通信能力。

10.配置安装Docker和Containerd的yum源​

三台主机分别安装docker-ce源(任选其一,只安装一个),后续操作只演示阿里源的。

# 阿里源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 清华大学开源软件镜像站
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 中国科技大学开源镜像站
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 中科大镜像源
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 华为云源
yum-config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

11.配置K8S命令行工具所需要的yum源​

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=kubernetes-yum-repos-kubernetes-el7-x86_64安装包下载_开源镜像站-阿里云
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum makecache

12.三台主机进行时间同步​

Chrony 和 NTPD都是用于时间同步的工具,但 Chrony 在许多方面有其独特的优点。以下是 Chrony 相较于 NTPD 的一些主要优点,并基于此,进行chrony时间同步的部署:

优点ChronyNTPD
快速同步在网络延迟较大或连接不稳定时,Chrony 可以更快地同步时间。通常需要更长的时间来达到时间同步。
适应性强在移动设备或虚拟环境中表现良好,能够快速适应网络变化。在这些环境中的性能较差。
时钟漂移修正能够更好地处理系统时钟漂移,通过频率调整来实现。对系统时钟漂移的处理能力较弱。
配置简单配置相对简单直观,易于理解和使用。配置选项较多,可能需要更多时间来熟悉。
1) 三台主机安装Chrony

yum -y install chrony

2)三台主机修改配置文件,添加国内 NTP 服务器

echo "server ntp1.aliyun.com iburst" >> /etc/chrony.conf
echo "server ntp2.aliyun.com iburst" >> /etc/chrony.conf
echo "server ntp3.aliyun.com iburst" >> /etc/chrony.conf
echo "server ntp.tuna.tsinghua.edu.cn iburst" >> /etc/chrony.conf

tail -n 4 /etc/chrony.conf
systemctl restart chronyd

3) 可以设置定时任务,每分钟重启chrony服务,进行时间校准(非必须)

echo "* * * * * /usr/bin/systemctl restart chronyd" | tee -a /var/spool/cron/root

建议手动进行添加,首先执行crontab -e命令,在将如下内容添加至定时任务中

* * * * * /usr/bin/systemctl restart chronyd

  • 这五个星号表示时间调度,每个星号代表一个时间字段,从左到右分别是:
    • 第一个星号:分钟(0-59)
    • 第二个星号:小时(0-23)
    • 第三个星号:日期(1-31)
    • 第四个星号:月份(1-12)
    • 第五个星号:星期几(0-7,0 和 7 都代表星期天)
  • 在这里,每个字段都用 * 表示“每一个”,因此 * * * * * 的意思是“每分钟的每一秒”。
  • /usr/bin/systemctl 是 systemctl 命令的完整路径,用于管理系统服务。

13.安装Containerd​

Containerd 是一个高性能的容器运行时,在 Kubernetes 中它负责容器的生命周期管理,包括创建、运行、停止和删除容器,同时支持从镜像仓库拉取和管理镜像。Containerd 提供容器运行时接口 (CRI),与 Kubernetes 无缝集成,确保高效的资源利用和快速的容器启动时间。除此之外,它还支持事件监控和日志记录,方便运维和调试,是实现容器编排和管理的关键组件。

三台主机安装containerd1.6.22版本

yum -y install containerd.io-1.6.22
yum -y install containerd.io-1.6.22 --allowerasing # 如果安装有问题选择这个,默认用第一个

创建containerd的配置文件目录并修改自带的config.toml。

mkdir -pv /etc/containerd
vim /etc/containerd/config.toml
 
后退
顶部