Kubernetes

K8s大致了解

参考文章:https://mp.weixin.qq.com/s/dckA1ezcABndN5WSg1BOBA

场景

你是一个程序员,你用代码写了一个博客应用服务,并将它部署在了云平台上。
但应用服务太过受欢迎,访问量太大,经常会挂。

所以你用了一些工具自动重启挂掉的应用服务,并且将应用服务部署在了好几个服务器上,总算抗住了。

后来你又上线了商城应用服务和语音应用服务,随着应用服务变多,需求也千奇百怪。有的应用服务不希望被外网访问到,有的部署的时候要求内存得大于 xxGB 才能正常跑。
你每次都需要登录到各个服务器上,执行手动操作更新。不仅容易出错,还贼浪费时间

那么问题就来了,有没有一个办法,可以解决上面的问题?当然有,没有什么是加一个中间层不能解决的,如果有,那就再加一层
这次我们要加的中间层,叫 Kubernetes

K8S

介于应用服务服务器之间,能够通过策略,协调和管理多个应用服务,只需要一个 yaml 文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还能让它们挂了自动重启,自动扩缩容。

Kubernetes 会将我们的服务器划为两部分,一部分叫控制平面(control plane,以前叫master),另一部分叫工作节点,也就是 Node。控制平面负责控制和管理各个 Node,而 Node 则负责实际运行各个应用服务。

控制平面内部组件

  • 以前我们需要登录到每台服务器上,手动执行各种命令,现在我们只需要调用 k8s 的提供的 api 接口,就能操作这些服务资源,这些接口都由 API Server 组件提供。
  • 以前我们需要到处看下哪台服务器 cpu 和内存资源充足,然后才能部署应用,现在这部分决策逻辑由 Scheduler(调度器)来完成。
  • 找到服务器后,以前我们会手动创建,关闭服务,现在这部分功能由 Controller Manager(控制器管理器)来负责。
  • 上面的功能都会产生一些数据,这些数据需要被保存起来,方便后续做逻辑,因此 k8s 还会需要一个存储层,用来存放各种数据信息,目前是用的 etcd,这部分源码实现的很解耦,后续可能会扩展支持其他中间件。

Node 内部组件

Node 是实际的工作节点,它既可以是裸机服务器,也可以是虚拟机。它会负责实际运行各个应用服务。多个应用服务共享一台 Node 上的内存和 CPU 等计算资源。

在文章开头,我们聊到了部署多个应用服务的场景。以前我们需要上传代码到服务器,而用了 k8s 之后,我们只需要将服务代码打包成Container Image(容器镜像),就能一行命令将它部署。

如果你不了解容器镜像的含义,你可以简单理解为它其实就是将应用代码和依赖的系统环境打了个压缩包,在任意一台机器上解压这个压缩包,就能正常运行服务。为了下载和部署镜像,Node 中会有一个 Container runtime 组件。

每个应用服务都可以认为是一个 Container(容器), 并且大多数时候,我们还会为应用服务搭配一个日志收集器 Container 或监控收集器 Container,多个 Container 共同组成一个一个 Pod,它运行在 Node 上。

k8s 可以将 pod 从某个 Node 调度到另一个 Node,还能以 pod 为单位去做重启和动态扩缩容的操作。
所以说 Pod 是 k8s 中最小的调度单位

另外,前面提到控制平面会用 Controller Manager (通过API Server)控制 Node 创建和关闭服务,那 Node 也得有个组件能接收到这个命令才能去做这些动作,这个组件叫 kubelet,它主要负责管理和监控 Pod。最后,Node 中还有个 Kube Proxy ,它负责 Node 的网络通信功能,有了它,外部请求就能被转发到 Pod 内。

Cluster

控制平面和Node 共同构成了一个 Cluster,也就是集群。在公司里,我们一般会构建多个集群, 比如测试环境用一个集群,生产环境用另外一个集群。同时,为了将集群内部的服务暴露给外部用户使用,我们一般还会部署一个入口控制器,比如 Ingress 控制器(比如Nginx),它可以提供一个入口让外部用户访问集群内部服务。

kubectl 是什么

上面提到说我们可以使用 k8s 提供的 API 去创建服务,但问题就来了,这是需要我们自己写代码去调用这些 API 吗?答案是不需要,k8s 为我们准备了一个命令行工具 kubectl,我们只需要执行命令,它内部就会调用 k8s 的 API。

接下来我们以部署服务为例子,看下 k8s 是怎么工作的。

怎么部署服务?

首先我们需要编写 YAML 文件,在里面定义 Pod 里用到了哪些镜像,占用多少内存和 CPU 等信息。然后使用 kubectl 命令行工具执行 kubectl apply -f xx.yaml ,此时 kubectl 会读取和解析 YAML 文件,将解析后的对象通过 API 请求发送给 Kubernetes 控制平面内 的 API Server。API Server 会根据要求,驱使 Scheduler 通过 etcd 提供的数据寻找合适的 NodeController Manager 会通过 API Server 控制 Node 创建服务,Node 内部的 kubelet 在收到命令后会开始基于 Container runtime 组件去拉取镜像创建容器,最终完成 Pod 的创建。

至此服务完成创建。

整个过程下来,我们只需要写一遍 yaml 文件,和执行一次 kubectl 命令,比以前省心太多了!部署完服务后,我们来看下服务是怎么被调用的。

怎么调用服务?

以前外部用户小明,直接在浏览器上发送 http 请求,就能打到我们服务器上的 Nginx,然后转发到部署的服务内。用了 k8s 之后,外部请求会先到达 Kubernetes 集群的 Ingress 控制器,然后请求会被转发到 Kubernetes 内部的某个 Node 的 Kube Proxy 上,再找到对应的 pod,然后才是转发到内部容器服务中,处理结果原路返回,到这就完成了一次服务调用。

到这里我们就大概了解了 k8s 的工作原理啦,它本质上就是应用服务和服务器之间的中间层,通过暴露一系列 API 能力让我们简化服务的部署运维流程。

并且,不少中大厂基于这些 API 能力搭了自己的服务管理平台,程序员不再需要敲 kubectl 命令,直接在界面上点点几下,就能完成服务的部署和扩容等操作,是真的嘎嘎好用。

K8s的介绍

K8s的本质是一组服务器的集群,他可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理,目的是实现资源管理的自动化。

K8s的主要功能

  • 自我修复:一旦某个容器崩溃,能在1秒内迅速重启新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:可以通过自动发现的形式找到他所依赖的服务
  • 负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立刻回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

K8s的组件

分为控制节点(控制平面),和工作节点(node)

  1. 控制平面--负责集群的管理
  • API Server:资源操作的唯一入口,接收用户的命令,提供认证,授权,API注册和发现等机制
  • Scheduler:负责集群资源调度,按照预定调度策略将Pod调度到相应的node节点上
  • Controller Manager:负责维护集群状态,如:程序部署安排,故障检测,自动扩展,滚动更新等
  • Etcd:负责存储集群中各种资源对象的信息
  1. 工作节点node--数据平面,为容器提供运行环境
  • Kubelet:负责维护容器的生命周期,通过控制dokcer来创建、更新、销毁容器
  • KubeProxy:负责提供集群内部的服务发现和负载均衡
  • Docker:负责节点上容器的各种操作

以部署一个nginx服务来说明K8s系统各组件的调用关系:

  • 一旦K8s环境启动后,控制平面和node都会将自身信息存储在etcd数据库中
  • 一个nginx服务的安装请求会首先被发送到控制平面的API Server组件
  • API Server组件会调用scheduler组件来决定到底把这个服务安装在哪个node节点上,会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知API Server
  • API Server调用controller manager去调度node安装nginx服务
  • kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是K8s的最小操作单元,容器必须跑在pod中
  • 若要访问nginx,需要通过kube-proxy来对pod产生访问的代理,这样,用户就可以访问集群中的nginx服务了

集群环境的搭建

环境规划

集群类型

分为两类:一主多从,多主多从

  • 一主多从:一台控制平面和多台node节点,搭建简单,但是有单机故障风险,适合用于测试环境
  • 多主多从:多台控制平面和多台node节点,搭建麻烦,安全性高,适合用于生产环境

目前安装一主两备,进行简单的了解

img

安装方式

主流有三种安装方式:kubeadm,minikube,二进制包

  • kubeadm:快速搭建K8s集群的工具
  • minikube:快速搭建单节点K8s的工具
  • 二进制包:从官网下载每个组件的二进制包,依次安装,对于理解K8s组件更有效

目前采用kubeadm安装方式

主机规划
作用 IP地址 操作系统 配置
master 192.168.9.207 centos7.9 2颗CPU 15G内存 192G硬盘
node1 192.168.9.208 centos7.9 2颗CPU 15G内存 192G硬盘
node2 192.168.9.209 centos7.9 2颗CPU 15G内存 192G硬盘

环境搭建

需要三台centos服务器,分别安装docker(26.1.4),kubeadm(1.22.4),kubelet(1.22.4),kubectl(1.22.4)程序

主机安装配置

详见day04+day05

环境的初始化
  1. 检查操作系统的版本
# K8s集群要求centos版本在7.5以上
[root@techtest9-230 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
  1. 主机名解析
#修改主机名
hostnamectl set-hostname master && bash 
hostnamectl set-hostname node1 && bash
hostnamectl set-hostname node2 && bash
# 为了方便集群节点间的直接调用  编辑三台服务器的/etc/hosts文件,添加下面的内容
vim/etc/hosts

192.168.9.207 master
192.168.9.208 node1
192.168.9.209 node2
#测试
ping -c 4 -s 1000 master	#指定发送四个数据包,每个数据包1000字节
  1. 时间同步
#要求集群中的节点时间必须精确一致,直接使用chronyd服务从网络同步时间
#企业中建议配置内部的时间同步服务器
#安装chrony服务
sudo yum install chrony -y
#启动服务
sudo systemctl start chronyd
#开机自启动
sudo systemctl enable chronyd
#检查chronyd服务是否存在
systemctl list-units --type=service | grep chronyd
#验证时间
[root@master ~]# date
Wed Apr 23 17:07:32 CST 2025
  1. 禁用iptables和firewalld服务
#K8s和docker在运行时会产生大量的iptables规则,为了不让系统规则跟她们混淆,直接关闭系统规则
#关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
#关闭iptables服务
systemctl stop iptables
systemctl disable iptables
systemctl status iptables
  1. 禁用selinux
#SELinux是 Linux 系统的一种安全机制,可以限制系统资源(如文件、网络等)的访问,提高系统的安全性。在 docker运行过程中,需要访问系统资源,但SElinux可能会限制访问,从而影响 docker的运行。 

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#备注:修改selinux配置文件之后,重启linux机器,selinux配置才能永久生效,重启之后,登录到机器,执行如下命令:

getenforce

#如果显示Disabled说明selinux已经关闭
  1. 禁用swap分区
#swap分区是虚拟内存分区,作用是在物理内存使用完之后,将磁盘空间虚拟成内存使用
#启用swap设备会对系统的性能产生很大负面影响,K8s要求每个节点都要禁用swap分区设备
#若因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

#编辑分区配置文件/etc/fstab,注释掉swap分区一行
vim /etc/fstab

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=4cd9523b-8651-40d1-a181-7153b6284467 /boot                   ext3    defaults        1 2
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

#重启linux服务
  1. 修改linux内核参数
#修改linux内核参数,添加网桥过滤和地址转发功能
#编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
vim /etc/sysctl.d/kubernetes.conf

#是个新文件
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

#重新加载配置
sysctl -p

#加载网桥过滤模块
modprobe br_netfilter

#查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
  1. 配置ipvs功能
#在K8s中,service有两种代理模型,一种是基于iptables的,一种是基于ipvs的	ipvs的性能更高,如果要使用的话,需要手动载入ipvs模块

#安装ipset和ipvsadm
yum install ipset ipvsadm -y

#验证ipset和ipvsadm是否安装成功
[root@master ~]# ipset list
[root@master ~]# ipset --version
ipset v7.1, protocol version: 7
[root@master ~]# ipvsadm --version
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)

#添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

#为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

#执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules

#查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  1. 重启服务器
#上面的步骤完成以后,需要重新启动linux系统
reboot
#重启后检查selinux是否关闭,以及swap分区是否关闭
getenforce
free -m
安装docker
[root@node1 ~]# sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

[root@node1 ~]# sudo mkdir -p /etc/docker

#阿里云的镜像加速器经常被封,无法使用!!!
[root@node1 ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://docker.1ms.run",
        "https://docker.xuanyuan.me"]  
}
EOF

[root@node1 ~]# sudo systemctl daemon-reload
[root@node1 ~]# sudo systemctl restart docker
[root@node1 ~]# systemctl enable docker
 
#docker -v验证docker是否安装成功
安装Kubernetes组件
#K8s的镜像源在国外		切换镜像源
#编辑/etc/yum.repos.d/kubernetes.repo	添加下面的配置
vim /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

#安装kubeadm,kubelet,kubectl
#kubeadm 是一个工具,用于初始化 Kubernetes 集群或加入节点,它本身不需要作为服务运行,无需检验服务状态。
#kubectl 是一个命令行工具,用于与 Kubernetes 集群交互,也不作为服务运行,无需检查服务状态。
#kubelet 是一个守护进程程序,由kubeadm 在搭建过程中自动启动,这里仅设置开机启动即可。
yum install --setopt=obsoletes=0 kubeadm-1.22.4-0 kubelet-1.22.4-0 kubectl-1.22.4-0 -y

#检查是否安装成功
[root@master ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.4", GitCommit:"b695d79d4f967c403a96986f1750a35eb75e75f1", GitTreeState:"clean", BuildDate:"2021-11-17T15:47:19Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}
[root@master ~]# kubelet --version
Kubernetes v1.22.4
[root@master ~]# kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.4", GitCommit:"b695d79d4f967c403a96986f1750a35eb75e75f1", GitTreeState:"clean", BuildDate:"2021-11-17T15:48:33Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}

#配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet,添加下面的配置
vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MOOE="ipvs"

#设置kubelet开机自启动
systemctl enable kubelet

#此时如果查看kubelet的状态,会报错,是正常的
#原因:/var/lib/kubelet/config.yaml配置文件不存在
#默认情况下,kubeadm 初始化集群时会生成此文件。
准备集群镜像
#在安装K8s集群之前,需要提前准备好集群所需要的镜像
#查看所需镜像
[root@master ~]# kubeadm config images list
I0424 10:11:19.074505   10192 version.go:255] remote version is much newer: v1.33.0; falling back to: stable-1.22
k8s.gcr.io/kube-apiserver:v1.22.17
k8s.gcr.io/kube-controller-manager:v1.22.17
k8s.gcr.io/kube-scheduler:v1.22.17
k8s.gcr.io/kube-proxy:v1.22.17
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4

#使用1.22.4版本

#下载镜像
#此镜像在k8s的仓库中,设置阿里云镜像
images=(
	kube-apiserver:v1.22.4
	kube-controller-manager:v1.22.4
	kube-scheduler:v1.22.4
	kube-proxy:v1.22.4	
	pause:3.5
	etcd:3.5.0-0
	coredns/coredns:v1.8.4
)

for imageName in ${images[@]} ; do
	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

#一步一步处理的流程
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4

docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4
[root@master ~]# docker images
REPOSITORY                           TAG       IMAGE ID       CREATED       SIZE
k8s.gcr.io/kube-apiserver            v1.22.4   8a5cc299272d   3 years ago   128MB
k8s.gcr.io/kube-scheduler            v1.22.4   721ba97f54a6   3 years ago   52.7MB
k8s.gcr.io/kube-controller-manager   v1.22.4   0ce02f92d3e4   3 years ago   122MB
k8s.gcr.io/kube-proxy                v1.22.4   edeff87e4802   3 years ago   104MB
k8s.gcr.io/etcd                      3.5.0-0   004811815584   3 years ago   295MB
k8s.gcr.io/coredns                   v1.8.4    8d147537fb7d   3 years ago   47.5MB
k8s.gcr.io/pause                     3.5       ed210e3e4a5b   4 years ago   683kB
集群初始化

其实就是这些组件的安装,只需要在master节点上执行即可

#创建集群
kubeadm init \
	--kubernetes-version=v1.22.4 \
	--pod-network-cidr=10.224.0.0/16 \
	--service-cidr=10.96.0.0/12 \
	--apiserver-advertise-address=192.168.9.207
	
#如果有问题
kubeadm reset
rm -rf /etc/kubernetes/manifests/*
rm -rf /etc/kubernetes/pki
rm -rf /var/lib/etcd

#报错原因!!!!容器运行时的 Cgroup 驱动和kubelet 的 Cgroup 驱动不一致,K8S默认的Cgroup驱动是systemd
docker info | grep Cgroup

#解决
vim /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl restart docker
docker info | grep -i cgroup

systemctl daemon-reload
systemctl restart kubelet

systemctl status kubelet

#再重新执行初始化创建集群的命令

#成功后提示
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.9.207:6443 --token 3so920.djgb0qona7zqvxa1 \
	--discovery-token-ca-cert-hash sha256:36f6bb853d3fef087ed889362fb7aa0fe3a1030d2fa3d06c8da8081e89e9153a 
	
#创建必要文件
#创建文件夹
 mkdir -p $HOME/.kube  
#拷贝配置文件
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#设置权限
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  
#在node1上将node1节点加入控制平台
kubeadm join 192.168.9.207:6443 --token 3so920.djgb0qona7zqvxa1 \
	--discovery-token-ca-cert-hash sha256:36f6bb853d3fef087ed889362fb7aa0fe3a1030d2fa3d06c8da8081e89e9153a

[root@node1 ~]# kubeadm join 192.168.9.207:6443 --token 3so920.djgb0qona7zqvxa1 \
> --discovery-token-ca-cert-hash sha256:36f6bb853d3fef087ed889362fb7aa0fe3a1030d2fa3d06c8da8081e89e9153a 

[root@node2 ~]# kubeadm join 192.168.9.207:6443 --token 3so920.djgb0qona7zqvxa1 \
> --discovery-token-ca-cert-hash sha256:36f6bb853d3fef087ed889362fb7aa0fe3a1030d2fa3d06c8da8081e89e9153a

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES                  AGE    VERSION
master   NotReady   control-plane,master   131m   v1.22.4
node1    NotReady   <none>                 129m   v1.22.4
node2    NotReady   <none>                 20s    v1.22.4
安装网络插件

参考文章:k8s安装网络插件flannel 时出现报错Init:ImagePullBackOff 无法安装成功 - 小鹰展翅 - 博客园

#nodes节点的status都是NotReady,原因是没有安装网络插件
#K8s支持多种网络插件,比如flannel,calico,canal等,这里选择安装flannel
#只在master节点上执行,插件使用的是DaemonSet的控制器,他会在每个节点上都运行

#上传文件
rz
#上传yml包
kube-flannel.yml
#配置yml包
#更改rbac.authorization.k8s.io/v1beta1 → rbac.authorization.k8s.io/v1
#更新国内镜像源

#使用配置文件启动fannel
kubectl apply -f kube-flannel.yml

#再次查看节点状态
kubectl get nodes

发现问题:

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES                  AGE     VERSION
master   NotReady   control-plane,master   5h50m   v1.22.4
node1    Ready      <none>                 5h48m   v1.22.4
node2    Ready      <none>                 3h39m   v1.22.4

#master的状态是未启动

#查看kubelet状态
[root@master ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Thu 2025-04-24 11:58:42 CST; 5h 51min ago
     Docs: https://kubernetes.io/docs/
 Main PID: 2006 (kubelet)
    Tasks: 15
   Memory: 67.0M
   CGroup: /system.slice/kubelet.service
           └─2006 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/con...

Apr 24 17:49:49 master kubelet[2006]: E0424 17:49:49.059377    2006 kubelet.go:2337] "Container runtime network not ready" networkReady="NetworkReady=false r...nitialized"
Apr 24 17:49:53 master kubelet[2006]: I0424 17:49:53.701385    2006 cni.go:204] "Error validating CNI config list" configList="{\n  \"name\": \"cbr0\",\n  \"cniVersion\...
Apr 24 17:49:53 master kubelet[2006]: I0424 17:49:53.701454    2006 cni.go:239] "Unable to update cni config" err="no valid networks found in /etc/cni/net.d"
Apr 24 17:49:54 master kubelet[2006]: E0424 17:49:54.077309    2006 kubelet.go:2337] "Container runtime network not ready" networkReady="NetworkReady=false r...nitialized"
Apr 24 17:49:58 master kubelet[2006]: I0424 17:49:58.708400    2006 cni.go:204] "Error validating CNI config list" configList="{\n  \"name\": \"cbr0\",\n  \"cniVersion\...
Apr 24 17:49:58 master kubelet[2006]: I0424 17:49:58.708476    2006 cni.go:239] "Unable to update cni config" err="no valid networks found in /etc/cni/net.d"
Apr 24 17:49:59 master kubelet[2006]: E0424 17:49:59.096273    2006 kubelet.go:2337] "Container runtime network not ready" networkReady="NetworkReady=false r...nitialized"
Apr 24 17:50:03 master kubelet[2006]: I0424 17:50:03.715540    2006 cni.go:204] "Error validating CNI config list" configList="{\n  \"name\": \"cbr0\",\n  \"cniVersion\...
Apr 24 17:50:03 master kubelet[2006]: I0424 17:50:03.715594    2006 cni.go:239] "Unable to update cni config" err="no valid networks found in /etc/cni/net.d"
Apr 24 17:50:04 master kubelet[2006]: E0424 17:50:04.115828    2006 kubelet.go:2337] "Container runtime network not ready" networkReady="NetworkReady=false r...nitialized"
Hint: Some lines were ellipsized, use -l to show in full.

#有报错,原因CNI未正确配置
#CNI(容器网络接口)是 Kubernetes 用于管理容器网络的关键组件。如果没有正确的 CNI 配置,kubelet 无法初始化网络,导致节点状态为 NotReady

解决:
#检查 /etc/cni/net.d/ 目录,查看是否有CNI配置文件
[root@master ~]# ls /etc/cni/net.d/
10-flannel.conflist

#确保 CNI 插件的二进制文件存在于 /opt/cni/bin/ 目录中
[root@master ~]# ls /opt/cni/bin/
flannel

#确保 kubelet 的启动参数中正确指定了 CNI 配置目录
[root@master ~]# cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"

EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env

EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

#继续检查
[root@master ~]# kubectl get pods -n kube-system
NAME                             READY   STATUS             RESTARTS      AGE
coredns-78fcd69978-2hssp         0/1     ImagePullBackOff   0             6h4m
coredns-78fcd69978-f9n25         0/1     ImagePullBackOff   0             6h4m
etcd-master                      1/1     Running            3             6h4m
kube-apiserver-master            1/1     Running            3             6h4m
kube-controller-manager-master   1/1     Running            3             6h4m
kube-flannel-ds-amd64-8d56k      1/1     Running            7 (32m ago)   38m
kube-flannel-ds-amd64-xfkzq      1/1     Running            7 (32m ago)   38m
kube-flannel-ds-amd64-zrs4d      1/1     Running            7 (32m ago)   38m
kube-proxy-2ltdd                 1/1     Running            0             3h53m
kube-proxy-4vslq                 1/1     Running            0             6h4m
kube-proxy-zfxkd                 1/1     Running            0             6h2m
kube-scheduler-master            1/1     Running            3             6h4m

#问题出现了!!!!		coredns没有启动  Kubernetes 无法从容器镜像仓库中拉取 coredns 镜像。

 ctr  -n k8s.io i pull docker.io/flannel/flannel-cni-plugin:v1.2.

posted on 2025-04-25 10:11  想去看花花吗  阅读(97)  评论(0)    收藏  举报