前言
因公司项目需要,准备学习k8s,但是网上教程中的k8s版本均比较旧,因此个人在阅读官方文档以及借鉴多方资料后,将个人使用虚拟机部署的过程记录下来,供大家参考。
配置及版本
软件名称 | 版本 |
K8S | 1.31 |
VMware Workstation Pro | 17 |
CentOS | Stream-9-x86_64 |
虚拟机配置
VMware及CentOS的安装过程,网上教程比较多,且与本文核心内容关联不大,因此不作叙述,默认在VMware上已经安装好了两台虚拟机。
官方文档配置说明
个人设置的虚拟机配置
如图,该配置仅适用于本文教程,请根据个人实际情况进行调整
控制面节点部署过程
切到超级权限(可选)
后续一些操作,如设置防火墙端口等,需要sudo权限,因此为了方便可以一开始先切到sudo权限。
输入
sudo -s
然后输入超级管理员的密码即可,实际效果如图
设置防火墙
官方文档要求开放如下端口
输入如下命令来永久开启端口
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10259/tcp
firewall-cmd --permanent --add-port=10257/tcp
实际效果
输入如下命令来重启防火墙服务
systemctl restart firewalld
输入如下命令来检查端口是否开放成功
firewall-cmd --list-all
实际效果
可见相关端口均已开放
设置网络
输入如下命令以便支持 Kubernetes 集群的一些基本网络功能
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 重新加载 sysctl 配置以使更改立即生效
sysctl --system
关闭交换分区
官方文档说明
输入如下命令来查看是否有交换分区
free -m
结果如图
如果swap不是0 0 0的话,说明没有禁用
输入如下命令来进入相关配置文件
vim /etc/fstab
将包含swap这一行注释,直接在最开头加上# 即可
输入如下命令来重启系统
reboot
重启后,输入如下命令来检查swap分区是否已经关闭
free -m
发现swap已经关闭
修改hostname(可选)
为了便于区分hostname,可以根据实际情况修改hostname,这里,我将hostname改成master,使用如下命令
hostnamectl set-hostname master
使用如下命令来检查hostname是否已经更改成功
hostname
实际效果
为hostname添加DNS(可选)
获取当前主机的ip
ifconfig
如图所示,获取ip地址
进行如下操作来为hostname设置DNS解析
vim /etc/hosts
安装运行时
官方文档说明
这里我们选择安装containerd作为运行时
containerd下载地址:Releases · containerd/containerd · GitHub
因为我的linux是amd架构的https://github.com/containerd/containerd/releases/tag/v1.7.22,所以选择这个并右击复制下载链接
输入如下命令下载tar包,因为containerd版本不断迭代,地址注意替换成自己复制的
wget https://github.com/containerd/containerd/releases/download/v1.7.22/cri-containerd-1.7.22-linux-amd64.tar.gz
开始下载
下载完成
使用如下命令将其解压到/目录下
tar xf cri-containerd-1.7.22-linux-amd64.tar.gz -C /
输入如下命令进行验证
which containerd
如果报错
是因为containerd默认解压到/usr/local/bin目录下,runc默认解压到/usr/local/sbin目录下,这两个目录都不在path变量中,输入如下命令来将这个目录放到path变量中
vim ~/.bashrc
在最后一行加上
export PATH=$PATH:/usr/local/bin:/usr/local/sbin
如图
保存后,输入如下命令使更改立刻生效
source ~/.bashrc
输入如下命令检查path中是否包含/usr/local/bin
echo $PATH
如图,已包含
再次输入which containerd命令,如图
输入如下命令确认版本
containerd --version
如图
为containerd创建自定义配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
对这个文件做部分修改,如图
镜像地址:registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10
输入如下命令重新加载配置并启动containerd
systemctl daemon-reload
systemctl enable --now containerd
如图
安装 kubeadm、kubelet 和 kubectl
因为我的是centos,所以按照官方文档来,链接:安装 kubeadm | Kubernetes
按照文档输入如下命令
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
# 安装 kubelet、kubeadm 和 kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启用 kubelet 以确保它在启动时自动启动
sudo systemctl enable --now kubelet
生成kubeadm配置文件
输入如下命令生成k8s配置文件
# 在 /etc下建立k8s目录
mkdir /etc/k8s
# 进入该目录
cd /etc/k8s
# 使用kubeadm创建默认配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
# 修改该文件
vim kubeadm-config.yaml
对kubeadm-config做如下三处修改
阿里云镜像源地址
registry.cn-hangzhou.aliyuncs.com/google_containers
保存
下载镜像
输入如下命令开始下载镜像
kubeadm config images pull --config /etc/k8s/kubeadm-config.yaml
下载完成,如图
初始化控制面节点
输入如下命令
kubeadm init --config /etc/k8s/kubeadm-config.yaml --upload-certs
等待几分钟,初始化完成,如图
根据输出提示,依次输入如下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
保存kubeadm join命令,以便于后续节点加入
kubeadm join 192.168.28.159:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:866f12e36fdf80317673b1cb8ed7ae605f71b68b1eb4c9671da7cd1f10f64884
工作节点部署过程
切到超级权限(可选)
同控制节点。
修改hostname(可选)
为了便于区分hostname,可以根据实际情况修改hostname,这里,我将hostname改成node1
hostnamectl set-hostname node1
设置防火墙
官方文档要求开放如下端口
输入如下命令来永久开启端口
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10256/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
关闭交换分区
同控制节点
为hostname添加DNS(可选)
类似控制节点,注意在hosts文件中的域名改成之前设置的hostname
设置网络
同控制节点
安装 kubeadm、kubelet 和 kubectl
同控制节点
加入集群
输入初始化控制面节点中保存的kubeadm join命令
等待一小会后如图
在控制面节点上输入如下命令进行验证
kubectl get nodes
结果如图
部署集群网络插件
如上所示,所有节点的status都是NotReady,这是因为没有部署网络插件,我们选择Calico作为集群网络插件,官方文档链接:Kubernetes 上的 Calico 快速入门 |Calico 文档 (tigera.io)
输入如下命令来安装 Tigera Calico 运算符和自定义资源定义
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/tigera-operator.yaml
效果如图
然后输入如下命令
kubectl get ns
发现多出一个命名空间
接着输入如下命令来确保网络插件pods已经运行
kubectl get pods -n tigera-operator
结果如图,status是Running即可
接着,我们的操作和官方文档有些区别
官方文档的说明是
但是我们需要更改官方提供的配置以适应自己的环境,所以我们操作如下
# 首先创建calico的配置目录
mkdir /etc/calico
# 进入该目录
cd /etc/calico
# 将官方模板配置下载到该目录
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/custom-resources.yaml
# 修改配置文件
vim custom-resources.yaml
将cidr区间修改成前文 生成kubeadm配置文件 一章中设置的网段,如下图
保存,然后运行如下命令
kubectl create -f /etc/calico/custom-resources.yaml
结果如图
输入如下命令
kubectl get ns
结果如图,发现多了一个命名空间
输入如下命令来确保该命名空间下所有的pods已经正常运行
kubectl get pods -n calico-system
结果如图
接着输入如下命令来检查节点状态
kubectl get nodes
结果如图,状态从not ready变成ready
总结
因k8s知识非常多,本文只是根据本人亲自实践的过程,展示如何创建和加入k8s集群,剩下的知识,各位可根据自己需要查找其他资料进行学习。
非常感谢大家对本文的支持,也欢迎大家通过评论、私信或者我的邮箱等方式与我进行探讨交流。