【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-tokentoken: abcdef.0123456789abcdef  # 令牌ttl: 24h0m0s  # 过期时间为 24 小时usages:- signing  # 用于签名- authentication  # 用于认证
# 初始化配置
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.122.130  #master节点IPbindPort: 6443  # 绑定端口
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sock  # containerd 的 socket 文件地址imagePullPolicy: IfNotPresent  # 镜像拉取策略为 IfNotPresentname: 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.gpghttp://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-flannelimage: quay.io/coreos/flannel:v0.12.0-amd64command:- /opt/bin/flanneldargs:- --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: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:alpinename: nginxports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx
spec:selector:app: nginxtype: NodePortports:- protocol: TCPport: 80targetPort: 80nodePort: 30001
---
apiVersion: v1
kind: Pod
metadata:name: busyboxnamespace: default
spec:containers:- name: busyboximage: abcdocker9/centos:v1command:- sleep- "3600"imagePullPolicy: IfNotPresentrestartPolicy: 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nlp课设 - 基于BERT 的情感分类

基于BERT 的情感分类 主要论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff08;双向Transformer 的预训练&#xff09; 核心技术&#xff1a; Embedding 、Attention --> Transformer 任务简介、拟解决问题…

09 - 数据清洗案例

流程图 kettle 面板图片 操作步骤 1、订阅数据源&#xff08;kafka consumer&#xff09; 2、抽取字段并转换key&#xff08;JSON input&#xff09; 3、判断img字段是否有值&#xff0c;有的话进行url转base64&#xff08;JavaScript 代码&#xff09; // 获取输入字段的值 v…

流量分析利器arkime的学习之路(三)---结合Suricata攻击检测

1、基础 Arkime安装部分参考《流量分析利器arkime的学习之路&#xff08;一&#xff09;—安装部署》 在此基础上安装suricata软件并配置。 2、安装suricata yum install suricate 可能依赖的文件包括libyaml&#xff0c;PyYAML&#xff0c;这些可能在之前安装arkime或者其他…

面试二十四、继承多态

一、继承的本质和原理 组合&#xff08;Composition&#xff09;&#xff1a; 组合是一种"有一个"的关系&#xff0c;表示一个类包含另一个类的对象作为其成员。这意味着一个类的对象包含另一个类的对象作为其一部分。组合关系通常表示强关联&#xff0c;被包含的对象…

Terrain —— Nodes

目录 Convert HeightField —— 转化高度场 HeightField —— 为地形创建初始高度场或遮罩场 HeightField Blur —— 模糊高度场或遮罩场 HeightField Clip —— 限制高度场的值 HeightField Combine Layers —— 将多个volume或VDB合并为一个新的volume或VDB HeightFiel…

我独自升级崛起怎么玩 我独自升级崛起游玩教程分享

《我独自升级&#xff1a;ARISE》是一款预计在 Android、iOS 和 PC 平台推出的动作 RPG&#xff0c;故事内容基于网络漫画版本改编&#xff0c;讲述世界各地出现「次元传送门」&#xff0c;而少部分人类觉醒了可以对抗传送门中怪物的「猎人」能力&#xff0c;玩家可以在故事模式…

【进程等待】是什么 | 为什么 | 怎么办 | wait阻塞等待

目录 进程等待是什么&#xff1f; 为什么要进程等待&#xff1f; 如何进程等待&#xff1f; wait 阻塞等待 进程等待是什么&#xff1f; 进程终止会把进程退出的数据&#xff08;退出码和退出信号&#xff09;存放到进程的PCB中保存下来&#xff0c;让父进程进行等待。…

【投稿资讯】区块链会议CCF C -- CoopIS 2024 截止7.10 附录用率

会议名称&#xff1a;CoopIS CCF等级&#xff1a;CCF C类学术会议 类别&#xff1a;人机交互与普适计算 录用率&#xff1a;2023年接收率21% (21 regular 10 work-in-progress papers/100) AREA 5: HUMAN-CENTRIC SECURITY AND PRIVACY IN INFORMATION SYSTEMS Access Con…

Linux网站服务

1.概念:HTML:超级文本编辑语言 网页:使用HTML,PHP,JAVA语言格式书写的文件。 主页:网页中呈现用户的第一个界面。 网站:多个网页组合而成的一台网站服务器。 URL:统一资源定位符&#xff0c;访问网站的地址。 网站架构:LAMP: LinuxApacheMYSQLPHP(系统服务器程序数据管理…

OpenHarmony 实战开发 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境&#xff1a;Windows 11 编译环境&#xff1a;Ubuntu 22.04 开发板型号&#xff1a;DAYU 200&#xff08;RK3568&#xff09; 系统版本&#xff1a;OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

使用电路仿真软件教学的优势分析

随着科技的飞速发展&#xff0c;电子工程领域对人才的需求与日俱增。为了满足这一需求&#xff0c;教育者们不断探索着更加高效、直观的教学方法。电路仿真软件的出现&#xff0c;为电子工程教学注入了新的活力&#xff0c;它以其独特的优势&#xff0c;成为现代电子工程教育中…

啸叫抑制器采用什么处理芯片?ES56031或PH56031

会议系统或卡拉OK最头疼的就是啸叫了吧&#xff0c;来看看啸叫抑制器采用什么芯片 四通道啸叫抑制器&#xff0c;采用了2个电路板&#xff0c;每个板子处理2路信号&#xff0c;每块电路板有2个卡侬输入插座&#xff0c;2个卡侬输出插座 ES56031S&#xff0c;该啸叫抑制器为4通道…

请大数据把我推荐给正在申请小程序地理位置接口的人

小程序地理位置接口有什么功能&#xff1f; 若提审后被驳回&#xff0c;理由是“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通&#xff0c;建议完成接口开通后或移除接口相关内容后再进行后续版本提审”&#xff0c;那么遇到这种情况&#x…

软件可靠度计算

软件的整体可靠度依据&#xff1a;若是单个就是当前部件的可靠度。若是多个部件&#xff0c;就需要多个部件的可靠度相乘。若是多个部件且有相同备份&#xff0c;那么计算公式更加不一样。 计算公式&#xff1a; 部件数&#xff1a;N 部件可靠度均为&#xff1a;R 单个部件的可…

树莓派4b测量光照强度

1.BH1750光照强度连接图 2. BH1750工作原理 BH1750的通讯过程 第1步:发送上电命令。 发送的过程和第2步基本一致,把测量命令(0x10)改成上电命令(0x01)。第2步:发送测量命令。 下面图片上的例子,ADDR引脚是接GND的,发送的测量命令是“连续高分辨率测量(0x10)”。 发送数据…

oc渲染器如何设置调渲染更快?oc云渲染加速助力

OC渲染器是Cinema 4D软件中广泛使用的渲染工具&#xff0c;它利用GPU进行硬件加速渲染&#xff0c;具备强大的计算性能。这使得它能够为产品和动画制作人员提供卓越的渲染质量。此外&#xff0c;OC渲染器还支持云渲染技术&#xff0c;这在需要进行大规模渲染任务时非常有用&…

【商业】SD NAND(贴片式TF卡)性能体验及应用

SD NAND【商业】   外观   NAND与TF卡的区别   雷龙CS SD NAND(贴片式TF卡)性能体验及应用   最后 SD NAND 外观正反示意图 NAND与TF卡的区别 什么是SD NAND&#xff1f;它俗称贴片式T卡&#xff0c;贴片式TF卡&#xff0c;贴片式SD卡&#xff0c;贴片式内存卡&am…

【贪心算法】哈夫曼编码Python实现

文章目录 [toc]哈夫曼编码不同编码方式对比前缀码构造哈夫曼编码哈夫曼算法的正确性贪心选择性质证明 最优子结构性质证明 总结 Python实现时间复杂性 哈夫曼编码 哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方法&#xff0c;其压缩率通常为 20 % 20\% 20%到 90 % 90\%…

【C++】——内存管理

&#x1f600;&#x1f600;前言 好久没更新了&#xff0c;五一小长假&#xff0c;有点玩脱了&#xff0c;今天赶紧补一篇博客&#xff0c;回回状态 一 c/c内存分配 下面看下面一段代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; i…

数据可视化训练第一天(matplotlib直线;散点图,随机漫步)

前言 本人自己的练习记录&#xff1b;如有错误请指正&#xff1b; https://matplotlib.org/stable/gallery/lines_bars_and_markers/index.html 官方有许多例子&#xff0c;可以找到自己需要的图像模仿进行绘制 1.一个简单的直线例子 就如同我们学习C语言的第一个helloword时…