保姆级 ARM64 CPU架构下安装部署Docker + rancher + K8S 说明文档

1 K8S 简介

K8S是Kubernetes的简称,是一个开源的容器编排平台,用于自动部署、扩展和管理“容器化(containerized)应用程序”的系统。它可以跨多个主机聚集在一起,控制和自动化应用的部署与更新。

K8S 架构

请添加图片描述

Kubernetes 主要由以下几个核心组件组成:

  • etcd 保存了整个集群的状态;
  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • kubelet 负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

除了核心组件,还有一些推荐的插件,其中有的已经成为 CNCF 中的托管项目:

  • CoreDNS 负责为整个集群提供 DNS 服务

  • Ingress Controller 为服务提供外网入口

  • Prometheus 提供资源监控

  • Dashboard 提供 GUI

  • Federation 提供跨可用区的集群

整体架构

下图清晰表明了 Kubernetes 的架构设计以及组件之间的通信协议。

请添加图片描述

下面是更抽象的一个视图:

请添加图片描述

Master架构

请添加图片描述

Node架构

请添加图片描述

分层架构

Kubernetes 设计理念和功能其实就是一个类似 Linux 的分层架构,如下图所示。

请添加图片描述

  • 核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)、Service Mesh(部分位于应用层)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)、Service Mesh(部分位于管理层)
  • 接口层:kubectl 命令行工具、客户端 SDK 以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
    • Kubernetes 外部:日志、监控、配置管理、CI/CD、Workflow、FaaS、OTS 应用、ChatOps、GitOps、SecOps 等
    • Kubernetes 内部:CRI、CNI、CSI、镜像仓库、Cloud Provider、集群自身的配置和管理等

2 CPU架构

ARM64和x86是指基于不同架构的处理器。

ARM64是指基于ARM架构的64位处理器,而ARM是指基于ARM架构的32位处理器。ARM架构广泛应用于手机和移动设备领域,具有低成本、高性能、低电耗的特点。

x86则是指基于x86架构的处理器,它可以是32位或64位处理器架构,具体取决于处理器型号。x86架构广泛应用于传统的PC和服务器领域。

因为ARM64与x86是不同的CPU架构,两者的指令集不同,因此在部署时,需要考虑具体适配的软件安装包。

本文将基于arm64架构的国产操作系统统信UOS为例,说明K8S部署流程,仅供参考。

3 环境信息

环境版本说明
操作系统UnionTech OS Server 20
CPU架构aarch64
docker17.09.0-ceOS/Arch: linux/arm64
K8S1.20.11OS/Arch: linux/arm64
rancherv2.5.16-linux-arm64OS/Arch: linux/arm64

4 部署Docker

如果当前环境已经部署完arm64的docker,请忽略此章节。

下面的操作,需要在规划K8S的所有机器上执行。

4.1 环境准备

4.1.1 磁盘挂载

如果磁盘已经挂载,则省略该步骤。

docker推荐使用 xfs 磁盘格式。

磁盘挂载

$ mkfs.xfs -f /dev/vdb
$ mkdir /demo
$ mount /dev/vdb /demo

查看磁盘id

$ blkid 

永久挂载

$ echo "UUID=94be2fa7-93aa-47a4-b661-45963b28fbb4 /demo                xfs     defaults        0 0" >> /etc/fstab
$ mount -a

备注:这里磁盘格式化仅做参考,具体的磁盘格式化以及挂载,请自行参考其他文档。目的就是:挂载xfs格式的磁盘到指定目录下(比如 /demo)

4.1.2 docker 根目录

磁盘挂载路径为/var/lib/docker时可忽略此步

磁盘挂载路径为其他路径时,通过mount --bind方式挂载目录

1 创建挂载目录

$ mkdir -p /demo/data/docker

2 将/demo/data/docker映射到/var/lib/docker

$ mount  --bind /demo/data/docker /var/lib/docker

3 设置永久生效

$ echo "/demo/data/docker /var/lib/docker  none    bind        0 0" >> /etc/fstab

4 挂载

$ mount -a

4.2 下载Docker安装包并且解压

进入 /demo/data/ 目录下,下载 aarch64的docker安装包

执行如下命令:

# wget https://download.docker.com/linux/static/stable/aarch64/docker-17.09.0-ce.tgz

请添加图片描述

下载完成后,在当前目录进行解压操作:

$ tar -zxvf docker-17.09.0-ce.tgz 

在这里插入图片描述

4.3 复制文件

在 /demo/data 目录下执行如下命令:

$ cp docker/* /usr/bin/

4.4 创建containerd的service文件

执行如下命令:

$ touch /etc/systemd/system/docker.service
# 给予可执行权限
$ chmod +x /etc/systemd/system/docker.service

编辑docker.service文件,添加下面的内容:

$ vim /etc/systemd/system/docker.service

内容如下:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

请添加图片描述

4.5 启动docker

重新加载配置文件

$ systemctl daemon-reload

启动docker

$ systemctl start docker

设置 docker 开机启动

$ systemctl enable docker.service

5 部署K8S

5.1 关闭selinux

selinux 是一个 Linux 内核模块,同时也是 Linux 的一个安全子系统。

SELinux 的主要作用是最大限度地减小系统中的安全风险,提高系统的安全性。

这个重要的安全工具由美国国家安全局开发,并且已经被集成到了主流的 Linux 2.6 及以上版本的内核中。

#临时关闭
$ setenforce 0
#永久关闭 SELINUX=disabled
$ vim /etc/sysconfig/selinux

请添加图片描述

5.2 关闭swap分区

Swap分区,也被称为交换分区或虚拟内存,是Linux系统中用于当物理内存不足时,将部分硬盘空间虚拟成内存使用的系统机制。它的作用在于释放物理内存中的一部分空间,以供当前运行的程序使用。当系统的物理内存不够用的时候,将其中一些暂时不需要的数据交换到交换空间。

but 有利有弊:

在安装Kubernetes(K8S)时,建议关闭swap分区。因为K8S的各个组件和容器都需要足够的内存来运行,而Swap的使用可能导致性能下降,甚至是应用程序的奔溃。如果系统内存不足,Kubernetes会将一部分数据交换到swap分区,而这可能会降低系统的性能,甚至导致Pod异常终止。

此外,对于一些集群,它们的swap位于机械硬盘阵列上,大量动用swap基本可以等同于死机,你甚至连root都登录不上,不用提杀掉问题进程了。往往结局就是硬重启。

然而,在关闭swap分区之前,需要确保系统的内存容量足够满足所有Pod的内存需求,以及不会因为关闭swap分区而导致系统崩溃或出现其他问题。因此,如果系统内存充足或者有额外的物理内存可供使用,建议保留swap分区。

#临时关闭
swapoff -a
#永久关闭 注释 swap 行
vim /etc/fstab

5.3 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

5.4 网络配置 iptables

Linux桥接功能是一种虚拟交换机,它是用纯软件实现的,具有和物理交换机相同的功能,例如二层交换,MAC地址学习等。它是一个软件层面的网络设备,用于在Linux系统中创建和管理网络桥接。

网桥的主要作用是将多个物理或虚拟网络接口连接在一起,以创建一个共享相同网络段的网络。而将网络接口连接起来的结果就是,一个网络接口接收到网络数据包后,会复制到其他网络接口中。

此外,如果你想把虚拟机当做一台完全独立的计算机看待,并且允许它和其他终端一样的进行网络通信,那么桥接模式通常是虚拟机访问网络的最简单途径。同时,bridge技术还可以把一个linux设备上的两块网卡桥接在一起,对外表现为一个大的网卡接口,比如你有两台设备,但是又没有路由器,那么把他们桥接在一起,可以共享其中一台的网络,这样两台都可以上网。

在Kubernetes(K8S)中,打开桥接功能的主要目的是为了解决网络通信问题。首先,每个Pod的网卡都是veth设备,veth pair的另一端连上宿主机上的网桥。由于网桥是虚拟的二层设备,同节点的Pod之间通信直接走二层转发,跨节点通信才会经过宿主机eth0。

其次,如果需要在K8S集群内部署一个VPN,需要采用桥接VPN+静态路由的双重策略,才能实现互相都可以直接使用IP进行访问。此外,开发人员在进行微服务开发的时候需要通过服务发现进行Pod级服务的直接访问,现在的K8S网络没办法做到直接访问pod或者service的ip。这时,可以通过Bridge to Kubernetes功能将应用程序的所有出站流量路由回Kubernetes群集。

总的来说,K8S打开桥接功能主要是为了优化网络通信,提高服务发现的效率和灵活性,以及实现不同网络间的无缝连接。

net.bridge.bridge-nf-call-iptables 是一个 Linux 内核参数,用于控制桥接设备是否调用 iptables 进行网络过滤。当设置为 1 时,表示启用 iptables;当设置为 0 时,表示禁用 iptables。这个参数通常在 /etc/sysctl.conf 文件中进行配置。

net.bridge.bridge-nf-call-ip6tables=1 是一个 Linux 内核参数,用于控制桥接设备是否调用 ip6tables 进行网络过滤。当设置为 1 时,表示启用 ip6tables;当设置为 0 时,表示禁用 ip6tables。这个参数通常在 /etc/sysctl.conf 文件中进行配置。

net.ipv4.ip_forward=1 是一个 Linux 内核参数,用于控制 IPv4 数据包转发功能是否开启。当设置为 1 时,表示启用 IPv4 数据包转发;当设置为 0 时,表示禁用 IPv4 数据包转发。这个参数通常在 /etc/sysctl.conf 文件中进行配置。

m.swappiness=0 是一个 Linux 内核参数,用于控制虚拟机(VM)的交换空间使用情况。当设置为 0 时,表示禁用交换空间;当设置为 100 时,表示启用交换空间并尽可能使用它。这个参数通常在 /etc/sysctl.conf 文件中进行配置。

对iptables内部的nf-call需要打开的内生的桥接功能

$ touch /etc/sysctl.d/k8s.conf
$ vim /etc/sysctl.d/k8s.conf

修改如下内容:

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0

修改完成后执行:

$ modprobe br_netfilter
$ sysctl -p /etc/sysctl.d/k8s.conf

5.5 配置kubernetes源

yum源是一个在Linux下的软件包管理器,它能够从指定的服务器自动下载RPM包并完成安装,同时可以自动处理软件包之间的依赖关系。

根据存储位置的不同,yum源可以被分为本地yum源和网络yum源两种类型。本地yum源是指yum仓库在本地,通常是本地的镜像文件;而网络yum源则是指yum仓库在远程,也就是说我们需要联网才能使用。

yum.repos.d 目录是Linux系统中存放yum源配置文件的默认位置。在该目录下,每个子目录都代表一个yum源,子目录的名称通常以 .repo 结尾。

/etc/yum.repos.d/ 目录下,系统会默认存在一些yum源配置文件,例如 CentOS 官方源、epel源等。同时,用户也可以自己创建新的yum源配置文件并放置在该目录下,以便安装其他软件包或更新系统时使用。

需要注意的是,当修改了 yum.repos.d 目录下的任何一个配置文件后,都需要运行 yum clean all 命令清除缓存,否则新添加的软件包可能无法被正确识别和安装。

创建/etc/yum.repos.d/kubernetes.repo文件

$ touch /etc/yum.repos.d/kubernetes.repo

编辑:

$ vim /etc/yum.repos.d/kubernetes.repo

添加如下内容:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#清除缓存
yum clean all
#把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存
yum makecache

5.6 安装kubelet kubeadm kubectl

kubelet:运行在K8S cluster所有节点上,负责启动POD和容器

kubeadm:用于初始化K8S集群

kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

当不指定具体版本时,将下载当前yum源对应的最新版本

$ yum install -y kubelet kubeadm kubectl

也可以指定版本,建议指定如下版本

#安装指定版本的kubelet,kubeadm,kubectl
$ yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

在这里插入图片描述

安装时如果出现 403,解决方案是多尝试几次。

请添加图片描述

安装完成后,查看K8S版本

#查看kubelet版本
$ kubelet --version

在这里插入图片描述

查看kubeadm版本

$ kubeadm version

在这里插入图片描述

5.7 启动kubelet并设置开机启动服务

Systemctl是Systemd的主命令,主要用于管理系统和服务。Systemd是Linux系统最新的初始化系统,也就是init,它的主要作用是提高系统的启动速度,尽可能启动较少的进程,并让更多的进程并发启动。

daemon-reload是一个systemd命令,它的主要功能是重新加载systemd的守护进程。当服务文件(service file)发生变化时,可以使用此命令来使这些变化立即生效,而无需重启整个系统。

例如,如果你新安装了一个服务,并且这个服务被systemd管理,那么为了让新服务的配置文件生效,你需要运行systemctl daemon-reload命令。此外,如果服务的程序配置文件发生了变化,也需要重新加载以使新的配置生效。

需要注意的是,使用此命令需要管理员权限,通常可以通过在命令前添加sudo来获取。例如:sudo systemctl daemon-reload

重新加载配置文件

$ systemctl daemon-reload

启动kubelet

$ systemctl start kubelet

查看kubelet启动状态

$ systemctl status kubelet

没启动成功,报错先不管,后面的kubeadm init会拉起

在这里插入图片描述

设置开机自启动

$ systemctl enable kubelet

在这里插入图片描述

查看kubelet开机启动状态 enabled:开启, disabled:关闭

$ systemctl is-enabled kubelet

在这里插入图片描述

查看日志

journalctl -xefu 是一个常用的命令,用于查看系统日志并显示错误信息。

其中,各个选项的含义如下:

  • -x: 显示系统启动后的所有日志,包括正常和错误日志。
  • -e: 只显示最近的错误日志。
  • -f: 实时刷新日志输出,即当有新的日志产生时,会立即显示在屏幕上。
  • -u: 显示内核日志。

通过运行这个命令,可以快速定位系统中的问题,并了解系统的运行状态。例如,如果系统出现了崩溃或异常情况,可以使用此命令来查找相关的错误日志,以帮助解决问题。

$ journalctl -xefu kubelet

arm64环境,到此步后,先看看 FAQ中的问题4.

5.8 初始化K8S集群Master

注意,此操作只在规划的Master服务器上执行

#执行初始化命令
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address=172.31.186.36 --kubernetes-version=v1.20.11 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 

可能比较耗时,请耐心等待

在这里插入图片描述

待初始化完成后,需要按照提示,执行如下命令:

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 172.31.186.36:6443 --token t4bhv5.xlbh5rivgx7w284m \--discovery-token-ca-cert-hash sha256:1bf639b1ff74ac39b72448cef64597f040a89840e20fb56e2358c9b7f8359a9f

查看K8S集群节点

$ kubectl get node

在这里插入图片描述

NAME STATUS ROLES AGE VERSION
rancher-1 NotReady control-plane,master 13h v1.20.11

这里会发现状态是 NotReady ,是因为没有安装网络插件。

查看kubelet的日志

$ journalctl -xef -u kubelet -n 20

5.9 安装flannel网络插件

创建文件夹

$ mkdir -p /demo/package_k8s/flannel
$ cd /demo/package_k8s/flannel

在这里插入图片描述

在/demo/package_k8s/flannel目录,下载文件

curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

因为网络原因,可能比较耗时,如果下载失败了,请耐心的多尝试几次。

在这里插入图片描述

kube-flannel.yml里需要下载镜像,我这里提前先下载

$ docker pull quay.io/coreos/flannel:v0.14.0-rc1

创建flannel网络插件

$ kubectl apply -f kube-flannel.yml

在这里插入图片描述

5.10 集群添加节点

在其他节点上执行5.1、5.2、5.3、5.4、5.5、5.6、5.7、5.9

执行完后,在除Master之外的节点执行 5.8 生产的命令:

kubeadm join 172.31.186.36:6443 --token t4bhv5.xlbh5rivgx7w284m \--discovery-token-ca-cert-hash sha256:1bf639b1ff74ac39b72448cef64597f040a89840e20fb56e2358c9b7f8359a9f

在这里插入图片描述

在master节点执行:

$ kubectl get node

在这里插入图片描述

6 部署rancher

Rancher是一个企业级容器管理平台,可以帮助组织在生产环境中轻松快捷的部署和管理容器。Rancher支持多种云和本地生态系统,提供一键部署、多种编排调度工具、多租户、多种基础架构等功能,适用于混合云、多环境、多资源池、DevOps流水等场景 。

  • 如果不需要用rancher来管理K8S集群,请忽略此章节。

  • 如果当前环境已经部署完arm64的rancher,请忽略此章节。

部署rancher前,请保证arm64架构的docker已经部署成功

6.1 pull 镜像

rancher需要pull第三方镜像,为了节省时间,我们可以提前下载好rancher相关的镜像

这里的 docker中央仓库地址 只是举例,请根据实际情况填写 dockerpull 的镜像地址

执行如下pull:

docker pull docker中央仓库地址/fleet-agent:v0.3.10-security1
docker pull docker中央仓库地址/rancher-agent:v2.5.16
docker pull docker中央仓库地址/rancher:v2.5.16-linux-arm64
docker pull docker中央仓库地址/hyperkube:v1.20.15-rancher2
docker pull docker中央仓库地址/nginx-ingress-controller:nginx-1.2.1-rancher1
docker pull docker中央仓库地址/rke-tools:v0.1.80
docker pull docker中央仓库地址/mirrored-coreos-flannel:v0.15.1
docker pull docker中央仓库地址/mirrored-ingress-nginx-kube-webhook-certgen:v1.1.1
docker pull docker中央仓库地址/hyperkube:v1.20.11-rancher1
docker pull docker中央仓库地址/mirrored-pause:3.6
docker pull docker中央仓库地址/rke-tools:v0.1.78
docker pull docker中央仓库地址/mirrored-metrics-server:v0.5.0
docker pull docker中央仓库地址/nginx-ingress-controller:nginx-0.43.0-rancher3
docker pull docker中央仓库地址/mirrored-coreos-etcd:v3.4.15-rancher1
docker pull docker中央仓库地址/mirrored-coredns-coredns:1.8.0
docker pull docker中央仓库地址/mirrored-cluster-proportional-autoscaler:1.8.1
docker pull docker中央仓库地址/flannel-cni:v0.3.0-rancher6
docker pull docker中央仓库地址/kube-api-auth:v0.1.4
docker pull docker中央仓库地址/mirrored-pause:3.2

注意:执行到docker pull docker中央仓库地址/mirrored-pause:3.2时,可能需要手动按一下回车键。

6.2 启动rancher

这里会先从仓库拉取rancher的镜像,根据网络环境,可能耗时较久,请等待。

docker run -d --privileged --restart=unless-stopped -p 8080:80 -p 8445:443 \
-v /demo/data/rancher/rancher:/var/lib/rancher \
-v /demo/data/rancher/auditlog:/var/log/auditlog \
--name rancher rancher/rancher:v2.5.16-linux-arm64

稍等片刻,浏览器输入:https://ip:8445/g/clusters

部署完rancher后,第一次打开页面,需要进行免密设置

在这里插入图片描述

6.3 导入K8S集群

进入rancher页面,点击右上角的 “添加集群” 操作

在这里插入图片描述


然后选择 “导入”
在这里插入图片描述

填写K8S集群名称
在这里插入图片描述

点击 “创建” 按钮后,会出现三个命令行,将第一个命令行的 [USER_ACCOUNT]替换为 admin。

依次在K8S Master机器上执行下面三个命令行。

在这里插入图片描述

执行命令1

在K8S master机器上执行:

$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user admin

执行命令2

$ kubectl apply -f https://172.31.186.36:8445/v3/import/kkksx4xvx4rld7nzh8b2mvwc8kvjrxbsj458ngw264kst9sshbvfr7_c-xqfgn.yaml

如果执行命令2时,x509错误,则可以通过将对应的yaml文件下载到服务器本地,然后执行apply

下载yaml文件

$ wget https://172.31.186.36:8445/v3/import/6w5jzw4wtc7pg7h8cjbhcnj4ptbhgkdrrsc8ftjgkhqkvm2qc557tv_c-9g9rs.yaml --no-check-certificate

执行安装:

$ kubectl apply -f 6w5jzw4wtc7pg7h8cjbhcnj4ptbhgkdrrsc8ftjgkhqkvm2qc557tv_c-9g9rs.yaml

执行命令3

执行复制忽略证书检查命令:

curl --insecure -sfL https://172.31.186.36:8445/v3/import/7d64lpx6gpl8mdz4tz9nzk6r2wb684fls7fs728ns2sbzvzfdw55j4_c-llx8j.yaml | kubectl apply -f -

稍等片刻,如果一切顺利,则可看到如下:

在这里插入图片描述

在这里插入图片描述

FAQ

1 问题:节点状态为NotReady

如果安装了flannel网络插件后,查看节点状态,仍然是 NotReady

且日志显示 failed to find plugin “portmap” in path [/opt/cni/bin]

在这里插入图片描述

查看日志

在这里插入图片描述

解决方案:

下载 cni-plugins-linux-arm64-v1.1.1.tgz 包,然后解压,将其中的文件copy到 /opt/cni/bin/ 目录下即可

tar -zxvf cni-plugins-linux-arm64-v1.1.1.tgz -C /opt/cni/bin

在这里插入图片描述

2 问题:在非master节点执行 kubectl get node

在这里插入图片描述

kubectl命令需要使用kubernetes-admin来运行,需要admin.conf文件(conf文件是通过“ kubeadmin init”命令在主节点/etc/kubernetes 中创建),但是从节点没有conf文件,也没有设置 KUBECONFIG =/root/admin.conf环境变量,所以需要复制conf文件到从节点,并设置环境变量就OK了。

其实这个问题也没必要解决,不影响。

3 问题:rancher面板中 Controller Manager与 Scheduler不健康

如果rancher面板中 Controller Manager与 Scheduler不健康

在这里插入图片描述

登录到master server机器,修改如下文件:

  • /etc/kubernetes/manifests/kube-controller-manager.yaml
  • /etc/kubernetes/manifests/kube-scheduler.yaml

两个文件中删除 --port=0 配置项

然后重启kubelete

$ service kubelet restart

稍等片刻,如果一切顺利,Controller Manager与 Scheduler将恢复健康。

4 问题:failed to find plugin “portmap” in path [/opt/cni/bin]

如果kubelet服务异常,且日志里有如下报错:

failed to find plugin "portmap" in path [/opt/cni/bin]

大概率是/opt/cni/bin目录下没有对应的 portmap 插件

解决方案:

1、下载 cni-plugins-linux-arm64-v1.1.1.tgz 插件

$ wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-arm64-v1.1.1.tgz

2、解压 cni-plugins-linux-arm64-v1.1.1.tgz 插件,并且复制到 /opt/cni/bin/

$ tar -zxvf cni-plugins-linux-arm64-v1.1.1.tgz -C /opt/cni/bin/

/opt/cni/bin 是一个目录路径,通常用于存放网络连接插件(CNI)的可执行文件。CNI是容器网络接口(Container Network Interface)的缩写,它提供了一种标准化的方式来定义和实现容器运行时的网络连接。

在Kubernetes等容器编排系统中,每个节点上的CNI插件负责为在该节点上运行的容器创建、配置和管理网络连接。这些插件可以提供不同的网络解决方案,例如桥接、路由、隧道等。

具体来说,/opt/cni/bin 目录通常包含以下内容:

  • ip: IP地址管理工具,用于分配IP地址给容器。
  • bridge: 桥接网络插件,用于在主机上创建一个虚拟网络桥接,并将容器连接到该桥接上。
  • flannel: Flannel是一种覆盖网络(Overlay Network)解决方案,用于在主机之间建立虚拟网络连接。
  • weave: Weave是一种基于IPv6的覆盖网络解决方案,用于在主机之间自动创建虚拟网络连接。
  • calico: Calico是一种高性能的容器网络解决方案,支持多种网络模型和策略。

请注意,具体的CNI插件可能因系统和部署环境而异。以上列出的插件只是一些常见的示例。

附录 K8S 运维技术点简介

删除POD

要删除 Kubernetes(K8S)中的 Pod,可以使用 kubectl delete pod 命令。下面是删除 Pod 的一般格式:

# kubectl delete pod <pod-name> [-n=<namespace>]
$ kubectl delete pod coredns-7f89b7bc75-46tlx -n kube-system

按照创建时间升序查看POD

要按照创建时间升序查看 Kubernetes(K8S)中的 Pod,可以使用 kubectl get pods --sort-by=.metadata.creationTimestamp 命令。

$ kubectl get pods  -A --sort-by=.metadata.creationTimestamp

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

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

相关文章

从Redis反序列化UserDetails对象异常后中发现FastJson序列化的一些问题

最近在使用SpringSecurityJWT实现认证授权的时候&#xff0c;出现Redis在反序列化userDetails的异常。通过实践发现&#xff0c;使用不同的序列化方法和不同的fastJson版本&#xff0c;异常信息各不相同。所以特地记录了下来。 一、项目代码 先来看看我项目中redis相关配置信息…

VMware Workstation 17 虚拟机自启动失效 解决脚本

VMware Workstation17新增加了虚拟机自启配置 但是很奇怪在我的一台计算机上能够自启&#xff0c;在另一台计算机上就失效 编写脚本 以命令方式完成虚拟机开机自启 #虚拟机自启.batif "%1""hide" goto CmdBegin start mshta vbscript:createobject("w…

缓存组件状态,提升用户体验:探索 keep-alive 的神奇世界

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和

进入贪心了&#xff0c;我觉得本专题是最烧脑的专题 Leetcode 455. 分发饼干 题目链接 455 分发饼干 让大的饼干去满足需求量大的孩子即是本题的思路&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {…

仿ChatGPT对话前端页面(内含源码)

仿ChatGPT对话前端页面&#xff08;内含源码&#xff09; 前言布局样式和Js部分关键点全部源码 前言 本文主要讲解如何做出类似ChatGPT的前端页面。具体我们的效果图是长这样&#xff0c;其中除了时间是动态的之外&#xff0c;其他都是假数据。接下来让我们从布局和样式的角度…

Android Tombstone 与Debuggerd 原理浅谈

一、前言 Android系统类问题主要有stability、performance、power、security。Android集成一个守护进程tombstoned是android平台的一个守护进程&#xff0c;它注册成3个socket服务端&#xff0c;客户端封装在crash_dump和debuggerd_client。 crash_dump用于跟踪定位C crash&am…

前端入门(三)Vue生命周期、组件技术、事件总线、

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构refpropsmixin插件scoped样式 Vue生命周期 1、bef…

cineSync 3.3新功能: 深入iconik集成、激光工具、OTIOZ支持等

cineSync 3.3为大家带来了灵活性和精准度&#xff0c;使连接审阅会话与iconik中的媒体管理和存储更加容易&#xff0c;并且引入了颜色配置文件以快速测试颜色配置&#xff0c;还有通过激光指针等新工具带来新的可能性。 在ftrack&#xff0c;我们意识到当今的远程创意工作流比以…

反爬虫机制与反爬虫技术(二)

反爬虫机制与反爬虫技术二 1、动态页面处理与验证码识别概述2、反爬虫案例:页面登录与滑块验证码处理2.1、用例简介2.2、库(模块)简介2.3、网页分析2.4、Selenium准备操作2.5、页面登录2.6、模糊移动滑块测试3、滑块验证码处理:精确移动滑块3.1、精确移动滑块的原理3.2、滑…

PyQt6简介

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计12条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

企业远程访问业务系统:对比MPLS专线,贝锐蒲公英为何更优优势?

如今&#xff0c;企业大多都会采用OA、ERP、CRM等各种数字化业务系统。 私有云、公有云混合架构也变得越来越常见。 比如&#xff1a;研发系统部署在公司本地私有云、确保数据安全&#xff0c;OA采用公有云方案、满足随时随地访问需求。 如此一来&#xff0c;也产生了远程访问…

js实现图片懒加载

方式一&#xff1a;html实现 在img标签加上 loading"lazy" 方式二&#xff1a;js实现 通过js监听页面的滚动&#xff0c;实现的原理主要是判断当前图片是否到了可视区域&#xff1a; 拿到所有的图片 dom 。遍历每个图片判断当前图片是否到了可视区范围内。如果到了…

Maven项目下详细的SSM整合流程

文章目录 &#x1f389;SSM整合流程一、两个容器整合✨ 1、先准备好数据库config.properties连接、mybatis-config.xml&#x1f38a; 2、容器一&#xff1a;优先配置spring.xml文件&#x1f38a; 3、容器二&#xff1a;配置springMVC.xml文件&#x1f38a; 4、Tomcat整合spring…

解释PCIe MSI 中断要求中断向量连续?PCIe 规范里并没有明确指出

MSI 向量必须连续&#xff1f; 前言 MSI 物理条件&#xff0c;MSI 中断产生的逻辑是RC初始化的时候&#xff0c;由软件将配置写入到 EP 的 2 个寄存器中&#xff0c;这两个寄存器一个指示的是地址 Message Address&#xff0c;一个指示的是数据 Message Data。当 EP 试图触发…

你再不学Git就来不及了!!!

其他系列文章导航 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 版本控制 什么是版本控制 为什么要版本控制 一、认识 Git 1.1Git 简史 1.2Git 与其他版本管理系统的主要区别 1.3Git 的三种状态 二、Git 使用快速入门 2.1获…

springboot使用redis缓存乱码(key或者 value 乱码)一招解决

如果查看redis中的值是这样 创建一个配置类就可以解决 package com.deka.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; i…

CPU+GPU多样化算力,ZStack Cloud助力游戏精酿核心业务上云

游戏精酿通过ZStack Cloud云平台提供高性能、高可用的云主机、云存储和云网络&#xff1b;前期通过超融合架构快速构建云基础设施&#xff0c;来支持Jira、Redis等关键业务&#xff1b;并实现对原有私有云平台业务的替代&#xff0c;按需将原有私有云业务滚动迁移到ZStack Clou…

深入理解Spring AOP的工作流程

文章目录 引言什么是AOP&#xff1f;Spring AOP的工作原理1. JDK动态代理2. CGLIB代理 Spring AOP的注解方式Aspect注解EnableAspectJAutoProxy注解 Spring AOP的工作流程拓展应用1. 自定义注解2. 异常处理3. 切面优先级 结论 &#x1f389;深入理解Spring AOP的工作流程 ☆* o…

关于运行软件程序出现vcruntime140.dll丢失的修复教程-解决方案

vcruntime140.dll是Microsoft Visual C库文件的一部分&#xff0c;用于支持Windows操作系统上的应用程序。如果找不到或丢失了这个文件&#xff0c;可能会导致某些应用程序无法正常运行。下面是关于vcruntime140.dll丢失的5个修复方法&#xff0c;以及vcruntime140.dll文件属性…

Python基础教程之分支结构详解

文章目录 一、分支结构二、单分支结构三、双分支结构四、多分支结构五、嵌套分支结构六、三元表达式七、条件测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③P…