k8s之配置CNI网络
wptr33 2025-05-22 14:11 19 浏览
先介绍一下CNI 相关工作
- k8s 的 kubelet 在启动一个容器之前,会先做一些预先检查以及 csi 的操作
- 然后 kubelet 调用 CRI 的接口,通过 grpc 的方式和 CRI runtime 通信,告知 CRI 要创建 pod 了
- 随后 CRI 的 Server 端收到通知后调用 OCI 的接口去真正的执行拉起 Pod 的操作
- 不过在真的拉起 pod 之前,会先给 pod 创建一个 pause 容器,这个 pause 容器是一个特别小又特别稳定的进程,主要用来挂载网络命名空间和存储资源
- 然后 CRI 调用 CNI 提供的接口,先在/etc/cni/net.d 目录中获取网络插件配置(这个配置由每个插件自己通过 daemonset 的方式拷贝到主机上),然后把插件的配置作为标准输入,再把容器的运行时信息作为环境变量,最后执行插件
- CNI 插件执行完毕后,把执行结果(结果要包含一些关键信息比如 Pod IP 等)直接干到标准输出上
- CRI 从标准输出上读取插件执行结果再做后续操作,后续操作就是拉起真正的容器等
安装cni插件
每个worker节点上安装CNI插件驱动,先安装cni驱动,否则node一直是no ready状态
#CNI插件下载地址
https://github.com/containernetworking/plugins
# cni插件flannel 会去默认目录里找 cni
mkdir /opt/cni/bin /etc/cni/net.d
tar -zxvf cni-xxx.tgz -C /opt/cni/bin
/etc/cni/net.d 是配置目录
我这里用的是docker作为k8s的容器运行时所以插件是cri-docker
cri-docker 的配置里必须要配置上--network-plugin=cni
下面部署flannel网络
下载地址:
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yaml
kubectl get pods -n kube-system
#查看日志没有权限
kubectl logs -f kube-flannel-ds-s8rfn -n kube-system
Error from server (Forbidden): Forbidden (user=kubernetes, verb=get, resource=nodes, subresource=proxy) ( pods/log kube-flannel-ds-s8rfn)
授权Apiserver访问kubelet
cat >apiserver-to-kubelet-rbac.yaml<<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:kube-apiserver-to-kubelet
rules:
- apiGroups:
- ""
resources:
- nodes/proxy
- nodes/stats
- nodes/log
- nodes/spec
- nodes/metrics
- pods/log
verbs:
- "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:kube-apiserver
namespace: ""
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:kube-apiserver-to-kubelet
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: kubernetes
EOF
kubectl apply -f apiserver-to-kubelet-rbac.yaml
上面的flannel可能会启动失败
需要注意以下配置
#服务器上配置好hosts,要不然会启动失败
192.168.56.101 master
192.168.56.102 node1
192.168.56.103 node2
网卡配置
#网关也要配置好,要不然提示找不到默认路由
GATEWAY=192.168.56.1
批准node节点加入集群
#查看csr请求
kubectl get csr --kubeconfig=/opt/kubernetes/conf/kube-controller-manager.kubeconfig -A -o wide
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
node-csr-XLjK0kUVExr3qp_Gon55QkKu2zjCLT_yJXi1OUQOMR4 10m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap <none> Pending
#批准csr请求,允许node加入k8s集群
kubectl certificate approve node-csr-XLjK0kUVExr3qp_Gon55QkKu2zjCLT_yJXi1OUQOMR4 --kubeconfig=/opt/kubernetes/conf/kube-controller-manager.kubeconfig
certificatesigningrequest.certificates.k8s.io/node-csr-XLjK0kUVExr3qp_Gon55QkKu2zjCLT_yJXi1OUQOMR4 approved
#查看node状态
kubectl get node --kubeconfig=/opt/kubernetes/conf/kube-controller-manager.kubeconfig -o wide -n kube-flannel
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready <none> 2d1h v1.24.1 192.168.56.101 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://20.10.21
node1 Ready <none> 95m v1.24.1 192.168.56.102 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://20.10.21
node2 NotReady <none> 18s v1.24.1 192.168.56.103 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://20.10.21
#查看 node2上面的flannel日志,发现一直在 PodInitializing
kubectl logs kube-flannel-ds-zwwlk -n kube-flannel --kubeconfig=/opt/kubernetes/conf/kube-controller-manager.kubeconfig
Defaulted container "kube-flannel" out of: kube-flannel, install-cni-plugin (init), install-cni (init)
Error from server (BadRequest): container "kube-flannel" in pod "kube-flannel-ds-zwwlk" is waiting to start: PodInitializing
#显示特定pod资源的详细信息,我发现pull 镜像失败
kubectl describe pod kube-flannel-ds-zwwlk -n kube-flannel --kubeconfig=/opt/kubernetes/conf/kube-controller-manager.kubeconfig
Warning FailedCreatePodSandBox 117s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed pulling image "registry.k8s.io/pause:3.6": Error response from daemon: Get "https://registry.k8s.io/v2/": dial tcp: lookup registry.k8s.io on [::1]:53: read udp [::1]:38258->[::1]:53: read: connection refused
遇到上不去网或者服务器离线的情况
#先把镜像下载到本地,通过save把镜像打包
docker save > xxx.tar
#上传到服务器,再load到服务器上
docker load < xxx.tar
当然建个镜像仓库私服最好不过了
- 上一篇:K8S搭建流程
- 下一篇:实战:dockerfile 最小实践——koa 为例
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)