第1章-Kubernetes集群部署
原创
本博客原创文章,转载请注明出处
- name: 原创
desc: 本博客原创文章,转载请注明出处
bgColor: '#F0DFB1'
textColor: '#1078E6'
2
3
4
# 第1章-Kubernetes集群部署
本章要点 | 详情 |
---|---|
掌握 Kubernetes 的部署流程 | 1、主机运行环境配置 2、安装 Kubernetes 相关软件包 3、使用 kubeadm 部署 Kubernetes 集群 |
# 前缀知识
网上有很多介绍 Kubernetes 的文章,我这里就不再重复造轮子了,推荐几篇:
# 环境准备
本次实验采用 3 台 Centos 7.9 的虚拟机部署 K8s 集群(点我 (opens new window)下载 Centos 虚拟机镜像文件)。
- 一台虚拟机作为 master 节点(主控节点)。
- 另外两台虚拟机作为 worker 节点(工作节点)。
请提前创建好这 3 台虚拟机,这里不教授虚拟机的创建方法。
主机参数表(其中的 XXX 是你的虚拟机网段):
序号 | 主机名 | IP地址 | 节点角色 |
---|---|---|---|
1 | www.k10.com | 192.168.XXX.10 | master(主控节点) |
2 | www.k11.com | 192.168.XXX.11 | worker1(工作节点 1) |
3 | www.k12.com | 192.168.XXX.12 | worker2(工作节点 2) |
提示
- 虚拟机的内存建议设置为 4GB/台,内存太低可能会造成卡顿、死机等情况。
- 如果你的电脑配置实在太低,可以减少一台 worker 机器,将剩余两台机器的内存调整为 3~3.5GB 。
# 11. 主机参数配置
# 1.11.1 IP地址配置
根据上方的 “主机参数表” 为 3 台虚拟机配置相应的 IP 地址。
1、 使用ifconfig
命令查看当前的网卡名称,此处为ens33
。
2、 然后使用vim
打开相应的网卡配置文件。
vim /etc/sysconfig/network-scripts/ifcfg-<网卡名称>
# 例如
vim /etc/sysconfig/network-scripts/ifcfg-ens33
2
3
4
3、打开文件之后,将原来的配置全部删除,输入以下内容对 IP 地址进行配置,然后保存文件并退出。
(默认情况下,虚拟机中的 X.X.X.1 是你的物理机 IP 地址,而 X.X.X.2 是网关地址)
DEVICE=<网卡名称>
BOOTPROTO=static
ONBOOT=yes
STARTMODE=auto
IPADDR=<IP地址>
NETMASK=<子网掩码>
GATEWAY=<网关>
DNS1=8.8.8.8
# 例如
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
STARTMODE=auto
IPADDR=192.168.80.10
NETMASK=255.255.255.0
GATEWAY=192.168.80.2
DNS1=8.8.8.8
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4、保存退出之后,重启网络服务,再次查看主机的 IP 地址信息,修改成功。然后 ping 一下外网,如果能通,说明正常。
systemctl restart network
ifconfig
ping bing.com
2
3
5、在物理机上 ping 一下这台虚拟机,如果能通的话就在虚拟机上启用 ssh 服务,然后用自己喜欢的 SSH客户端工具 进行连接,方便后续的配置操作。
systemctl start sshd
netstat -tnlp
2
(我使用的 SSH 客户端工具为SecureCRT (opens new window),正版需要付费,那个版自己上网找)(你也可以使用免费的PuTTY (opens new window)或者WindTerm (opens new window))
6、使用相同的配置方式,为另外 2 台虚拟机配置 IP 地址,然后启用 sshd 服务并远程连接。
# worker1的配置
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
STARTMODE=auto
IPADDR=192.168.80.11
NETMASK=255.255.255.0
GATEWAY=192.168.80.2
DNS1=8.8.8.8
# worker2的配置
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
STARTMODE=auto
IPADDR=192.168.80.12
NETMASK=255.255.255.0
GATEWAY=192.168.80.2
DNS1=8.8.8.8
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1.21.2 主机名配置
根据上方的 “主机参数表” 为 3 台虚拟机配置相应的主机名,并在 hosts 文件中同步它们的主机名。
1、使用以下命令,分别为 3 台虚拟机配置主机名。
hostnamectl set-hostname www.k10.com
hostnamectl set-hostname www.k11.com
hostnamectl set-hostname www.k12.com
2
3
4
5
2、配置/etc/hosts
文件,在每台主机之间同步主机名。
# 在每台主机的终端中运行以下命令
cat <<EOF >> /etc/hosts
192.168.80.10 www.k10.com k10
192.168.80.11 www.k11.com k11
192.168.80.12 www.k12.com k12
EOF
2
3
4
5
6
3、测试主机名配置是否成功。
# 三台主机之间互相ping
ping k10
ping k11
ping k12
2
3
4
# 1.31.3 配置防火墙 && 关闭selinux
提示
为所有主机执行以下操作。
防火墙 和 selinux 可能会影响 K8s 环境的正常运行,所以要进行配置/禁用。
1、设置防火墙为信任模式,使 主机或容器之间 能够正常通信。
(注意,不是禁用防火墙,禁用以后还是会拦你)
firewall-cmd --set-default-zone=trusted
firewall-cmd --reload
2
2、禁用 selinux ,使容器能够正常访问主机文件系统。
# 临时禁用
setenforce 0
getenforce
# 修改配置文件,永久禁用
vim /etc/selinux/config
2
3
4
5
6
# 1.41.4 关闭swap(交换分区)
提示
为所有主机执行以下操作。
(K8s 和 swap 兼容性好像不是很好,具体可以看看这个 (opens new window))
1、关闭 swap ,然后在/etc/fstab
文件中注释掉所有的 swap 条目。
# 查看已经启用的swap状态
swapon -s
# 关闭swap
swapoff -a
vim /etc/fstab
2
3
4
5
6
7
# 1.51.5 配置 && 更新yum源
提示
为所有主机执行以下操作。
1、此处使用阿里云的yum源 (opens new window),配置命令如下。
# 删除原有的yum源
rm -rf /etc/yum.repos.d/*
# 配置yum源(基础软件源)
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 配置yum源(K8s软件源)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/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源,时间可能较长 需要耐心等待
yum update -y
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2、yum 源更新完成之后,查看是否有 K8s 相关的软件包。
# 列出软件包kubectl
yum list kubectl
# 列出所有版本
yum list kubectl --showduplicates
2
3
4
5
# 1.61.6 设置内核参数
提示
为所有主机执行以下操作。
1、使用以下命令,设置系统的内核参数。
# 设置内核的网络参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 加载br_netfilter模块
modprobe br_netfilter
# 让新的内核配置立即生效
sysctl -p /etc/sysctl.d/k8s.conf
2
3
4
5
6
7
8
9
10
11
12
2、在某些情况下,执行sysctl
的过程中可能会出现错误(如图 “没有那个文件或目录”),可以运行命令modprobe br_netfilter
加载缺少的模块,从而解决这个问题。
# 22. K8s环境部署
# 2.12.1 安装软件包
K8s 共有 3 个软件包,分别是:
- kubeadm:K8s 管理工具,用于部署、升级等操作。
- kubectl:K8s 命令行工具,用于管理集群内的节点和容器等资源。
- kubelet:K8s 主服务,每台主机上都运行一个名为 kubelet 的服务,用于启动或停止集群、维持集群主机之间的通信(例如接收主控端的命令并执行相应操作)等。
提示
为所有主机执行以下操作。
1、通过 yum 安装 Kubernetes 的三个主要软件。
此处通过 yum 命令来安装 Kubernetes 1.26 版本的软件包:
--disableexcludes
:禁用某个排除选项,允许 kubernetes 相关软件包进行更新。- (注意,安装时如果没有指定版本,则安装的是最新版本)
yum install kubeadm-1.26.5-0 kubectl-1.26.5-0 kubelet-1.26.5-0 --disableexcludes=kubernetes
确定安装的软件包没有问题,输入 “y” 并回车,以确认安装。
2、检查安装是否成功。
安装完成之后,使用systemctl status kubelet
命令查看 kubelet 服务是否存在。
3、重启 Kubernetes 主服务并将其设置为开机自启。
运行以下命令,重启 kubelet 服务,并将其设置为开启自启。此时服务的状态为 “activating” ,说明正常。
systemctl restart kubelet
systemctl enable kubelet
systemctl status kubelet
2
3
4
然后,为其余主机执行相同的操作,确保每台主机上的 kubelet 服务状态都为 “activating”。
# 2.22.2 下载containerd和所需的镜像
我们使用 containerd (opens new window) 作为 K8s 的容器运行时。至于为什么不用 docker,请看本篇教程的 “前言” 章节。
(Github访问较慢,也许你需要Github文件下载加速 (opens new window))
提示
为所有主机执行以下操作。
1、下载和配置 containerd。
containerd 是不用安装的,只需要下载其配置文件 和 可执行文件,然后进行一些设置即可:
# 下载containerd
wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz
# 解压
tar Cxzvf /usr/local containerd-1.7.2-linux-amd64.tar.gz
# 配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 获取service文件并放入相应目录,这将会把containerd注册为系统服务,然后 重载服务+重启服务+设置为开机自启
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/lib/systemd/system/containerd.service
systemctl daemon-reload
systemctl restart containerd && systemctl enable containerd
# 此时服务状态为 “active (running)”
systemctl status containerd
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
从 Github 下载 containerd 软件包:
containerd 服务状态:active(running)
2、拉取和重命名 Kubernetes 集群所需的镜像。
打开 containerd 配置文件,查看 sandbox_image 配置项,所需镜像名称为registry.k8s.io/pause:3.8
。
由于国内网络原因,我们无法直接访问镜像站点,所以此处需要提前下载镜像,以防后续出现问题。(此处通过国内的阿里云镜像源 来下载所需的镜像)
ctr
是 containerd 安装时自带的命令行工具,具有命名空间的概念,和 K8s 有关的镜像都被放在k8s.io
这个命名空间里面。
# 查看所需镜像名
vim /etc/containerd/config.toml
# 创建命名空间k8s.io
ctr ns create k8s.io
ctr ns ls
# 拉取所需镜像,放入命名空间 k8s.io
ctr -n k8s.io i pull registry.aliyuncs.com/google_containers/pause:3.8
ctr -n k8s.io i ls
# 重命名镜像
ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8
ctr -n k8s.io i ls
2
3
4
5
6
7
8
9
10
11
12
13
14
创建命名空间:
所需的镜像为 pause ,通过阿里云源拉取该镜像:
更改镜像名称,下方会多出一个条目,说明命名成功。
然后,为其余主机执行相同的操作,保证每台主机上都安装了 containerd、拉取和重命名了所需的镜像。
你可以通过scp
命令将 containerd 文件拷贝到其余主机上,这样可以节省下载时间:
scp containerd-1.7.2-linux-amd64.tar.gz root@192.168.80.11:/root
scp containerd-1.7.2-linux-amd64.tar.gz root@192.168.80.12:/root
2
# 2.32.3 下载和配置runC
(containerd 的组件)
(Github访问较慢,也许你需要Github文件下载加速 (opens new window))
提示
为所有主机执行以下操作。
# 下载
wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
# 配置
install -m 755 runc.amd64 /usr/local/sbin/runc
# 你可以通过scp命令将 containerd 文件拷贝到其余主机上,这样可以节省下载时间
scp runc.amd64 root@192.168.80.11:/root
scp runc.amd64 root@192.168.80.12:/root
2
3
4
5
6
7
8
9
# 2.42.4 下载和配置CNI plugins
(containerd 的组件)
(Github访问较慢,也许你需要Github文件下载加速 (opens new window))
提示
为所有主机执行以下操作。
# 下载
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
# 配置
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz
# 你可以通过scp命令将 containerd 文件拷贝到其余主机上,这样可以节省下载时间
scp cni-plugins-linux-amd64-v1.3.0.tgz root@192.168.80.11:/root
scp cni-plugins-linux-amd64-v1.3.0.tgz root@192.168.80.12:/root
2
3
4
5
6
7
8
9
10
# 2.52.5 部署集群
# 2.5.12.5.1 初始化 master 节点
执行以下命令初始化 master 节点:
--image-repository
:指定镜像源,此处使用国内的阿里云镜像源。--kubernetes-version
:指定集群版本。--pod-network-cidr
:指定 Pod 的网段。--cri-socket
:指定容器运行时。
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.26.5 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
2
3
4
在 master 主机上,运行以上命令进行集群初始化操作(时间可能较长,需要耐心等待)。
如果初始化成功,则 K8s 会返回 3 条命令给我们,如图所示:
# 2.5.22.5.2 生成配置文件
在 master 节点上执行这 3 条命令,生成 kubernetes 配置文件。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2
3
# 2.5.32.5.3 worker加入集群
在另外两个 worker 节点上执行以下命令,加入刚刚的集群。
kubeadm join 192.168.80.10:6443 --token <你的集群Token> \
--discovery-token-ca-cert-hash sha256:<你的集群证书Hash>
2
在 2.5.1 中初始化成功之后,K8s 除了返回 3 条配置命令之外,还会提供加入集群的命令。
在其他的 worker 主机上运行这条命令,即可加入 master 所在的集群。
下面做一个测试,在 worker 节点加入集群之前,可以看到集群内只有一个 master 节点:
# 查看当前集群内的所有节点
kubectl get nodes
2
在另外两个 worker 节点上运行加入集群的命令:
加入集群之后,再次进行查看,集群内有 master + worker1 + worker2 共三个节点:
如果你没有保存 “加入集群” 的命令或者丢失了,则可以运行以下命令,获取一个新的 “加入集群” 命令。
# 创建新的 token 并打印加入集群的命令
kubeadm token create --print-join-command
2
# 33. 小结
K8s 集群已经部署成功,但其还不能正式投入使用,因为还缺少一些东西。
在下一章中,将对已部署的 K8s 集群进行一些额外的可用性配置。