【Kubernetes集群一主二从安装教程】

文章目录

  • 环境准备
    • 主机间做信任
    • 安装ansible工具
  • 升级内核版本
    • 使用elrepo源升级内核
    • 查看最新版内核
    • 安装最新的内核版本
    • 设置系统默认内核
    • 设置默认内核为我们刚才升级的内核版本
  • 初始化
  • 关闭防火墙
    • 关闭selinux
    • 关闭swap
    • 修改主机名
    • 修改hosts文件
    • 将桥接的IPv4流量传递到iptables的链
    • 配置时间同步
  • 安装containerd
    • 测试containerd是否能创建和启动成功
  • 安装kubernetes
    • 添加kubernetes源
    • 安装
    • 初始化
    • node节点配置
    • 网络配置
    • CNI插件问题
    • 验证
    • nodes/集群内部 无法访问ClusterIP
    • 扩展

环境准备

本地用的操作系统是Windows 10 专业版,版本号22H2,操作系统内部版本19045.3324,内存64.0 GB,处理器12th Gen Intel® Core™ i9-12900K 3.19 GHz,三台机都是通过VMware Workstation Pro安装Centos7的操作系统。

规划Kubernetes集群配置

角色IPkubernetes版本
k8s-master192.168.122.130
k8s-node1192.168.122.131
k8s-node2192.168.122.132

主机间做信任

生成密钥对儿,并设置其可远程连接本地主机后, 将私钥文件及authorized_keys文件复制给余下的所有节点即可,做好免密登录,方便后续的操作。

执行ssh-copy-id root@目标IP地址命令实现免密登录,其他两台做同样的操作。

所有节点上执行以下命令,生成密钥对儿:

ssh-keygen -t rsa

所有节点执行以下命令,将文件发送到主节点:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.130

主节点执行以下命令,查看authorized_keys文件:

cd /root/.ssh/
cat /root/.ssh/authorized_keys 

master节点效果如下:

[root@k8s-master .ssh]# cat /root/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCak3h2omdNvqH6R7YJfvM9TxvsfKqiWtmSjahb4q/jQm7GYL+/75vK78Wdhvre2gzCuubksczVlZ8rHnB/Li4N9HrjqPOaA+qctg76YZug8BBAVecSXHwCxRy7kKgEDkX8Qf8lZzE6LlBuI4xz2skXRgUA5VaJMOtAFk5ROMGW0dcF+2Eb3o5g9KtYs8Dw8JLVvLAg8FxgnfCCV6g4rckNcJDNa7kA8oplBeE5VW5DGVhIS3k2qhNhlJVtn7MX+L819plmqEpEeLoEpF/ikU6/X4l6w+RWsy9kE8SvZ7r2Nfc4tyYUKc5LxDA6zyA3LwLr+UdUXcZXZvPbal7Rd3Cv root@k8s-node2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXtQC07Ta52w53na8IVQLMKqDyPy2+pI173UUYBr/TQGfa/zO+dAr0ONRbiLsio/rmjLOerGs7SS9hoWCDqnJemie/KUNJKXiZuMPxGMG/Wip63tQj2vaf+bLSXOGcafN6VeC01rHTLDMSSde1Csp5TbHEL9b12Q31dJYIsSTTs35n9LILUuje2mjdg1VVdAO5PUp8O7DQoehcNWc40uiOHmRrfTsNCFgXicwMz0YiOnbAe83ETnUWhVEf0YTkLDDGIuY8Miy7Lh3mL8ospTL2FroOOiASsS/2FozVqCjn4EAMatfFU0iCgKgjlmmGUR3K12q2svYqBtLgNuQuD/xb root@k8s-node1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLQhSxAc/f6HPmeEeqv8djy344GgtKlkxej3kVZaQAhBhPibPaQI6FUdqpUz2S/7Qx/Idy2mHri3nh1HhMr8DGwyILJH/AjznXozdkEi9p+che0VAdyqZZZGvrW5r22X1Pn4jAwZKsq1aSUPGEcdPAT12cq7Fq3VVBccpZtLVJI2y6eJQI+4ohVPE6NgRquCfVhtqTKIDx+1tfmr1oLEphU+/mIyyJsL3B0ogbFWnTaAdlddwsL2JAz4t8zR0vn0XrMBC9z25jGrlBIwZSTyM6LBAZ03u5Tf9v4Y54wmAUNG4OXtSbUiLj00o9/1ohLOFsTb9903XjDqSApfGd0Qz3 root@k8s-master

主节点执行以下命令,将authorized_keys推送到从节点1上

scp authorized_keys root@192.168.122.131:/root/.ssh/

slave1节点效果如下:

[root@k8s-node1 .ssh]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCak3h2omdNvqH6R7YJfvM9TxvsfKqiWtmSjahb4q/jQm7GYL+/75vK78Wdhvre2gzCuubksczVlZ8rHnB/Li4N9HrjqPOaA+qctg76YZug8BBAVecSXHwCxRy7kKgEDkX8Qf8lZzE6LlBuI4xz2skXRgUA5VaJMOtAFk5ROMGW0dcF+2Eb3o5g9KtYs8Dw8JLVvLAg8FxgnfCCV6g4rckNcJDNa7kA8oplBeE5VW5DGVhIS3k2qhNhlJVtn7MX+L819plmqEpEeLoEpF/ikU6/X4l6w+RWsy9kE8SvZ7r2Nfc4tyYUKc5LxDA6zyA3LwLr+UdUXcZXZvPbal7Rd3Cv root@k8s-node2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXtQC07Ta52w53na8IVQLMKqDyPy2+pI173UUYBr/TQGfa/zO+dAr0ONRbiLsio/rmjLOerGs7SS9hoWCDqnJemie/KUNJKXiZuMPxGMG/Wip63tQj2vaf+bLSXOGcafN6VeC01rHTLDMSSde1Csp5TbHEL9b12Q31dJYIsSTTs35n9LILUuje2mjdg1VVdAO5PUp8O7DQoehcNWc40uiOHmRrfTsNCFgXicwMz0YiOnbAe83ETnUWhVEf0YTkLDDGIuY8Miy7Lh3mL8ospTL2FroOOiASsS/2FozVqCjn4EAMatfFU0iCgKgjlmmGUR3K12q2svYqBtLgNuQuD/xb root@k8s-node1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLQhSxAc/f6HPmeEeqv8djy344GgtKlkxej3kVZaQAhBhPibPaQI6FUdqpUz2S/7Qx/Idy2mHri3nh1HhMr8DGwyILJH/AjznXozdkEi9p+che0VAdyqZZZGvrW5r22X1Pn4jAwZKsq1aSUPGEcdPAT12cq7Fq3VVBccpZtLVJI2y6eJQI+4ohVPE6NgRquCfVhtqTKIDx+1tfmr1oLEphU+/mIyyJsL3B0ogbFWnTaAdlddwsL2JAz4t8zR0vn0XrMBC9z25jGrlBIwZSTyM6LBAZ03u5Tf9v4Y54wmAUNG4OXtSbUiLj00o9/1ohLOFsTb9903XjDqSApfGd0Qz3 root@k8s-master

主节点执行以下命令,将authorized_keys推送到从节点2上

scp authorized_keys root@192.168.122.132:/root/.ssh/

slave2节点效果如下:

[root@k8s-node2 .ssh]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCak3h2omdNvqH6R7YJfvM9TxvsfKqiWtmSjahb4q/jQm7GYL+/75vK78Wdhvre2gzCuubksczVlZ8rHnB/Li4N9HrjqPOaA+qctg76YZug8BBAVecSXHwCxRy7kKgEDkX8Qf8lZzE6LlBuI4xz2skXRgUA5VaJMOtAFk5ROMGW0dcF+2Eb3o5g9KtYs8Dw8JLVvLAg8FxgnfCCV6g4rckNcJDNa7kA8oplBeE5VW5DGVhIS3k2qhNhlJVtn7MX+L819plmqEpEeLoEpF/ikU6/X4l6w+RWsy9kE8SvZ7r2Nfc4tyYUKc5LxDA6zyA3LwLr+UdUXcZXZvPbal7Rd3Cv root@k8s-node2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXtQC07Ta52w53na8IVQLMKqDyPy2+pI173UUYBr/TQGfa/zO+dAr0ONRbiLsio/rmjLOerGs7SS9hoWCDqnJemie/KUNJKXiZuMPxGMG/Wip63tQj2vaf+bLSXOGcafN6VeC01rHTLDMSSde1Csp5TbHEL9b12Q31dJYIsSTTs35n9LILUuje2mjdg1VVdAO5PUp8O7DQoehcNWc40uiOHmRrfTsNCFgXicwMz0YiOnbAe83ETnUWhVEf0YTkLDDGIuY8Miy7Lh3mL8ospTL2FroOOiASsS/2FozVqCjn4EAMatfFU0iCgKgjlmmGUR3K12q2svYqBtLgNuQuD/xb root@k8s-node1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLQhSxAc/f6HPmeEeqv8djy344GgtKlkxej3kVZaQAhBhPibPaQI6FUdqpUz2S/7Qx/Idy2mHri3nh1HhMr8DGwyILJH/AjznXozdkEi9p+che0VAdyqZZZGvrW5r22X1Pn4jAwZKsq1aSUPGEcdPAT12cq7Fq3VVBccpZtLVJI2y6eJQI+4ohVPE6NgRquCfVhtqTKIDx+1tfmr1oLEphU+/mIyyJsL3B0ogbFWnTaAdlddwsL2JAz4t8zR0vn0XrMBC9z25jGrlBIwZSTyM6LBAZ03u5Tf9v4Y54wmAUNG4OXtSbUiLj00o9/1ohLOFsTb9903XjDqSApfGd0Qz3 root@k8s-master

所有节点修改一下权限,代码如下:

chmod 600 /root/.ssh/*

使用以下命令测试是否已实现SSH免密登录:

ssh root@192.168.122.130

安装ansible工具

是的,Ansible是一种自动化工具,可用于配置和管理多个服务器。它使用SSH连接来远程管理服务器,可以在多个服务器上同时执行命令,从而提高效率。安装Ansible也非常简单,只需从官方的yum源安装即可。在CentOS上,可以使用以下命令安装Ansible,只需要在master上安装,然后在配置/etc/ansible/hosts文件中,将要操作的主机加入一个组中即可。安装命令代码如下:

yum install epel-release -y
yum -y install ansible

在安装完成后,就可以开始使用Ansible进行自动化配置和管理服务器了。
配置/etc/ansible/hosts,该文件是存放要操作的主机,如下:

vim /etc/ansible/hosts

把上述三台机器加入一个组名字为k8s,如下:

[k8s]
192.168.122.130
192.168.122.131
192.168.122.132

执行ansible命令测试连通性,命令如下:

ansible k8s -m ping

该命令会对名为k8s的主机组中的所有主机执行ping模块,测试它们是否能正常连接。如果输出pong,就说明测试成功。如果输出失败信息,则需要检查主机的网络设置和防火墙等因素是否正确。
-m:指定使用的Ansible模块。 ping:是Ansible中一个模块,用于测试主机的连通性。 k8s:是Ansible中定义的主机组名,即要执行ping命令的目标主机所属的主机组。
k8s:刚定义的组名
在这里插入图片描述

升级内核版本

查看Linux内核版本号,可以使用以下命令:

uname -sr

这将返回当前正在运行的Linux内核版本号。

Linux 3.10.0-1160.95.1.el7.x86_64

当前内核版本是3.10,Kubernetes需要使用一些Linux内核的功能,例如Namespaces、Cgroups、OverlayFS等,这些功能是在比较新的Linux内核版本中才能够完整支持。因此,为了保证Kubernetes的正常运行,建议升级到最新的Linux内核版本。对于Kubernetes1.22版本来说,官方推荐的最低Linux内核版本为4.4。如果使用的是更老的Linux内核版本,可能会在Kubernetes的安装、部署和使用中遇到一些问题或者限制。因此,为了获得更好的Kubernetes使用体验,建议升级到官方推荐的Linux内核版本或者更高的版本。

使用elrepo源升级内核

在每台机器上都执行相同的命令来安装elrepo源,配置elrepo源,执行如下命令:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

查看最新版内核

执行如下命令查看最新的内核版本

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

在这里插入图片描述

kernel-ml #主线版本,比较新
kernel-lt #长期支持版本,比较旧

安装最新的内核版本

执行如下命令安装主线版本:

yum --enablerepo=elrepo-kernel install kernel-ml -y

在这里插入图片描述

设置系统默认内核

查看系统上的所有内核版本:

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

在这里插入图片描述

设置默认内核为我们刚才升级的内核版本

备份

cp /etc/default/grub /etc/default/grub-bak 

设置默认内核版本

grub2-set-default 0 

编辑/etc/default/grub

vi /etc/default/grub

将GRUB_DEFAULT=saved修改为GRUB_DEFAULT=0

重新创建内核配置

grub2-mkconfig -o /boot/grub2/grub.cfg

查看默认内核

grubby --default-kernel
grub2-editenv  list

效果如下:
在这里插入图片描述
更新软件包并重启

yum makecache
reboot

效果如下:
在这里插入图片描述

初始化

安装K8S之前需要对系统进行一些设置,比如 关闭防火墙,selinux,swap,设置主机名,ip解析,时间同步 。

关闭防火墙

通过ansible把三台机器的防火墙关闭,并设置开机不启动。执行如命令:

ansible k8s -m shell -a "systemctl stop firewalld"
ansible k8s -m shell -a "systemctl disable firewalld"

在这里插入图片描述

关闭selinux

通过ansible把三台机器的selinux永久关闭,执行如命令:

ansible k8s -m shell -a "sed -i 's/enforcing/disabled/' /etc/selinux/config"

在这里插入图片描述

关闭swap

执行swapoff -a 临时关闭,通过修改/etc/fstab文件实现永久关闭。执行如下命令

ansible k8s -m shell -a "sed -ri 's/.*swap.*/#&/' /etc/fstab"

在这里插入图片描述

修改主机名

分别对三台主机进行主机名的修改,通过图形页面直接修改更快,效果如下:

在这里插入图片描述
也可以执行如下的命令进行修改:

根据规划设置主机名【k8s-master节点上操作】

hostnamectl set-hostname k8s-master

根据规划设置主机名【k8s-node1节点操作】

hostnamectl set-hostname k8s-node1

根据规划设置主机名【k8s-node2节点操作】

hostnamectl set-hostname k8s-node2

修改hosts文件

在master节点上修改hosts文件,根据规划进行修改,命令如下:

sudo nano /etc/hosts 

然后添加以下内容,如下:

192.168.122.130 k8s-master1
192.168.122.131 k8s-node1
192.168.122.132 k8s-node2

保存并退出nano编辑器,命令为Ctrl+X,输入Y确认保存,按Enter键,然后可以通过ping或者ssh命令测试hostname是否生效,例如:

ping k8s-master1
ssh k8s-node1

将桥接的IPv4流量传递到iptables的链

在/etc/sysctl.d/目录上新增k8s.conf,内容如下:

# 允许桥接设备对 IPv6 进行 iptables 调用
net.bridge.bridge-nf-call-ip6tables = 1
# 允许桥接设备对 IPv4 进行 iptables 调用
net.bridge.bridge-nf-call-iptables = 1
# 开启 IPv4 转发功能
net.ipv4.ip_forward = 1

把该文件拷贝到其他两台机器上,如下:

ansible k8s -m copy -a "src=/etc/sysctl.d/k8s.conf dest=/etc/sysctl.d/k8s.conf"

在这里插入图片描述执行 sysctl --system命令使配置生效,代码如下:

ansible k8s -m shell -a "sysctl --system"

在这里插入图片描述

配置时间同步

使用yum命令安装ntpdate,如下:

ansible k8s -m shell -a "yum install ntpdate -y"

在这里插入图片描述
配置NTP网络时间同步服务器地址为 ntp.aliyun.com,执行如下命令:

ansible k8s -m shell -a "ntpdate ntp.aliyun.com"

在这里插入图片描述

安装containerd

执行如下命令下载最新containerd,如下:

wget https://download.fastgit.org/containerd/containerd/releases/download/v1.6.6/cri-containerd-cni-1.6.6-linux-amd64.tar.gz --no-check-certificate

需要注意大小是否正常,不正常后面解压不了
在这里插入图片描述如果实在下载不了,这里提供地址:https://download.csdn.net/download/java_wxid/88206551

解压containerd安装包

tar -C / -zxf cri-containerd-cni-1.6.6-linux-amd64.tar.gz

配置环境变量,编辑用户目录下的bashrc文件添加如下内容:

export PATH=$PATH:/usr/local/bin:/usr/local/sbin

并执行如下命令使环境变量立即生效:

source ~/.bashrc

执行如下命令启动containerd

systemctl start  containerd

执行如下命令查看版本号,出现如下信息表明安装成功。

ctr version

在这里插入图片描述

创建默认配置文件

mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
vi /etc/containerd/config.toml

在配置文件中,将以下行的注释去掉:[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc]
在这里插入图片描述

测试containerd是否能创建和启动成功

执行如下命令拉取镜像并创建容器:
拉取容器

ctr i pull docker.io/library/nginx:alpine 

创建容器

ctr c create --net-host docker.io/library/nginx:alpine nginx 
ctr task start -d nginx

在这里插入图片描述查看Containerd服务启动信息:

systemctl status containerd -l

在这里插入图片描述

查看containerd组件加载情况,发现overlayfs异常

ctr plugin ls

在这里插入图片描述通过以下命令查看containerd运行日志:

sudo journalctl -fu containerd

在这里插入图片描述通过查看容器内的文件系统,确认为xfs文件系统:

df -Th

在这里插入图片描述
查阅官方资料:
在这里插入图片描述其中有二条比较有用的:
OverlayFS是推荐的存储驱动程序,如果满足以下先决条件,则支持它:
4.0版或更高版本的Linux内核,或RHEL或使用3.10.0-514版或更高级内核的CentOS。(内核版本已经升级过了,符合条件)
overlay2驱动程序在xfs备份文件系统上受支持,但仅在启用d_type=true的情况下才受支持。(这个才是重点)
前面设置的系统内核版本是Linux 6.4.9-1.el7.elrepo.x86_64,这个版本默认的存储驱动是fuse-overlayfs,而不是overlay2。因此,在使用docker时,默认会使用fuse-overlayfs作为存储驱动,想要使用overlay2作为存储驱动,还需要手动配置docker,将存储驱动设置为overlay2, 在/etc/docker/daemon.json中添加以下内容:{ “storage-driver”: “overlay2” },然后使用命令systemctl restart docker.service进行重启。接着让文件系统需要支持d_type=true,使用命令mount | grep overlay进行检查是否支持,最后使用docker info命令检查是否成功修改存储驱动为overlay2。

如果启动容器出现如下报错,是由于缺少runc并升级libseccomp,libseccomp需要高于2.4版本。

ctr: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error 
(open /run/containerd/io.containerd.runtime.v2.task/default/nginx/log.json: no such file or directory): 
fork/exec /

containerd在v1.6.4版本以后使用v1.1.2的runc和v1.1.1的cni。

下载链接:https://github.com/opencontainers/runc/releases/download/v1.1.2/runc.amd64?spm=a2c6h.12873639.article-detail.8.31cb4c6a6D2Htj&file=runc.amd64
下载之后,执行如下命令安装并查看版本号:

install -m 755 runc.amd64 /usr/local/sbin/runc
runc -v

执行如下命令升级libseccomp:
查询原来的版本

rpm -qa | grep libseccomp

卸载原来的版本

rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps

下载高版本的

wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm 

安装

rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm

安装kubernetes

添加kubernetes源

在master节点上添加k8s软件源,并分发到其他两台机器上。在/etc/yum.repos.d/目录下新增kubernetes.repo。内容如下:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
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

把kubernetes.repo文件分发到其他两台机器上,执行如下命令:

ansible k8s -m copy -a "src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo"

在这里插入图片描述

安装

在master节点下执行如下命令安装相应的软件:

yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3

生成默认配置并修改相应的参数,通过如下命名生成一个默认的配置文件:

kubeadm config print init-defaults > kubeadm-init.yaml

根据自己的环境修改对应的参数:

# api版本是kubeadm.k8s.io/v1beta3
apiVersion: kubeadm.k8s.io/v1beta3
# 引导令牌
bootstrapTokens:
  - groups:
      - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef  # 令牌
    ttl: 24h0m0s  # 过期时间为 24 小时
    usages:
      - signing  # 用于签名
      - authentication  # 用于认证
# 初始化配置
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.122.130  #master节点IP
  bindPort: 6443  # 绑定端口
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock  # containerd 的 socket 文件地址
  imagePullPolicy: IfNotPresent  # 镜像拉取策略为 IfNotPresent
  name: k8s-master # 节点名称
  taints: null  # 污点为空
# 集群配置
apiServer:
  timeoutForControlPlane: 4m0s  # 控制平面的超时时间为 4 分钟
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki  # 证书目录
clusterName: kubernetes  # 集群名称
controllerManager: {}  # 控制器管理器
dns: {}  # dns
etcd:
  local:
    dataDir: /var/lib/etcd  # etcd 数据目录
imageRepository: registry.aliyuncs.com/google_containers  #阿里云容器源地址
kind: ClusterConfiguration
kubernetesVersion: 1.24.0  # kubernetes 版本
networking:
  dnsDomain: cluster.local  # dns 域名
  podSubnet: 10.244.0.0/16  #pod的IP网段
  serviceSubnet: 10.96.0.0/12  # 服务子网
scheduler: {}  # 调度器

初始化

执行如下命令进行初始化:

 kubeadm init --config=kubeadm-init.yaml   --v=6

–config:指定根据那个配置文件进行初始
–v:指定日志级别,越高越详细

按照初始化成功提示信息,做如下操作:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

接下来执行kubectl就可以看到node了

kubectl get node

查看k8s各部件启动情况,执行如下命令:

kubectl get pod --all-namespaces -o wide

node节点配置

node节点安装kubeadm

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装相关组件

yum install -y kubeadm-1.24.3 --disableexcludes=kubernetes

添加join命令

kubeadm join 192.168.248.130:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:e9e29c804f92193928f37ca157b73a7ad77e7929314db98855b3ba6e2ce2273d

如果我们后续需要添加node节点时,可以到master节点执行下面的命令获取token相关信息

kubeadm token create --print-join-command

如果添加某台节点异常了,修改后可以执行 kubeadm reset的命令,然后在重新join加入

网络配置

coredns还没启动,因为还没有安装网络插件,接下来安装网络插件,可以在该文档中选择我们自己的网络插件,这里安装flannel

wget http://down.i4t.com/k8s1.24/kube-flannel.yml

根据需求修改网卡配置,我这里ens33为主的:

containers:
- name: kube-flannel
 image: quay.io/coreos/flannel:v0.12.0-amd64
 command:
 - /opt/bin/flanneld
 args:
 - --ip-masq
 - --kube-subnet-mgr
 - --iface=ens33  # 如果是多网卡的话,指定内网网卡的名称

在kubeadm.yaml文件中设置了podSubnet网段,同时在flannel中网段也要设置相同的。 (我这里默认就是相同的配置)

执行部署

kubectl apply -f kube-flannel.yml

CNI插件问题

默认情况下containerd也会有一个cni插件,但是我们已经安装Flannel了,我们需要使用Flannel的cni插件,需要将containerd里面的cni配置文件进行注释,否则2个配置会产生冲突 。因为如果这个目录中有多个 cni 配置文件,kubelet 将会使用按文件名的字典顺序排列的第一个作为配置文件,所以前面默认选择使用的是 containerd-net 这个插件。

mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
systemctl restart containerd kubelet

验证

验证dns是否正常能解析和pod之间。这里新建一个测试的yaml文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: abcdocker9/centos:v1
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

执行下面命令,创建pod

kubectl apply -f test.yaml

使用nslookup查看是否能返回地址

kubectl exec -it busybox -- nslookup kubernetes

测试nginx svc以及Pod内部网络通信是否正常 ,分别在三台机器上进行下面操作

ping 10.104.115.26 #nginx svc ip
ping 10.244.1.2 #podIP

如果成功ping同说明node跟pod的网络已经打通了。否则检查kube-proxy的模式是否正确。

nodes/集群内部 无法访问ClusterIP

默认情况下,我们部署的kube-proxy通过查看日志,能看到如下信息:Flag proxy-mode="" unknown,assuming iptables proxy
原因分析:
并没有正确使用ipvs模式
解决方法:
在master上修改kube-proxy的配置文件,添加mode为ipvs。

kubectl edit cm kube-proxy -n kube-system
kubectl edit cm kube-proxy -n kube-system

删除原来的POD,会自动重启kube-proxy 的pod

kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'

扩展

在使用过程中发现kubectl 命令不能补全,使用起来很不方便。为了提高使用kubectl命令工具的便捷性,介绍一下kubectl命令补全工具的安装。
1、安装bash-completion:

yum install -y bash-completion 
source /usr/share/bash-completion/bash_completion

2、 应用kubectl的completion到系统环境:

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/603591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

52岁前宝丽金小花懒理旧爱郭晋安离婚,大晒美腿甜蜜放闪

TVB三届视帝郭晋安与欧倩怡早前在社交平台共同宣布离婚&#xff0c;并透露二人已分居两年&#xff0c;18年夫妻情画上句号&#xff0c;惊爆全城。郭晋安曾受访指&#xff0c;遇上欧倩怡前只有两段深刻的感情&#xff0c;一段是初恋&#xff0c;另一段则是刘小慧。 旧爱刘小慧懒…

贪吃蛇游戏(C语言实现)

目录 游戏效果展示文件代码的展示test.cSnake.cSnake.h 下一个坐标不是食物 游戏效果展示 QQ录屏20240507163633 文件 代码的展示 test.c #define _CRT_SECURE_NO_WARNINGS#include<locale.h> //设置本地化 #include"Snake.h"//游戏的测试逻辑 void test() {…

【服务治理中间件】consul介绍和基本原理

目录 一、CAP定理 二、服务注册中心产品比较 三、Consul概述 3.1 什么是Consul 3.2 Consul架构 3.3 Consul的使用场景 3.4 Consul健康检查 四、部署consul集群 4.1 服务器部署规划 4.2 下载解压 4.3 启动consul 五、服务注册到consul 一、CAP定理 CAP定理&#xff…

STM32使用ADC单/多通道检测数据

文章目录 1. STM32单片机ADC功能详解 2. AD单通道 2.1 初始化 2.2 ADC.c 2.3 ADC.h 2.4 main.c 3. AD多通道 3.1 ADC.c 3.2 ADC.h 3.3 main.c 3.4 完整工程文件 1. STM32单片机ADC功能详解 STM32单片机ADC功能详解 2. AD单通道 这个代码实现通过ADC功能采集三脚电…

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度&#xff0c;还增强了用户界面的动态性和交互性&#xff0c;允许开发者将应用界面划分为多个独立、可重用的部分&#xff0c;每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

无人直播需要什么软件系统?最新AI实景自动无人直播软件:智能化引领直播拓客新时代

随着互联网的快速发展&#xff08;无人直播招商加盟&#xff1a;hzzxar&#xff09;直播行业已经成为商家品牌推广和商品销售的热门方式。近年来&#xff0c;人工智能技术的飞速发展&#xff0c;催生了一款令人惊叹的AI实景自动无人直播软件&#xff0c;为商家提供了全新的直播…

2024视觉与学习青年学者研讨会(VALSE 2024)热点推文预告

视觉与学习青年学者研讨会&#xff08;VALSE&#xff09;是国内人工智能领域顶尖学者一年一度的研讨会。该会议的特点是大、全、新。会议的规模大&#xff0c;参会者达到五千人以上&#xff1b;会议的主题全&#xff0c;全面覆盖人工智能的各大领域&#xff1b;会议的内容新&am…

SQL奇难怪状知识点分享

SQL执行顺序 select 语句的完整结构&#xff1a; select 去重 要查询的字段 from表&#xff08;注意&#xff1a;表和字段可以取别名&#xff09; xxxx&#xff08;left/right/full&#xff09; join 要连接的表 on 等值判断&#xff08;顺序&#xff1a;先on再where&#x…

内存卡罢工,数据危机?别急,有救!

在日常生活和工作中&#xff0c;我们越来越依赖于各种电子设备来存储重要数据。其中&#xff0c;内存卡因其便携性和大容量而广受欢迎。然而&#xff0c;当内存卡突然损坏打不开时&#xff0c;我们该如何应对&#xff1f;本文将为您详细解析这一问题&#xff0c;并提供有效的解…

JAVA版本的ATM编程问题记录

前段时间用C语言写了个银行ATM系统&#xff0c;还写了一篇文章记录了一些&#xff0c;C语言的ATM文章。后来又用IDEA写了一个JAVA版本的银行ATM。有人就会问为啥浪费这个时间写ATM呢&#xff1f;&#x1f9d0;其实是我本科代码没学好&#xff0c;所以现在想利用比较熟悉的ATM系…

探秘编程之旅:Baidu Comate 智能代码助手的魔法揭秘

目录 Baidu Comate智能代码助手1.场景需求2.安装步骤3.功能介绍3.1 /指令3.2 插件3.3 #知识 4.使用体验5.总结 Baidu Comate智能代码助手 智能编程助手的意义在于提升编程体验和效率&#xff0c;使开发人员能够更轻松、更快速地完成编码任务&#xff0c;是如今人工智能技术的一…

Flink DataSink介绍

介绍 Flink DataSink是Apache Flink框架中的一个重要组件&#xff0c;它定义了数据流经过一系列处理后最终的输出位置。以下是关于Flink DataSink的详细介绍&#xff1a; 概念&#xff1a;DataSink主要负责对经过Flink处理后的流进行一系列操作&#xff0c;并将计算后的数据结…

Linux学习笔记1

1.背景认知 可能很多人还没有接触Linux&#xff0c;会有点畏惧&#xff0c;我们可以把Linux类比成Windows&#xff0c; 下面是Windows和Linux的启动对比 Windows&#xff1a;上电后一开始屏幕是黑黑的---bios在启动Windows----Windows之后找到c盘启动各种应用程序 Linux&am…

OFDM802.11a的FPGA实现(十)导频插入(含verilog和matlab代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 目录 1.前言2.插入导频原理3.硬件实现4.Matlab仿真5.ModelSim仿真6.结果对比验证7.verilog代码 1.前言 前面一篇文章完成了星座图的映射&#xff0c;今天继续设计后面的模块。在接收机…

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析 下图为keil编译后的结果&#xff1a; 单位为Byte。Code是程序大小。RO是常量大小。RW是读写变量占用大小&#xff0c;如已初始化的静态变量和全局变量。ZI是全零变量占用大小&#xff0c;如未初始化的static修饰的静态变量、全局…

聊聊BitLocker

最近有消息称微软决定在Windows 11 24H2中默认开启BitLocker&#xff0c;这个消息在网上引起了不小的波澜。有人说&#xff0c;对于我们这些普通用户来说&#xff0c;BitLocker真的有必要吗&#xff1f; 什么是BitLocker BitLocker 是一项 Windows 安全功能&#xff0c;可为整…

如何使用多协议视频汇聚/视频安防系统EasyCVR搭建智慧园区视频管理平台?

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…

如何制作有趣的gif?这个方法别错过

是否在社交媒体上看到过很多有趣好玩的gif动图&#xff0c;有的搞笑有趣有的又很可爱。大家有没有想过自己动手制作gif动画呢&#xff1f;接下来&#xff0c;就给大家分享一招gif在线制作&#xff08;https://www.gif5.net/&#xff09;的方法&#xff0c;超简单不需要下载任何…

什么牌子的洗地机质量最好?四款耐用高分产品推荐

洗地机具备了吸尘、擦拭、除菌等多种功能&#xff0c;可以一次完成多种清洁任务&#xff0c;帮助用户更高效地保持家居整洁&#xff0c;节省时间和精力&#xff0c;备受人们的喜爱。但是怎么挑选到优质的洗地机一直是大家关注的问题。今天&#xff0c;笔者将结合自己在家电行业…