k8s入门教程详解(一)
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升
#Ingress controller:
官方实现了四层代理,Ingress 可以实现七层代理
#Federation:
提供一个可以跨越集群中心多k8s 统一管理功能
#Prometheus:
提供k8s 集群的监控能力
#ELK:
提供k8s 集群日志 统一 分析接入平台
5. K8s 核心概念
5.1 Master 集群控制节点
- 每个集群至少一个master节点负责集群的管理
5.2 Node 工作负载节点
- 由masster 分配容器到这些node节点上,然后node 节点上的docker 负责容器运行
5.3 Pod kubernetes的最小控制单元
- **自主式pod **
Pod是在K8s集群中运行部署应用或服务的最小单元(原子单元),它是可以支持多容器的。
只要我们定义了一个Pod,它就会自动启动一个容器—pause的网络栈。也就意味着同一个Pod 容器间的端口不能冲突
一个Pod里封装了很多个容器,他们共用一个pause,共用存储卷
5.4 Controller 控制器Pod
-
控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
-
K8S内核提供了众多的pod控制器,常用的有:
Deployment 部署(暴露在最外面的)
DaemonSet 要求每一个运行节点都启动一个
ReplicaSet
StatefulSet
Job
Cronjob
5.4.1 复制控制器(Replication Controller,RC)— 确保预期的Pod副本数量
- RC 控制器
Replication Control1er 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod 来替代;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes 中建议使用ReplicaSet来取代 ReplicationControl1e
5.4.2 副本集(Replica Set,RS)— 确保预期的Pod副本数量
- RS副本集
ReplicaSet跟Replication Controller没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector
虽然ReplicaSet可以独立使用,但一般还是建议使用
Deployment来自动管理ReplicaSet ,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet不支持rolling update {滚动更新}但 Deployment支持)
5.4.3 HPA
- HPA
HPA监控我们的RS,当我们的CPU达到80后(CPU>=80),他就会新建Pod,最多创建10个,最少保留2个。
如果高于80,就创建,小于80不在创建。
5.4.4 StatefulSet —为了解决有状态服务的问题
- StatefulSet
StatefulSet是为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets是为无状态服务而设计),
其应用场景包括:
1.稳定的持久化存储,即 Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
2.稳定的网络标志,即 Pod重新调度后其 PodName和 HostName不变,基于 Headless Service(即没有Cluster IP的Service )来实现
3.有序部署,有序扩展,即 Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从О到N-1,在下一个Pod运行之前所有之前的 Pod必须都是Running 和 Ready状态),基于init containers来实现
4.有序收缩,有序删除(即从N-1到0>
5.4.5 部署(Deployment)
- Deployment
DaemonSet确保全部(或者一些)Node 上运行一个Pod 的副本。当有Node加入集群时,也会为他们新增一个Pod 。当有Node从集群移除时,这些 Pod 也会被回收。删除 DaemonSet将会删除它创建的所有Pod
运行集群存储daemon,例如在每个Node 上运行glusterd、cepho.
在每个Node上运行日志收集daemon,例如fluentd、logstash。
在每个Node上运行监控daemon,例如Prometheus Node Exporter
5.4.6 Job、Cron Job 负责批处理任务
- Job、Cron Job
Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod 成功结束
Cron Job管理基于时间的 Job,即:
在给定时间点只运行一次
周期性地在给定时间点运行
5.5 服务发现(Service)
- pod 对外服务的统一入口,可以维护同一类的多个Pod
在K8S里,虽然每个POD都会被分一个单独的IP地址,但这个IP地址会随着POD的销毁而消失,Service 就是来解决这个问题的核心概念
一个service 可以看作一组提供相同服务的Pod的对外访问接口
Service 作用于哪些Pod 是通过标签选择器来定义的
一个 Service 在 Kubernetes 中是一个 REST 对象,和 Pod 类似。 像所有的 REST 对象一样, Service 定义可以基于 POST 方式,请求 apiserver 创建新的实例。
5.6 Lable 标签
-
标签,用于对Pod进行分类,同一类POD会拥有相同的标签
-
附加到某个资源上,用于关联对象、查询和筛选
给资源打上标签后,可以使用标签选择器过滤指定的标签
标签选择器目前有2个:一个是基于 等值关系(等于、不等于)
一个是 基于集合关系(属于、不属于、存在)
许多资源支持内嵌标签选择器 字段
matchLabels
matchExpressions
一个合法的标签应该是 字母和数字、下划线、虚线"-“、点”." 开头和结尾必须是字母或数字的形式组成。标签值最多63个字符
5.7 Ingress
-
Ingress是授权入站连接到达集群服务的规则集合。
-
在K8S集群里,工作在应用层,对外暴露接口。
-
可以调动不同业务域,不同URL访问路径的业务流量
你可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求ingress。 Ingress controller负责实现Ingress,通常使用负载平衡器,它还可以配置边界路由和其他前端,这有助于以HA方式处理流量。
5.8 NameSpace 命名空间
- 用来隔离pod 的运行环境
随着项目怎多,人员增加,集群规模的扩大,需要一种能够隔离K8S内各种"资源",都应该有自己的"名称"。
Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群。
Namespace为名称提供了一个范围。资源的Names在Namespace中具有唯一性。
不同名称空间的内部"资源" ,名称可以相同,相同名称空间内的同种 “资源”,"名称"不能相同
合理的使用K8S的名称空间,使得集群管理员能够更好的对付交付 到K8S里的服务进行分类管理和浏览
K8S里默认存在的名称空间有 default、kube-system、kube-public
查询k8s 里特定"资源" 要带上相应 的名称空间
6.K8S 的网络通讯方式
-
K8S 的网络模型 假定了所有POD都在一个可以直接连通的扁平的网络空间(扁平化:所有的POD都可以通过对方的IP互相访问),在这里GCE(Google Compute Engine) 里面是现成的网络模型.
-
K8S假定这个网络模型已经存在,而在私有云里搭建K8S集群,就不能假定这个网络已经存在了。
-
所以,我们需要个网段假设,将不同节点上的Docker容器之间的互相访问先打通,然后在运行Kubernetes
6.1 同一个Pod 内的多个容器之间通讯:localhost
- 同一个Pod 内部通讯,共享一个网络命名空间,共享一个linux协议栈
6.2 各个Pod之间的通讯:Overlay Network
-
不同机器,上面运行的Docker容器IP一定不能冲突,
在k8s中,其实我们的谷歌没有对自己的k8s做了很强定义,它允许我们通过CNI接口,去接入我们自己的想要达到的一个网络方案。
其中Flannel 使我们在k8s里最常用的一种解决网络扁平化的一种方案,符合我们CNI接口。
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的 Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。
不同物理机器上面运行的Docker 容器IP一定不能冲突。在Docker里面我们可以修改配置文件,修改网段。那么Flannel是怎么解决的。
这里有2台物理主机,运行了4个Pod。一台物理机上运行了webapp2、webapp1 2个Pod ,另一台物理主机上运行了 webapp3、Backend 2个接点。他们的网络架构是 Backend(前端接点)、webapp1、webapp2、webapp3,所有流量访问到Backend上,它去经过自己的网关去处理,把什么样的请求分配到什么样的服务上。
这样就意味着。webapp2 和backend通讯,就需要跨主机通讯了,以及 webapp3 和backend通讯,就是2个同主机的不同Pod通讯了。2种不同的通信到底如何解决?
首先在我们真实服务器上,我们会安装一个Flanneld的守护进程,这个进程会监听一个端口,这个端口用于后续监听接受或转发数据包 的一个端口。一旦这个Flanneld 进程启动后,它会开启一个 Flanneld 0 的网桥,网桥Flanneld 0 专门会手机网桥Docker0 转发出来的数据报文。然后Docker0 会分发自己的IP到对应的pod上,
如果是同一台主机上 的两个Pod 互相通信,它走的是Docker0网桥。
如何跨主机,通过对方的IP直接到达?
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
[外链图片转存中…(img-VgfXKFso-1711394283525)]
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
[外链图片转存中…(img-epjcloDT-1711394283525)]
搜集费时费力,能看到此处的都是真爱!
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!
更多推荐
所有评论(0)