【Kurbernetes部署】知识点总结(部署方式、网络插件.....)

news2024/12/25 2:47:42

知识点合集

  • 一、Kurbernetes常见的部署方式
    • 1.1 Minikube(一般不用)
    • 1.2 Kubeadm
    • 1.3 二进制安装部署(推荐使用的方式)
  • 二、二进制部署Kurbetnetes的思路
    • Step1 部署etcd
    • Step2 部署master组件
    • Step3 部署node组件
    • Step4 部署多master高可用
  • 三、Kubeadm部署Kurbernetes集群的思路
  • 四、更新kubeadm搭建的K8S组件证书有效期
  • 五、涉及的理论知识总结
    • 5.1 CFSSL工具(了解)
    • 5.2 kubelet的RBAC授权机制(了解)
    • 5.3 Kurbernetes的网络和接口
    • 5.4 Kurbernetes 中 Pod 网络通信
    • 5.5 CoreDNS 简介
  • 六、CNI网络插件
    • 6.1 CNI简介
    • 6.2 Flannel插件
      • 6.2.1 Flannel UDP模式的工作原理
      • 6.2.2 Flannel VXLAN模式的工作原理
    • 6.3 Calico插件
      • 6.3.1 Calico IPIP模式的工作原理
      • 6.3.2 Calico BGP模式的工作原理
    • 6.4 Flannel 和 Calico 的区别?

一、Kurbernetes常见的部署方式

1.1 Minikube(一般不用)

Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。

部署地址:https://kubernetes.io/docs/setup/minikube
在这里插入图片描述

1.2 Kubeadm

Kubeadm也是一个工具,提供kubeadm initkubeadm join,用于快速部署K8S集群,相对简单。

部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

1.3 二进制安装部署(推荐使用的方式)

生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐。
https://github.com/kubernetes/kubernetes/releases

Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

二、二进制部署Kurbetnetes的思路

Step1 部署etcd

1)使用cfssl工具签发证书和私钥

2)解压etcd软件包,获取二进制文件 etcdetcdctl

3)准备etcd集群配置文件

4)启动etcd服务进程,加入到etcd集群。

相关命令补充

#查看etcd集群健康状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379" --cacert=CA证书 --cert=服务端证书 --key=服务端私钥  endpoint health -wtable
#查看etcd集群状态信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379" --cacert=CA证书 --cert=服务端证书 --key=服务端私钥  endpoint status -wtable
#查看etcd集群成员列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA证书 --cert=服务端证书 --key=服务端私钥  member list -wtable  
#备份etcd数据库
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA证书 --cert=服务端证书 --key=服务端私钥 snapshot save 备份文件路径
#恢复etcd数据库
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA证书 --cert=服务端证书 --key=服务端私钥 snapshot restore 文件路径
#查看备份文件的状态信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA证书 --cert=服务端证书 --key=服务端私钥 snapshot status 文件路径

Step2 部署master组件

1)使用cfssl工具签发证书和私钥;

2)解压K8S服务端软件包,获取二进制文件 kube-apiserverkube-controller-managerkube-scheduler kubectl

3)准备 kube-apiserver 启动时要调用的 bootstrap-token 认证文件(token.csv);

4)准备 kube-apiserverkube-controller-managerkube-scheduler服务进程启动参数配置文件

5)准备 kube-controller-managerkube-schedulerkubectlkubeconfig 集群引导配置文件(加入K8S集群的引导文件);

6)依次启动 kube-apiserverkube-controller-managerkube-scheduler服务进程

Step3 部署node组件

1)获取二进制文件 kubeletkube-proxy

2)准备 kubeletkube-proxy的 kubeconfig 集群引导配置文件 kube-proxy.kubeconfig bootstrap.kubeconfig(kubelet首次访问apiserver加入K8S集群使用引导文件);

3)准备 kubeletkube-proxy服务进程启动参数配置文件

4)启动 kubelet 服务进程,向 apiserver 发起 CSR 请求颁发证书,master 通过 CSR 请求后 kubelet 方可获取到证书;

5)加载 ipvs 模块,启动 kube-proxy 服务进程;

6)安装 cni 网络插件(flannel/calico)CoreDNS

7)执行 kubectl get nodes 命令查看node的状态

Step4 部署多master高可用

1)复制 master 组件的相关的证书、私钥、启动配置文件、kubeconfig集群引导配置文件、二进制文件和 etcd 的证书、私钥;

2)修改 apiserver 启动配置文件监听地址通告地址依次启动 kube-apiserverkube-controller-managerkube-scheduler 的服务进程;

3)部署 nginx/haproxy 负载均衡器和 keepalived 高可用

4)修改 kubelet、kube-proxy、kubectl 的 kubeconfig集群引导配置文件中的 server 参数指向 keepalived 的 VIP 地址

5)修改 kube-controller-manager、kube-scheduler 的 kubeconfig集群引导配置文件中的 server 参数指向本机的 apiserver 地址

三、Kubeadm部署Kurbernetes集群的思路

1)所有节点进行初始化,安装 容器运行时、kubeadm、kubelet、kubectl;

2)执行 kubeadm config print init-defaults 命令生成集群初始化配置文件并进行修改;

3)执行 kubeadm init 命令根据初始化配置文件初始化生成K8S master控制管理节点;

4)安装 CNI 网络插件(flannel/calico);

5)在其它节点执行 kubeadm join 命令将将node节点或者其它master节点加入到K8S集群中。

#kubeadm init
在使用kubeadm方式安装K8S集群时,可根据初始化配置文件或者配置参数选项快速地初始化生成一个K8S的master管理平台

#kubeadm join
根据kubeadm init初始化的提示信息快速的将一个node节点或者其它master节点加入到K8S集群中

四、更新kubeadm搭建的K8S组件证书有效期

1)备份老证书和kubeconfig配置文件

mkdir /etc/kubernetes.bak
cp -r /etc/kubernetes/pki /etc/kubernetes.bak
cp /etc/kubernetes/*.conf /etc/kubernetes.bak

2)重新生成证书

kubeadm alpha certs renew all --config=集群初始化配置文件

3)重新生成kubeconfig配置文件

kubeadm init phase kubeconfig all --config=集群初始化配置文件

4)重启kubelet和其它K8S组件的Pod容器

systemctl restart kubelet
mv /etc/kubernetes/manifests/*.yaml /tmp
mv /tmp/*.yaml /etc/kubernetes/manifests

5)查看证书有效期

kubeadm alpha certs check-expiration

openssl x509 -noout -dates -in /etc/kubernetes/pki/XXX.crt

五、涉及的理论知识总结

5.1 CFSSL工具(了解)

CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。

CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。

CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。

CFSSL 用来为 etcd 提供 TLS 证书。

它支持签三种类型的证书:
1)client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
2)server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
3)peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。

这里全部都使用同一套证书认证。

5.2 kubelet的RBAC授权机制(了解)

kubelet 采用 TLS Bootstrapping 机制,自动完成到 kube-apiserver 的注册,在 node 节点量较大或者后期自动扩容时非常有用。

Master apiserver 启用 TLS 认证后,node 节点 kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与 apiserver 通信,当 node 节点很多时,签署证书是一件很繁琐的事情。

因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet 会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。

kubelet 首次启动通过加载 bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次 CSR 请求,这个 Token 被预先内置在 apiserver 节点的 token.csv 中,其身份为 kubelet-bootstrap 用户和 system:kubelet-bootstrap 用户组;

想要首次 CSR 请求能成功(即不会被 apiserver 401 拒绝),则需要先创建一个 ClusterRoleBinding,将 kubelet-bootstrap 用户和 system:node-bootstrapper 内置 ClusterRole 绑定(通过 kubectl get clusterroles 可查询),使其能够发起 CSR 认证请求。

5.3 Kurbernetes的网络和接口

Kurbernetes网络
节点网络nodeIP
Pod网络podIP
Service网络clusterIP
Kurbernetes接口描述类型
CRI容器运行时接口docker
containerd
podman
cir-0
CNI容器网络接口flannel
calico
cilium
CSI容器存储接口ceph
nfs
gfs
oss
s3

5.4 Kurbernetes 中 Pod 网络通信

1.Pod 内容器与容器之间的通信

在这里插入图片描述

在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命令空间,相当于它们在同一台机器上一样,可以用 localhost 地址访问彼此的端口

2.同一个 Node 内 Pod 之间的通信

在这里插入图片描述

每个 Pod 都有一个真实的全局 IP 地址,同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod 的 IP 地址进行通信。

Pod1 与 Pod2 都是通过 Veth 连接到同一个 docker0 网桥,网段相同,所以它们之间可以直接通信。

3.不同 Node 上 Pod 之间的通信

在这里插入图片描述

Pod 地址与 docker0 在同一网段,docker0 网段与宿主机网卡是两个不同的网段,且不同 Node 之间的通信只能通过宿主机的物理网卡进行。

要想实现不同 Node 上 Pod 之间的通信,就必须想办法通过主机的物理网卡 IP 地址进行寻址和通信,因此要满足两个条件

1)Pod 的 IP 不能冲突;

2)将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信。

CNI网络插件,可以满足这两个条件

5.5 CoreDNS 简介

CoreDNS 是 K8S 的默认 DNS 实现

根据 service 资源名称,解析出对应的 clusterIP

根据 statefulset 控制器创建的 Pod 资源名称,解析出对应的 podIP

六、CNI网络插件

为了实现不同 Node 上 Pod 之间的通信

6.1 CNI简介

在这里插入图片描述

CNI (Container Networking Interface) 是一个为容器运行时(如Docker、Kubernetes等)提供网络插件的规范和接口,用于管理容器之间和容器与外部网络之间的通信。

CNI 的目标是提供一个标准的插件架构,使不同的容器运行时可以使用不同的网络实现,并且能够方便地切换和配置网络插件。

6.2 Flannel插件

网络模式描述
UDP出现最早的模式,但是性能较差,基于flanneld应用程序实现数据包的封装/解封装
VXLAN默认模式,是推荐使用的模式,性能比UDP模式更好,基于内核实现数据帧的封装/解封装,配置简单使用方便
HOST-GW性能最好的模式,但是配置复杂,且不能跨网段

6.2.1 Flannel UDP模式的工作原理

1)原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口;

2)flanneld服务进程会监听flannel0接口收到的数据,flanneld进程会将原始数据包封装到UDP报文里;

3)flanneld进程会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外再封装nodeIP报文、MAC报文,再通过物理网卡发送到目标node节点;

4)UDP报文通过8285号端口送到目标node节点的flanneld进程进行解封装,再通过flannel0接口转发到cni0网桥,再由cni0转发到目标Pod容器。

6.2.2 Flannel VXLAN模式的工作原理

1)原始数据帧从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1虚拟接口;

2)flannel.1接口收到数据帧后添加VXLAN头部,并在内核将原始数据帧封装到UDP报文里;

3)flanneld进程根据在etcd维护的路由表将UDP报文通过物理网卡发送到目标node节点;

4)UDP报文通过8472号端口送到目标node节点的flannel.1接口在内核进行解封装,再通过flannel.1接口转发到cni0网桥,再由cni0转发到目标Pod容器。

6.3 Calico插件

6.3.1 Calico IPIP模式的工作原理

1)原始数据包从源主机的Pod容器发出到tunl0接口,并被内核的IPIP驱动封装到节点网络的IP报文里;

2)再根据tunl0接口的路由经过物理网卡发送到目标node节点;

3)IP数据包到达目标node节点后再通过内核的IPIP驱动解包得到原始IP数据包;

4)然后根据本地的路由规则经过 veth pair 设备送达到目标Pod容器。

6.3.2 Calico BGP模式的工作原理

本质就是通过路由表来维护每个Pod的通信,Felix负责维护路由规则和网络接口管理,BIRD负责分发路由信息给其它节点

1)源主机的Pod容器发出的原始IP数据包会通过 veth pair 设备送达到节点网络空间;

2)然后会根据原始IP数据包的目标IP和节点的路由规则找到目标node节点的IP,再经过物理网卡发送到目标node节点;

3)IP数据包到达目标node节点后会根据本地的路由规则经过 veth pair 设备送达到目标Pod容器。

6.4 Flannel 和 Calico 的区别?

Flannel

1)模式:UDP VXLAN HOST-GW;

2)默认网段:10.244.0.0/16;

3)通常采用VXLAN模式,用的是叠加网络、IP隧道方式传输数据,对性能有一定的影响

4)功能简单配置方便利于管理;

5)不具备复杂的网络策略规则配置能力

Calico

1)模式:IPIP BGP 混合模式(CrossSubnet)

2)默认网段:192.168.0.0/16

3)使用IPIP模式可以实现跨子网传输,但是传输过程中需要额外的封包和解包过程,对性能有一定的影响

4)使用BGP模式会把每个node节点看做成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过BGP协议路由转发,传输过程中不需要额外的封包和解包,因此性能较好,但是只能同一个网段里使用,无法跨子网传输

5)它不使用cni0网桥,而是通过路由规则把数据包直接发送到目标网卡,所以性能高

6)具有更丰富的网络策略配置管理能力、功能更全面,但是维护起来较为复杂

总结

对于较小规模且网络要求简单的K8S集群,可以采用flannel做cni网络插件。

对于集群规模较大且要求更多的网络策略配置时,可以采用性能更好功能更全的calico。

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

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

相关文章

leetcode:160. 相交链表

一、题目 原题链接:160. 相交链表 - 力扣(LeetCode) 函数原型: struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 二、思路 判断两个链表是否相交,只要判断两个链表是否有相同的…

3 分钟看完 NVIDIA GPU 架构及演进

近期随着 AI 市场的爆发式增长,作为 AI 背后技术的核心之一 GPU(图形处理器)的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要,特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多,主要就是 NVIDIA、AM…

利用IP风险画像强化金融行业网络安全防御

在数字化时代,金融行业日益依赖互联网和技术创新,但这也使得金融机构成为网络攻击的主要目标。为了应对日益复杂的网络威胁,金融机构迫切需要采用先进的安全技术和工具。其中,IP风险画像技术成为提升网络安全的一项重要策略。 1.…

深度学习检测小目标常用方法

前言 在深度学习目标检测中,特别是人脸检测中,小目标、小人脸的检测由于分辨率低,图片模糊,信息少,噪音多,所以一直是一个实际且常见的困难问题。不过在这几年的发展中,也涌现了一些提高小目标…

国家数据局正式揭牌,2030年数据要素市场规模或破万亿

10月25日,国家数据局正式挂牌! 自今年3月国务院通过《党和国家机构改革方案》提出组建国家数据局以来,国家数据局的组建工作一直在紧锣密鼓地进行中。经过7个月的筹备工作,国家数据局于2023年10月25日挂牌成立。 根据《党和国家机…

使用Dockerfile依赖maven基础镜像部署springboot的程序案例

1、准备springboot Demo代码 就一个controller层代码,返回当前时间及hello world 2、项目根目录下,新建DockerFile文件 注意,等本地配置完毕后,Dockerfile文件需要与项目helloworld同级,这里先放项目里面 3、docker …

从零开始搭建React+TypeScript+webpack开发环境-基于lerna的webpack项目工程化改造

项目背景 在实际项目中,我们的前端项目往往是一个大型的Webpack项目,结构较为复杂。项目根目录下包含了各种配置文件、源代码、以及静态资源,整体布局相对扁平。Webpack的配置文件分散在不同的部分,包括入口文件、输出目录、加载…

【JMeter】组件之 Listener监听器选择

JMeter中监听器的作用就是收集、显示JMeter取样器的结果,并以树形、图表、表格的形式显示出来。还可以将监听结果保存成文件。 View Results Tree-->察看结果树 Summary Report-->汇总报告 为测试中的每个不同命名的请求创建一行。这与聚合报告类似&#xff…

【扩散模型】实战:创建一个类别条件扩散模型

创建一个类别条件扩散模型 1. 配置和数据准备2. 创建一个以类别为条件的UNet模型3. 训练和采样 本文介绍一种给扩散模型添加额外条件信息的方法。具体地,将在MNIST数据集上训练一个以类别为条件的扩散模型。并且可以在推理阶段指定想要生成的是哪个数字。 1. 配置和…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息,这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题: 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

数字化工厂管理系统的三个关键技术是什么

随着科技的飞速发展,数字化工厂管理系统已经成为了现代制造业的重要发展方向。数字化工厂管理系统通过充分运用建模技术、仿真技术和单一数据源技术,实现了产品设计和生产的虚拟化,为制造业带来了前所未有的效率和创新能力。本文将深入探讨这…

Matlab的多项式留数与极点的计算

Matlab的多项式留数与极点的计算 以下面的多项式为例: 运算代码: clc clear closesyms p % 定义多项式 Zp(5*p^571*p^370*p)/(2*p^635*p^4117*p^236); % 提取分子与分母 [I,D]numden(Zp); Idouble(coeffs(I,p,"All"));%分子 Ddouble(coeffs…

轻量日志管理方案-[EFK]

使用FileBeat进行日志文件的数据收集,并发送到ES进行存储,最后Kibana进行查看展示; 这个应该是最简单,轻量的日志收集方案了。 最总方案为:FileBeatESKibana ; 【Kibana过于强大,感觉可以无限扩展】 文章目…

css:文本对齐属性vertical-align实现化学元素上标下标的显示

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/vertical-align 语法 vertical-align: <value>;可选值&#xff1a; sub&#xff1a;使元素的基线与父元素的下标基线对齐。 super&#xff1a;使元素的基线与父元素的上标基线对齐。 text-top&#xff1a;使…

24张宇八套卷数一复盘(六)

张八&#xff08;六&#xff09;11/10107选择45填空20高数大题22线代大题12概率大题8 前言 临近考试冲刺阶段&#xff0c;感觉做过的卷子很难再提起精神去复盘&#xff0c;于是在这里进行一下复盘。 主要是对于整体试卷结构的把握&#xff0c;以及考试状态的复盘。 简单的卷子把…

说说React render方法的原理?在什么时候会被触发?

一、原理 首先&#xff0c;render函数在react中有两种形式&#xff1a; 在类组件中&#xff0c;指的是render方法&#xff1a; class Foo extends React.Component { render() { return <h1> Foo </h1>; } } 在函数组件中&#xff0c;指的是函…

虹科分享 | 2023温控生物技术和医药物流前景展望专题报告

2023温控生物技术和医药物流前景展望专题报告 全球供应链正在发生根本性的变化&#xff0c;而制药业对供应链的使用也在不断发展。突破性疗法和个性化药品有望带来崭新的未来&#xff0c;这也改变了我们如今的行医方式。然而&#xff0c;在监管和基础设施方面还面临着许多挑战…

常见排序算法之插入排序类

插入排序&#xff0c;是一种简单直观的排序算法&#xff0c;工作原理是将一个记录插入到已经排好序的有序表中&#xff0c;从而形成一个新的、记录数增1的有序表。在实现过程中&#xff0c;它使用双层循环&#xff0c;外层循环对除了第一个元素之外的所有元素&#xff0c;内层循…

【canvas】在Vue3+ts中实现 canva内的矩形拖动操作。

前言 canvas内的显示内容如何拖动&#xff1f; 这里提供一个 canvas内矩形移动的解决思路。 描述 如何选中canvas里的某部分矩形内容&#xff0c;然后进行拖动&#xff1f; 我的解决思路&#xff1a; **画布搭建。**用一个div将canvas元素包裹&#xff0c;设置宽高&#xf…

漏洞扫描-nuclei-poc编写

0x00 nuclei Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发&#xff0c;具有很强的可配置性、可扩展性和易用性。 提供TCP、DNS、HTTP、FILE 等各类协议的扫描&#xff0c;通过强大且灵活的模板&#xff0c;可以使用Nuclei模拟各种安全检查。 …