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

news2025/1/17 5:56:57

文章目录

  • 环境准备
    • 主机间做信任
    • 安装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

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

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

相关文章

谈谈IP地址

IP地址 IP地址概念动态分配 IP(DHCP)NAT机制(网络转换机制)IPv6 IP地址组成特殊的IP地址 IP地址 IP协议报文结构: 概念 IP地址: 描述了主机的具体位置.有32位,利用点分十进制的方式来表示.例如: 192.168.190.77 32位ip地址表示的数据非常有限,42亿九千万…, 那么ip地址不够用…

The Sandbox 案例|Web3 项目引领娱乐业的发展

Web3 如何通过 RZR 系列等项目开创娱乐新纪元。 我们已经看到技术和 Web3 如何颠覆金融和银行等行业&#xff0c;然而娱乐业在不断变化的环境中似乎发展滞后。传统的制片厂生态系统、高成本制作以及历史悠久的运作模式一直占据主导地位&#xff0c;而 Web3 项目的出现为创作者提…

数据结构学习/复习11--二叉树分治与递归思想练习题

一、二叉树相关练习题 1.判断单值二叉树 2. 判断两颗树是否相同 3.先序遍历的实现 注意事项&#xff1a;此处中的数组的下标用指针控制&#xff0c;因为受到递归与函数栈帧创建与销毁的影响。最后的返回值是指向前序遍历排好后的数组指针 4.判断一棵树是否是另一棵树的子树 …

​​​【收录 Hello 算法】第 4 章 数组与链表

第 4 章 数组与链表 数据结构的世界如同一堵厚实的砖墙。 数组的砖块整齐排列&#xff0c;逐个紧贴。链表的砖块分散各处&#xff0c;连接的藤蔓自由地穿梭于砖缝之间。 本章内容 4.1 数组4.2 链表4.3 列表4.4 内存与缓存 *4.5 小结

『MySQL 实战 45 讲』20 - 幻读是什么,幻读有什么问题?

幻读是什么&#xff0c;幻读有什么问题&#xff1f; 需求&#xff1a;创建一个小表 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB;insert into t values(0,0,0),(5,5,5), (10,10,10),(15,…

深度解析互联网医疗源码:视频问诊APP开发技术剖析

视频问诊APP作为在线医疗其中的重要一环&#xff0c;正在改变人们就医的方式。今天&#xff0c;我将为大家详解互联网医疗源码&#xff0c;探讨视频问诊APP开发技术&#xff0c;揭示其背后的原理和关键技术。 一、视频问诊APP的基本功能 视频问诊APP作为一种新型的医疗服务平台…

栈和队列的4道面试题【详细解析】【代码实现】

栈和队列的面试题 1.有效的括号&#xff08;栈实现&#xff09; 题目&#xff1a; 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必…

C++关键字、命名空间、输入输出

一、C C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。 二、C关键字 C关键字有些是C语言中原带的&#xff0c;也有一些是C本身的关键字&#xff0c;对于这些关键字&#xff0c;大家只需在学习过程中去理…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷1(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

C++之泛型编程---有限双端队列结构容器

引言 为了解决工业领域代码容器的通用化&#xff0c;可以考虑C里的泛型编程概念。假设一个场景需要实时保存最近的n个数据并按照顺序依次处理时&#xff0c;就需要定义一种新的容器来满足要求。当容器不满时&#xff0c;添加数据直接到队尾&#xff0c;当容器数据已经为n个时&a…

onlyoffice容器打包成镜像

书接上篇&#xff0c;onlyoffice容器已经更改在本地docker环境中了&#xff0c;之后需要部署到测试环境的docker中&#xff0c;采用容器打包成本地镜像 1、本地docker 查看容器&#xff1a;docker ps 生成镜像&#xff1a;docker commit -p blissful_lichterman 重命名镜像&a…

博睿数据将出席ClickHouse Hangzhou User Group第1届 Meetup

2024年5月18日&#xff0c;博睿数据数智能力中心负责人李骅宸将受邀参加ClickHouse Hangzhou User Group第1届 Meetup活动&#xff0c;分享《ClickHouse在可观测性的应用实践和优化》的主题演讲。 在当前数字化浪潮下&#xff0c;数据的规模和复杂性不断攀升&#xff0c;如何高…

Sam Altman 在斯坦福大学演讲的 10 个要点

最近在斯坦福大学举行的问答环节中&#xff0c;OpenAI 富有远见的首席执行官 Sam Altman 分享了关于人工智能的未来及其对社会的潜在影响的宝贵见解。作为 GPT 和 DALL-E 等突破性人工智能模型背后的研究组织的联合创始人&#xff0c;Altman 的观点对于企业家、研究人员以及任何…

uniapp+vue基于移动端的药品进销存系统r275i

最后我们通过需求分析、测试调整&#xff0c;与药品进销存管理系统管理系统的实际需求相结合&#xff0c;设计实现了药品进销存管理系统管理系统。 系统功能需求包含业务需求、功能需求用户需求&#xff0c;系统功能需求分析是在了解用户习惯、开发人员技术和实力等各个因素的前…

蓝鹏在线测宽仪有多少个常用系列?

蓝鹏测控专注几何尺寸智能测量仪的生产&#xff0c;其产品线丰富多样&#xff0c;测量仪涵盖了外径、椭圆度、螺纹钢肋高、直线度、宽度、厚度、边长、长度等各类几何尺寸&#xff0c;在线测宽仪主要应用于板材类产品的宽度尺寸检测。 在线测宽仪硬件技术与软件技术相结合&am…

第1章. STM32单片机入门知识介绍

目录 0. 《STM32单片机自学教程》专栏 1.1 嵌入式系统简介 1.1.1 什么是嵌入式系统 1.1.2 嵌入式系统的特点 1.1.3 嵌入式系统的应用领域 1.2 单片机基本概念 1.3 ARM简介 1.3.1 ARM公司简介 1.3.2 ARM处理器简介 1.4 STM32简介 1.4.1 基于Cortex内核的MCU 1.4.…

解析直播美颜SDK:计算机视觉在实时视频中的应用

今天&#xff0c;小编将带大家深入探讨直播美颜SDK的原理、应用及其在实时视频中的重要性。 一、直播美颜SDK的原理 直播美颜SDK的核心原理是基于计算机视觉技术&#xff0c;通过识别人脸、肤色、眼睛、嘴巴等关键特征点&#xff0c;对视频图像进行实时处理。其主要包括以下几…

【FFmpeg】Filter 过滤器 ① ( FFmpeg 过滤器简介 | 过滤器概念 | 过滤器用法 | 过滤器工作流程 | 过滤器文档 | 过滤器分类 )

文章目录 一、FFmpeg 过滤器 Filter 简介1、FFmpeg 过滤器概念2、FFmpeg 过滤器用法3、FFmpeg 过滤器工作流程4、FFmpeg 过滤器文档 二、FFmpeg 过滤器 分类1、过滤器分类 - 根据处理数据类型分类2、过滤器分类 - 根据编码器位置分类3、过滤器分类 - 根据功能分类 FFmpeg 相关文…

常见C语言基础笔试题

一. 简介 整理一些C语言常见的基础笔试题。 二. 常见C语言基础笔试题 1. 结构体指针加 1 结构体指针加 1操作&#xff1a; #include <stdio.h> #include <stdlib.h>typedef struct tagDev_INFO_S{int a;int b;int c;int d; } DEV_INFO_S;int main(void) { D…

力扣-21. 合并两个有序链表-js实现

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} list1* param {ListNode} list2* return {ListNode}*/ const mergeTwoList…