ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【转】k8s中Pod、ReplicaSet、Deployment、Service的概念

2021-03-14 08:33:52  阅读:174  来源: 互联网

标签:ReplicaSet Service Label Deployment pod Pod name


k8s中Pod、ReplicaSet、Deployment、Service的概念
一、Pod
二、ReplicaSet
2.1 Label(标签)
2.2 Label Selector(标签选择器)
三、Deployment
四、Service
五、总结
一、Pod
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod中包含了一个或多个容器,还包括了存储、网络等各个容器共享的资源。Pod支持多种容器环境,Docker则是最流行的容器环境。

简单来说k8s不想直接操作container,因为操作container的事情是docker来做的,k8s中要有自己的最小操作单位,称之为Pod。说白了,Pod就是一个或多个Container的组合。

每个Pod中都有一个pause容器,pause是Kubernetes基础设施的一部分,Kubernetes管理的所有pod里,pause容器是第一个启动的,用于实现Kubernetes集群里pod之间的网络通讯。

 

二、ReplicaSet
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。(确保任何时间都有指定数量的 Pod 副本在运行)

先说下Replication Controller。Replication Controller的作用是确保Pod以指定的副本个数运行。

ReplicaSet是Replication Controller升级版。ReplicaSet和Replication Controller之间的唯一区别是对选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector(version in (v1.0,v2.0)或env notin (dev, qa))


2.1 Label(标签)
Label是Kubernetes系统中的一个核心概念。
Label以key/value键值对的形式附加到各种对象上,如Pod、Service、RC、Node等。
Label定义了这些对象的可识别属性,用来对它们进行管理和选择。Label可以在创建时附加到对象上,也可以在对象创建后通过API进行管理。


2.2 Label Selector(标签选择器)
在为对象定义好Label后,其他对象就可以使用Label Selector(选择器)来定义其作用的对象了。

Label Selector的定义由多个逗号分隔的条件组成。

“labels”: {
“key1”: “value1”,
“key2”: “value2”
}

当前有两种Label Selector:

基于等式的(Equality-based)和基于集合的(Set-based),在使用时可以将多个Label进行组合来选择。

1、基于等式的Label Selector使用等式类的表达式来进行选择:

name = redis-slave: 选择所有包含Label中key="name"且value="redis-slave"的对象;
env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象。

2、基于集合的Label Selector使用集合操作的表达式来进行选择:

name in (redis-master, redis-slave): 选择所有包含Label中的key="name"且value="redis-master"或"redis-slave"的对象;
name not in (php-frontend): 选择所有包含Label中的key="name"且value不等于"php-frontend"的对象。

ps:在某些对象需要对另一些对象进行选择时,可以将多个Label Selector进行组合,使用逗号","进行分隔即可。
基于等式的LabelSelector和基于集合的Label Selector可以任意组合。
例如:

name=redis-slave,env!=production
name not in (php-frontend),env!=production

三、Deployment
Deployment用于管理Pod、ReplicaSet,可实现滚动升级和回滚应用、扩容和缩容。


四、Service
试想一个问题,ReplicaSet定义了pod的数量是2,当一个pod由于某种原因停止了,ReplicaSet会新建一个pod,以确保运行中的pod数量始终是2。但每个pod都有自己的ip,前端请求不知道这个新pod的ip是什么,那前端的请求如何发送到新pod中呢?
答案是使用Service
k8s的Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。
简单来说前端请求不是直接发送给Pod,而是发送到Service,Service再将请求转发给pod。

上图可能太抽象,我们可以看看下面这张图。
假设我们把一个服务做了高可用,这个服务分别部署在了两个节点上,当我们想访问该服务时,则此时访问的不是pod而是service,service会再给我们做负载均衡。

k8s中的service中有三种类型:

ClusterIP:提供一个集群内部的虚拟IP以供Pod访问。
NodePort:在每个Node上打开一个端口以供外部访问。
LoadBalancer:通过外部的负载均衡器来访问。
五、总结
Pod里是容器,Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。

deployment和service yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 81
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Deployment:
① apiVersion 是当前配置格式的版本。
② kind 是要创建的资源类型,这里分别创建了Deployment和Service。
③ metadata 是该资源的元数据,name 是必需的元数据项。
④ spec 部分是 Deployment 的规格说明。
⑤ replicas 指明副本数量,默认为 1。
⑥matchLabels 指匹配的pod的标签是什么。
⑦ template 定义 Pod 的模板,这是配置文件的重要部分。
⑧ metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。
⑨ spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。

Service:
① port Service 服务暴露的端口
② targetPort 容器暴露的端口
③ type Service的类型

k8s集群搭建步骤:
https://blog.csdn.net/qq_35080214/article/details/110928221
from:https://blog.csdn.net/qq_35080214/article/details/111177787

标签:ReplicaSet,Service,Label,Deployment,pod,Pod,name
来源: https://www.cnblogs.com/xuan52rock/p/14531377.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有