一、k8s快速入门之学习Kubernetes组件基础
一、三个容器管理器平台
- Apache MESOS 开源的分布式资源管理框架,被推特选为基础平台,2019年推特换位k8s,MESOS最新版可以在MESOS上管理k8s
- DOCKER SWARM docker总部发行的,实现docker的集群方案,和docker捆版一起,比较轻量,功能少,但是大规划话实现非常好,对docker实现好
- Kubernetes Goolge研发, 由borg采用go语言开发,资源消耗少,弹性伸缩,开源,负载均衡
二、kubernetes组件
1️⃣ 服务的分类
- 有状态服务:数据库管理系统(DBMS)
- 无状态服务:lvs APACHE
2️⃣ borg架构
3️⃣ k8s架构
- replication controller :简称rc 控制器,维护副本数目,副本数量如果达不到数量值控制器就会去申请副本,以便于达到数量值,也就是删除对应的pod和删除对应的pod
- kubectl : 命令行管理工具
- web UI : web界面
- Scheduler:调度器,负载介绍任务,选择合适的节点进行分配任务
- api server : 所有服务访问统一入口
- kubetet:负责维护容器的生命周期,同时也复制Volume和网络的管理
- kube proxy:负责为Service提供集群内部的服务发现和负载均衡
⭐️ 看上图,就可以看见以上所有服务都要以api server
交互,所以看起来会很繁忙,但是每个服务都会在服务本身产生一定的缓存,并不是每件事都要到api server
里面去请求
组件一: Etcd
⭐️ etcd
的官方将它定位成一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转,天生支持集群不需要中间件,可以保存一些配置文件
⭐️ etcd
是 CoreOS
团队于 2013 年 6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)
数据库。etcd
内部采用raft
协议作为一致性算法,etcd 基于 Go
语言实现。
⭐️ etcd 的特点
- 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
⭐️ 为了保证数据的强一致性,etcd
集群中所有的数据流向都是一个方向,从 Leader
(主节点)流向 Follower
,也就是所有 Follower
的数据必须与 Leader
保持一致,如果不一致会被覆盖。
⭐️ 用户对于 etcd
集群所有节点进行读写
- 读取:由于集群所有节点数据是强一致性的,读取可以从集群中随便哪个节点进行读取数据
- 写入:etcd 集群有 leader,如果写入往 leader 写入,可以直接写入,然后然后Leader节点会把写入分发给所有 Follower,如果往 follower 写入,然后Leader节点会把写入分发给所有 Follower
⭐️ etcd目前有两个版本一个是v3 一个是v2,v2版是将数据写入到内存中,v3是把数据写入到本地数据卷的库中,但是推荐使用v3,v2以及被弃用
⚠️ 需要注意的是在kubernetes1.11版本前的是不支持v3版本的
⭐️ETCD
的内部架构图
1️⃣使用的模式是C/S的构建服务
k8也是用http协议支持C/S
C/S
:Clinet
-Server
,服务器负责数据库的管理,客户机负责完成与用户的交互。ETCD
就是采用这种模式,kubernetes
也是。Raft
:存储读写信息WAL
:预写日志
其他插件
CoreDNS
:可以为集群中的SVC创建一个域名IP的对应关系解析。、
Dashboard
:k8s集群提供B/S结构
ps: B/S 浏览器/服务器模式
Ingress controller
: 官方只能实现四层代理,ingress实现7层代理
Federation
:可以提供一个可以夸集群中心多K8s统一管理的功能
Prometheus
:普罗米修斯,提供K8s集群的监控能力
ELK
:提供k8s的集群日志统一分析接入平台
三、Pod
- 自主式Pod:不是被控制器管理的Pod,死了以后不会被控制器“复活”,也不会创建一个和他期望值一样的Pod
- 控制器管理的Pod: 被控制器管理的Pod,和自助式Pod是反着来的
⭐️ 在同一个容器里面他们的网络,存储都是共享的,因此不能发生端口冲突。
1️⃣ReplicationController & ReplicaSet & Deployment
-
ReplicationController
用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes
中建议使用ReplicaSet
来取代ReplicationControlle
-
ReplicaSet
跟ReplicationController
没有本质的不同,只是名字不一样,并且ReplicaSet
支持集合式的selector
,通过labels
来操作 -
虽然
ReplicaSet
可以独立使用,但-般还是建议使用Deployment
来自动管理ReplicaSet
,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet
不支持rolling- update
但Deployment
支持)
⭐️selector
:搜索,标签搜索,rc
不支持集合式搜索,rs
支持,就是创建Pod
的时候会给Pod
打上标签,可以直接搜索标签,或者一组标签
⭐️rolling-update
:滚动更新,也就是你需要把一个或者一组Pod
更新成最新版本,它就会给你先生成一个新版的Pod
,在给你删除你旧版的Pod
⭐️ 回滚:和更新类似,只不过式反着来的
2️⃣ Deployment (ReplicaSet )
⭐️ Deployment
为Pod
和ReplicaSet
提供了一个声明式定义(declarative
) 方法,用来替代以前的ReplicationController
来方便的管理应用。典型的应用场景包括:
- 定义
Deployment
来创建Pod和ReplicaSet - 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
命令式编程: 它侧重于如何实现程序,就像我们刚接触编程的时候那样,我们需要把程序的实现过程按照逻辑结果一步步写下来
声明式编程: 它侧重于定义想要什么,然后告诉计算机/引擎,让他帮你去实现
3️⃣ HPA (HorizontalPodAutoScale)
⭐️ Horizontal Pod Autoscaling
仅适用于Deployment
和ReplicaSet
,在V1版本中仅支持根据Pod
的CPU
利用率扩所容,在v1alpha
版本中,支持根据内存和用户自定义的metric
扩缩容.
4️⃣ StatefulSet
⭐️ StatefulSet
是为了解决有状态服务的问题(对应Deployments
和ReplicaSets
是为无状态服务而设计),其应用场景包括:
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于
PVC
来实现 - 稳定的网络标志,即Pod重新调度后其
PodName
和HostName
不变,基于Headless Service
(即没有Cluster IP
的Service
)来实现 - 有序部署,有序扩展,即
Pod
是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下-一个Pod运行之前所有之前的Pod
必须都是Running
和Ready
状态) ,基于init containers
来实现 - 有序收缩,有序删除(即从N-1到0)
5️⃣ Service
⭐️ Kubernetes
中一个应用服务会有一个或多个实例(Pod
),每个实例(Pod
)的IP地址由网络插件动态随机分配(Pod
重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了Service这个资源对象
-
ClusterIP
: 默认方式。根据是否生成ClusterIP
又可分为普通Service
和Headless
Service
两类: -
普通
Service
:通过为Kubernetes的Service分配一个集群内部可访问的固定虚拟IP(Cluster IP
),实现集群内的访问。为最常见的方式。 -
Headless Service
:该服务不会分配Cluster IP
,也不通过kube-proxy
做反向代理和负载均衡。而是通过DNS提供稳定的网络ID
来访问,DNS
会将headless service
的后端直接解析为podIP列表。主要供StatefulSet使用。 -
NodePort
:除了使用Cluster IP之
外,还通过将service
的port
映射到集群内每个节点的相同一个端口,实现通过nodeIP
:nodePort
从集群外访问服务。 -
LoadBalancer
:和nodePort
类似,不过除了使用一个Cluster IP
和nodePort
之外,还会向所使用的公有云申请一个负载均衡器(负载均衡器后端映射到各节点的nodePort),实现从集群外通过LB访问服务。 -
ExternalName
:是Service
的特例。此模式主要面向运行在集群外部的服务,通过它可以将外部服务映射进k8s
集群,且具备k8s
内服务的一些特征(如具备namespace
等属性),来为集群内部提供服务。此模式要求kube-dns
的版本为1.7
或以上。这种模式和前三种模式(除headless service
)最大的不同是重定向依赖的是dns层次,而不是通过kube-proxy
。
6️⃣ DaemonSet
⭐️ DaemonSet
确保全部(或者一些) Node
上运行 一个Pod
的副本。当有Node
加入集群时,也会为他们新增一个Pod
。当有Node从集群移除时,这些Pod
也会被回收。删除DaemonSet
将会删除它创建的所有Pod
- 使用
DaemonSet
的一些典型用法: - 运行集群存储
daemon
, 例如在每个Node
. 上运行glusterd
、ceph
。 - 在每个
Node
.上运行 日志收集daemon
, 例如fluentd
、logstash
。 - 在每个
Node
. 上运行监控daemon
, 例如Prometheus
Node
Exporter
为什么会有一些呢?因为我们可以在创建Pod的时候打上一个污点,这些被打上污点的就不会在被创建副本了
7️⃣ Job, Cron job
⭐️ Job
负责批处理任务,即仅执行一次的任务,它保证批处理任务的-一个或多个Pod
成功结束
打个比方,就比如你运行一个脚本,job
就会判断你是不是正常退出,如果不是正常退出,他就会在去执行那个脚本,直到正常退出为止
⭐️ Cron Job 管理基于时间的Job, 在特定达到时间循环创建job 即:
- 在给定时间点只运行一次
- 周期性地在给定时间点运行
四、服务发现
1️⃣client
向service
发送请求,这个请求会带有标签,service
就通过标签来寻找对应Pod
2️⃣ 客户端向访问一组pod
,但是pod
和pod
之间都不相干的时不可以通过service
统一代理的,但是如果时同一个rc创建的或者有同一个标签就就可以访问代理
五、网络通讯方式
⭐️ Kubernetes
的网络模型假定了所有Pod
都在一一个可以直接连通的扁平的网络空间中,这在GCE (Google Compute Engine
)里面是现成的网络模型,Kubernetes
假定这个网络已经存在。而在私有云里搭建Kubernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的Docker
容器之间的互相访问先打通,然后运行Kubernetes
1️⃣同一个Pod
内的多个容器之间通过lo回环通讯
2️⃣各个Pod
之间通过Overlay Network
来通讯
- 同节点通过
cni
网桥转发数据包 - 不同节点的
pod
需要通过网络插件来支持通讯
3️⃣ Pod
与Servicer
之间的通讯就要通过各节点的Iptables
1️⃣Flannel
⭐️ Flannel
是Core0S
团队针对Kubernetes
设计的一一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker
容器都具有全集群唯一- 的虚拟IP
地址。而且它还能在这些IP
地址之间建立-一个覆盖网络(Overlay
Network
),通过这个覆盖网络,将数据包原封不动地传递到目标容器内
⭐️Flannel
首先创建了一个名为flannel0
的网桥,而且这个网桥的一端连接docker0
的网桥,另一端连接一个名为flanneld
的服务进程。
⭐️ Flanneld
进程并不简单,它首先上连etcd
,利用etcd
来管理可分配的IP
地址段资源,同时监控etcd
中每个Pod
的实际地址,并在内存中建立了一个Pod
节点路由表;然后下连docker0
和物理网络,使用内存中的Pod
节点路由表,将docker0
发给它的数据包包装起来,利用物理网络的连接将数据包投递到目标flanneld
上,从而完成pod
到pod
之间的直接的地址通信。
⭐️ Flannel之间的底层通信协议的可选余地有很多,比如UDP
、VXlan
、AWS VPC
等等。只要能通到对端的Flannel
就可以了。源Flannel
封包,目标Flannel
解包,最终docker0
看到的就是原始的数据,非常透明,根本感觉不到中间Flannel
的存在。
2️⃣ETCD和Flannel
⭐️ 存储管理Flannel
可分配的IP地址段资源,监控ETCD
中每个Pod
的实际地址,并在内存中建立委会Pod
节点路由表
⭐️ 同一Pod
内的网络通信。在同一个Pod
内的容器共享同一个网络命名空间,共享同一个Linux
协议栈。所以对于网络的各类操作,就和它们在同一台机器上一样,它们可以用localhost
地址直接访问彼此的端口。其实这和传统的一组普通程序运行的环境是完全一样的,传统的程序不需要针对网络做特别的修改就可以移植了。这样做的结果是简单、安全和高效,也能减少将已经存在的程序从物理机或者虚拟机移植到容器下运行的难度。
⭐️Pod1
到Pod2
的网络,分两种情况。Pod1
与Pod2
不在同一台主机与Pod1
与Pod2
在同一台主机。
-
不在同一主机:
Pod
的地址是与docker0
在同一个网段的,但docker0
网段与宿主机网卡是两个完全不同的IP
网段,并且不同Node
之间的通信只能通过宿主机的物理网卡进行。将Pod
的IP
和所在Node
的IP
关联起来,通过这个关联让Pod
可以互相访问。 -
在同一主机:
Pod1
和Pod2
在同一台主机的话,由Docker0
网桥直接转发请求到Pod2
,不需要经过Flannel
。
⭐️ Pod
到Service
的网络。创建一个Service
时,相应会创建一个指向这个Service
的域名,域名规则为{服务名}.{namespace
}.svc
.{集群名称}。之前Service
IP的转发由iptables
和kube-proxy
负责,目前基于性能考虑,全部为iptables
维护和转发。iptables
则由kubelet
维护。Service
仅支持UDP和TCP
协议,所以像ping
的ICMP
协议是用不了的,所以无法ping
通Service
IP
。
⭐️ Pod
到外网。Pod
向外网发送请求,查找路由表, 转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables
执行Masquerade
,把源IP更改为宿主网卡的IP
,然后向外网服务器发送请求。
⭐️ 集群外部访问Pod
或Service
相关文章:

一、k8s快速入门之学习Kubernetes组件基础
一、三个容器管理器平台 Apache MESOS 开源的分布式资源管理框架,被推特选为基础平台,2019年推特换位k8s,MESOS最新版可以在MESOS上管理k8sDOCKER SWARM docker总部发行的,实现docker的集群方案,和docker捆版一起&…...

PostgreSQL 到 PostgreSQL 数据迁移同步
简述 PostgreSQL 是一个历史悠久且广泛使用的数据库,不仅具备标准的关系型数据库能力,还具有相当不错的复杂 SQL 执行能力。用户常常会将 PostgreSQL 应用于在线事务型业务,以及部分数据分析工作,所以 PostgreSQL 到 PostgreSQL …...
RestTemplate 常用方法(提供了多种方法来发送 HTTP 请求)
RestTemplate 是 Spring 框架中用于同步客户端 HTTP 请求的一个类,它提供了多种方法来发送 HTTP 请求。以下是一些常用的 RestTemplate 方法及其代码案例: 1.postForObject() 该方法用于发送 POST 请求,并期望返回一个对象。以下是一个使用…...
常量和变量
常量 常量是指在程序中使用的一些具体的数、字符。在程序运行过程中,其值不能被更改。如123,145.88,m,TRUE等。常量,用于记录程序中不可更改的数据。 分类 1、整型常量,表示整数的常量。 表示形式: 1)十进制形…...
Go语言的使用
在安装Go和配置镜像时,可以根据操作系统和网络环境来选择适合的步骤。以下是详细的安装步骤和镜像配置: 1. 安装Go 1.1 通过官方下载 访问 Go的官方下载页面 下载适合操作系统的安装包(Windows、macOS 或 Linux)。安装包下载完…...

详解CRC校验原理以及FPGA实现
文章目录 一、什么是CRC校验?二、实现CRC校验原理以及步骤2.1 用多项式表示二元码数据2.2 选择一个生成多项式作为校验2.3 计算CRC校验码 三、CRC判断数据是否错误的原理以及步骤3.1 将收到的数据与生成多项式求余3.2 数据发生错误再进行CRC校验判断 四、FPGA实现CR…...

企业如何通过架构蓝图实现数字化转型
数字化转型的关键——架构蓝图的力量 在当今的商业世界,数字化转型已经不再是一个选择,而是企业生存与发展不可回避的战略行动。企业希望通过数字化提高效率、增强灵活性,并为客户提供更好的体验。然而,数字化转型不仅仅涉及技术…...

React第十三章(useTransition)
useTransition useTransition 是 React 18 中引入的一个 Hook,用于管理 UI 中的过渡状态,特别是在处理长时间运行的状态更新时。它允许你将某些更新标记为“过渡”状态,这样 React 可以优先处理更重要的更新,比如用户输入&#x…...

IDEA使用Maven Helper查看整个项目的jar冲突
在插件市场安装Maven Helper,安装好后,重启IDEA;双击打开可能存在jar冲突的pom文件;在右侧面板查看冲突,text是引入的依赖明细,点击Dependecy Analyzer选项卡即可查看冲突的jar。...
uniapp项目 存储数据到手机本地
打开manifest.json,在App权限配置中,添加读取和写入的权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...

景联文科技医疗数据处理平台:强化医疗数据标注与管理,推动医疗数字化新篇章
随着医疗科技快速进步与广泛应用,医疗信息的规模正在迅速扩张,如何有效管理这些医疗数据成为了关键议题。 医疗数据不仅包括传统的纸质病历,还有电子病历、实验室检测结果、医学影像等多样化的数字信息。为确保这些数据能为临床决策、科研分析…...

vue使用高德地图实现轨迹显隐
<template><div><el-button type"primary" click"pathShowOrHide">轨迹显/隐</el-button><div id"container" /></div> </template><script> import AMapLoader from amap/amap-jsapi-loaderex…...
Maven(20) 如何使用Maven进行版本管理?
Maven提供了一套强大的版本管理机制,允许开发者管理项目的版本号,并在不同的版本之间进行升级和降级。以下是如何使用Maven进行版本管理的详细步骤和代码示例: 步骤 1: 定义项目版本 在pom.xml文件中,你需要定义项目的版本号。版…...
AWS RDS MySQL内存使用
1. AWS RDS所拥有的内存(实例类型),和数据库能够使用的内存是不同的。RDS实例为操作系统和 RDS 管理进程预留了内存,数据库使用内存大小,小于数据库实例类的硬件规格中所示的值(以 GiB 为单位)[…...

Vue指令:v-else、v-else-if
目录 1.语法: 2. 题目 3.页面展示 4.结构 1.语法: 1.作用:辅助v-if进行判断渲染 2.语法:v-else 、v-esle-if"表达式" 2. 题目 <!DOCTYPE html> <html lang"en"> <head><meta chars…...

基于SSM志愿者招募系统的设计
管理员账户功能包括:系统首页,个人中心,用户管理,志愿组织管理,组织信息管理,组织申请管理,志愿活动管理活动报名管理 用户账号功能包括:系统首页,个人中心,…...

数学建模与优化算法:从基础理论到实际应用
数学建模和优化算法,它们不仅帮助我们理解和描述复杂系统的行为,还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发,逐步深入到各种优化算法,并探讨它们在实际问题中的应用。 思维导图文件可获取:https:…...

微信小程序生成二维码
目前是在开发小程序端 --> 微信小程序。然后接到需求:根据 form 表单填写内容生成二维码(第一版:表单目前需要客户进行自己输入,然后点击生成按钮实时生成二维码,不需要向后端请求,不存如数据库…...
自由软件与开源软件:异同与联系
自由软件与开源软件:异同与联系 随着信息技术的快速发展,自由软件运动与开源软件运动成为推动软件开发领域变革的重要力量。虽然这两个概念在日常对话中常被交替使用,但它们各自有着不同的理念和发展历程。本文将探讨自由软件运动与开源软件…...

Vue中ref、reactive、toRef、toRefs的区别
一、ref、reactive setup 函数中默认定义的变量并不是响应式的(即数据变了以后页面不会跟着变),如果想让变量变为响应式的变量,需要使用 ref 和 reactive 函数修饰变量。 ref 函数可以把基本类型变量变为响应式引用reactive 函数…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...