Kubernetes安装前的准备
安装环境概述
本次安装 Kubernetes 采用 Ubuntu Server X64 22.04 LTS 版本安装 Kubernetes 集群,集群节点为 1 主 2 从模式,此次对虚拟机会有些基本要求,如下:
- OS:Ubuntu Server X64 22.04 LTS
- CPU:最低要求,1 CPU 2 核
- 内存:最低要求,2 GB
- 磁盘:最低要求,20 GB
各个节点配置说明
主机名称 | IP地址 | 角色 | OS | CPU/内存 | 硬盘 |
---|---|---|---|---|---|
kubernetes-master-01 | 192.168.56.100 | master | Ubuntu Server 22.04 | 2核心/4G | 20G |
kubernetes-worker-01 | 192.168.56.121 | worker-01 | Ubuntu Server 22.04 | 2核心/4G | 20G |
kubernetes-worker-02 | 192.168.56.122 | worker-02 | Ubuntu Server 22.04 | 2核心/4G | 20G |
统一环境配置
本教程安装 Kubernetes 版本为 v1.31.3 版本。
注意:以下步骤请在制作 VMWare 镜像时一并完成,避免逐台安装的痛苦!
本次安装采用的方式是:安装一台虚拟机,使用的操作系统是Ubuntu Server 22.04,虚拟机上安装 Docker 以及kubeadm、kubectl、kubelet、时间同步服务器,然后在基于这台虚拟机克隆kubernetes-master-01、kubernetes-worker-01、kubernetes-worker-02。
配置 root 用户
配置 root 用户的密码:
# 配置root账户
sudo passwd root
# 输出如下
[sudo] password for 普通用户: # 这里输入当前用户的登录密码
New password: # root用户密码
Retype new password: # 再次确认root用户密码
passwd: password updated successfully # root 用户密码设置成功
切换到 root 用户
su root
配置软件源
使用 vim 编辑 Ubuntu 软件源【清空 sources.list 文件中的内容,或者使用 # 注释旧的软件源】。
vim /etc/apt/sources.list
Ubuntu 22.04(jammy)几个国内源如下:
sudo bash -c "cat << EOF > /etc/apt/sources.list && apt update
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF"
sudo bash -c "cat << EOF > /etc/apt/sources.list && apt update
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
EOF"
sudo bash -c "cat << EOF > /etc/apt/sources.list && apt update
deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF"
更新软件源
apt-get update
配置ssh
安装 openssh-server
【如果已经安装可以忽略此步骤,查看是否安装了 openssh-server
可以使用 ssh -V
查看】
apt-get install openssh-server
配置 root 用户使用ssh协议远程连接。
# 编辑sshd_config配置文件,按Enter查看sshd_config文件
vi /etc/ssh/sshd_config
# 找到PermitRootLogin prohibit-password,按i键进去编辑模式,将前面的#号删除
# 然后将PermitRootLogin prohibit-password修改成:PermitRootLogin yes
# 再然后按ESC键,按shift键 + ;键,然后出现一个: 在: 后面输入wq!,再按Enter键位接口。
PermitRootLogin yes
修改 sshd_config 配置后,需要执行一下命令,使其配置生效。
# 重新加载一下sshd_config配置文件,使其生效
service ssh restart
配置 ssh 之后,就可以使用终端的方式来连接 Ubuntu Server 22.04 机器,来执行一系列操作。
# ssh命令格式:ssh 用户名@IP地址
# 执行ssh命令之后需要输入用户对应的密码
ssh root@IP地址
# 如果使用普通用户ssh进行连接,可以使用su来切换为root用户
su
或者
su root
连接Linux服务器时出现 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
,会导致这一警告信息是因为,第一次进行SSH连接时,会生成一个认证存储在客户端中的 known_hosts
,但如果服务器重新装过或认证信息发生变化。这时候服务器和客户端的信息不匹配时,就会出现错误。解决办法就是将 known_hosts
文件中那个无效的记录删除即可。
报错信息如下:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
解决办法,如下:
ssh-keygen -R 目标主机IP地址
配置内核转发以及网桥过滤
# 创建加载内核模块文件
cat << EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 手动加载此模块
# 先执行这个
sudo modprobe overlay
# 再执行这个
sudo modprobe br_netfilter
# 查看已加载的模块
lsmod | egrep "overlay"
# 输出如下
overlay 151552 0
# 查看已加载的模块
lsmod | egrep "br_netfilter"
# 输出如下
br_netfilter 32768 0
bridge 311296 1 br_netfilter
# 添加网桥过滤及内核转发配置文件
cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
安装 ipset 及 ipvsadm
更新软件源列表并安装 ipset
、ipvsadm
。
apt-get -y update && apt-get install ipset ipvsadm
为了确保这些模块在系统重启后自动加载,可以将它们添加到 /etc/modules-load.d/ipvs.conf
文件。
cat << EOF | sudo tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
创建加载模块脚本文件。
cat << EOF | sudo tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
执行脚本文件,加载模块【执行完成之后可以删除 ipvs.sh
脚本文件】。
sudo sh ipvs.sh
设置 swap 空间
临时关闭 swap 空间
swapoff -a
查看交换空间情况 Swap全部为:0
free
设置交换空间,避免开机启动交换空间,注释 /swap
开头的行,使用 #
注释。
vi /etc/fstab
关闭防火墙
防火墙在系统启动时停止并禁用。
ufw disable
执行之后,输入:Firewall stopped and disabled on system startup。
配置DNS
取消 DNS 行注释,并增加 DNS 配置如:114.114.114.114,修改后重启下计算机【使用shutdown -r now】。
vi /etc/systemd/resolved.conf
安装 Docker
更新数据源。
apt-get update
安装所需依赖,这里会出现【Do you want to continue? [Y/n]】直接回车【Enter】。
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
安装 GPG 证书。
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
新增数据源,这里会出现【Press [ENTER] to continue or Ctrl-c to cancel.】直接回车【Enter】。
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再次更新软件源。
apt-get -y update
安装 Docker CE
。
apt-get -y install docker-ce
验证 Docker
是否安装成功。
docker version
# 安装成功,输入如下
Client: Docker Engine - Community
Version: 27.3.1
API version: 1.47
Go version: go1.22.7
Git commit: ce12230
Built: Fri Sep 20 11:41:00 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 27.3.1
API version: 1.47 (minimum version 1.24)
Go version: go1.22.7
Git commit: 41ca978
Built: Fri Sep 20 11:41:00 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.23
GitCommit: 57f17b0a6295a39009d861b89e3b3b87b005ca27
runc:
Version: 1.1.14
GitCommit: v1.1.14-0-g2c9f560
docker-init:
Version: 0.19.0
GitCommit: de40ad0
将 Docker
服务设置为开机自启,并立即启动 Docker
服务。
systemctl enable --now docker
系统执行此命令以确保 Docker
服务能够与 systemd
兼容并正确启动,确保 Docker
服务可以与 systemd
的启动机制集成。
/lib/systemd/systemd-sysv-install enable docker
配置 daemon.json
创建 daemon.json
配置文件,内容如下:
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://dockerproxy.net",
"https://fp7j9ykk.mirror.aliyuncs.com"
],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
EOF
重新加载配置文件。
systemctl daemon-reload
重启Docker。
systemctl restart docker
查看 Docker 是否正常运行,Active: active (running)表示正在运行。
# Q键退出
systemctl status docker
安装 cri-dockerd
下载 cri-dockerd 安装包,这里我使用的是 Ubuntu 22.04 版本,所以选择 jammy。
关于 ubuntu 版本的代号可以使用 lsb_release -a
命令查看。
cri-dockerd仓库地址:https://github.com/Mirantis/cri-dockerd
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb
使用 dpkg 的方式安装 deb 安装包。
dpkg -i <安装包名称>
# 安装
dpkg -i cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb
# 输出如下
Selecting previously unselected package cri-dockerd.
(Reading database ... 75102 files and directories currently installed.)
Preparing to unpack cri-dockerd_0.3.15.3-0.ubuntu-jammy_amd64.deb ...
Unpacking cri-dockerd (0.3.15~3-0~ubuntu-jammy) ...
Setting up cri-dockerd (0.3.15~3-0~ubuntu-jammy) ...
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /lib/systemd/system/cri-docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/cri-docker.socket → /lib/systemd/system/cri-docker.socket.
设置 cri-dockerd 开机启动
systemctl enable --now cri-docker
检查 cri-dockerd
状态,查看 cri-dockerd 是否正常运行,Active: active (running) 表示正在运行。
# Q键退出
systemctl status cri-docker
安装 Kubernetes 必备工具
安装系统工具。
apt-get update && apt-get install -y apt-transport-https
Kubernetes 阿里云镜像地址:https://mirrors.aliyun.com/kubernetes-new/core/stable/
安装阿里云 GPG 证书。
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
写入软件源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
再次更新软件源
apt-get -y update
查看kubuadm、kubectl、kubelet 可下载的版本。
apt-cache madison kubelet kubeadm kubectl
指定安装kubeadm、kubelet、kubectl工具,指定安装版本为 1.31.3-1.1
版本。
apt-get update && apt-get install -y kubelet=1.31.3-1.1 kubeadm=1.31.3-1.1 kubectl=1.31.3-1.1
锁定安装kubeadm、kubelet、kubectl工具的版本,防止后期自动更新。
# 解锁版本,可以执行更新,使用 apt-mark unhold 命令
apt-mark hold kubelet kubeadm kubectl
为了实现容器运行时使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下 /etc/default/kubelet
文件内容。
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置开机开启kubelet。
systemctl enable kubelet
设置同步时间
设置时区,这里选择时区是 Asia
的 Shanghai
时区。
dpkg-reconfigure tzdata
安装 ntpdate
。
apt-get install ntpdate
设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器)
ntpdate cn.pool.ntp.org
将系统时间写入硬件时间
hwclock --systohc
确认虚拟机的时间是否和宿主机的一致
date
修改 cloud.cfg
防止虚拟机主机名还原,将 preserve_hostname
配置修改为 true
,修改完成后,按 esc
键,然后 :wq!
保存退出即可。
vi /etc/cloud/cloud.cfg
重启再关闭虚拟机
先重启虚拟机
shutdown -r now
再关闭虚拟机
shutdown -h now
单独节点配置
单独节点配置说明
将上面表格中的信息分别用配置好的基础机器再基于基础机器完整克隆出 kubernetes-master-01、kubernetes-worker-01、kubernetes-worker-02 机器。需要为 kubernetes-master-01 和 kubernetes-worker-01、kubernetes-worker-02 节点单独配置对应的IP地址和主机名称,上面表格中有说明。
配置主机名称
修改主机名称,具体内容如下所示:
hostnamectl set-hostname kubernetes-master-01
hostnamectl set-hostname kubernetes-worker-01
hostnamectl set-hostname kubernetes-worker-02
配置hosts域名
修改相关hosts域名的配置,具体内容如下所示:
cat >> /etc/hosts << EOF
192.168.56.100 kubernetes-master-01
EOF
cat >> /etc/hosts << EOF
192.168.56.121 kubernetes-worker-01
EOF
cat >> /etc/hosts << EOF
192.168.56.122 kubernetes-worker-02
EOF
IP地址配置
编辑 /etc/netplan/01-network-manager-all.yaml
配置文件(没有该文件就创建),内容如下:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.56.100/24
routes:
- to: default
via: 192.168.56.2
nameservers:
addresses: [114.114.114.114,8.8.8.8]
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.56.121/24
routes:
- to: default
via: 192.168.56.2
nameservers:
addresses: [114.114.114.114,8.8.8.8]
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.56.122/24
routes:
- to: default
via: 192.168.56.2
nameservers:
addresses: [114.114.114.114,8.8.8.8]
routes 部分用于指定网络路由。via 后面的地址 192.168.56.2 是默认网关(gateway)的 IP 地址,可以通过以下命令获取到默认网关。
ip route show | grep "default"
应用 /etc/netplan/
目录中的配置文件生效,使用以下命令:
netplan apply