一.K8s核心概念 版本1.19.1

1.Master

  1. Master主要负责资源调度,控制副本,和提供统一访问集群的入口 --核心节点也是管理节点

2.Node

Node是K8s集群架构中运行Pod的服务节点。
Node是K8S集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机
Node由Master管理,并汇报容器状态给Master,同时根据Master要求管理容器生命周期

3.Node IP

Node节点的IP地址,是K8s集群中每个节点的物理网卡的IP地址,是真实存在的物理网络,所有属于这个网络的服务器之间都能通过这个网络直接通信

4.Pod

Pod直译是豆荚,可以把容器想象成豆荚里的豆子,一个pod可以有多个容器
在K8s中我们不会直接操作容器,而是把容器包装成Pod再进行管理
Pod运行与Node节点上,Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间,IP地址和端口,能够通过localhost进行通信
Pod是K8s进行创建的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活
Pod就是K8s世界里的“应用”;而一个应用,可以由多个容器组成

5.Pod IP

Pod的IP地址,是docker engine根据docker0网桥的IP地址段进行分配,通常是一个虚拟的二层网络,
位于不同Node上Pod能够彼此通信,需要通过Pod IP所在的虚拟二层网络进行通信
真是的TCP流量则是通过Node IP所在的物理网卡流出的

6.pause容器

每个Pod中都有一个pause容器,pause容器作为Pod的网络接入点,Pod中其他容器会使用容器映射模式启动并接入到这个pause容器
属于同一个Pod的所有容器共享网络的namespace
如果Pod所在的Node宕机,会将这个Node上的所有Pod重新调度到其他节点上

7.Pod Volume

数据卷,挂在宿主机文件,目录或者外部存储到Pod中,为应用服务提供存储,也可以解决Pod容器之间共享存储

8.Namespace

命名空间将资源对象逻辑上分配到不同Namespace,可以是不同项目,用户等区分管理,
设定控制策略,从而实现多租户。命名空间也称为虚拟集群

9.Deployment

Deployment是一个更高层次API对象,它管理ReplicaSets和Pod,并提供声明式更新等功能
Deployment将会是使用最频繁的资源对象

10.Replication Controller —RC

RC管理Pod的副本数量,保证集群存在指定数量的容器,副本数量多,RC会删除,副本数量少了,RC会增加
RC是实现弹性伸缩,动态扩容和滚动升级的核心

11.Service

Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象
Service提供了一个统一的服务访问入口以及服务代理和发现机制,用户不用了解后台Pod如何运行
一个service定义了访问pod的方式,就像单个固定的IP地址和与其相对应的DNS之间的联系

创建service并且以nodePort的方式暴露端口给外网,用户访问node节点的ip+nodeprot,然后会转到ClusterIP+prot,最后转到Pod里的容器中的targetPort端口,进而找到应用
image.png

12.master与node的关系

image.png

二.K8s架构和组件

image.png

master组件

1.API Server

作为K8s系统的入口,其中封装了核心对象的增删改查操作,以RESTFUL API接口方式提供给外部客户和内部组件调用
维护的REST对象持久化到Etcd数据库中储存

2.Scheduler

为建立的Pod进行节点选择(分配pod到不同的node节点上),负责集群的资源调度

3.Etcd

etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。

4.K8s Controller

负责执行各种控制器,目前已经提供了很多控制器来保证K8s的正常运行

控制器有 Deployment,RC,Service,PV,DaemonSet,StatefulSet,Namespace

Node组件

1.Kubelet

kubelet是主要的节点代理,它会监视已分配给节点的pod
定期执行容器健康检查
安装Pod所需的volume

2.Kube-proxy

通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。
负责具体的工作流量转发

3.Docker

Docker负责运行容器

三.K8s所用控制器,组件,插件,详细解释

常用的几种控制器

1.RC

RC管理Pod的副本数量,保证集群存在指定数量的容器,副本数量多,RC会删除,副本数量少了,RC会增加
RC是实现弹性伸缩,动态扩容和滚动升级的核心

2.Deployment

Deployment是一个更高层次API对象,它管理ReplicaSets和Pod,并提供声明式更新等功能
Deployment将会是使用最频繁的资源对象
Deployment拥有RC90%的功能,简单地说,Deployment是RC的升级版

3.DaemonSet

DaemonSet确保全部(或者某些)节点上运行一个Pod剧本
有新节点加入集群时,会为他们新增一个Pod
有节点从集群移出,这些Pod也会回收
删除DaemonSet将会删除它创建的所有Pod
一般都运用在全部节点都要部署某种Pod,如日志收集logstash,监控

4.StatefulSet

StatefulSet中的Pod拥有一定的黏性,独一无二的身份标识
这个标识基于StatefulSet分配给每个Pod的唯一顺序索引
StatefulSet为它们每个Pod维护了一个固定的ID,无论如何调度Pod的ID不会变

使用场景1.稳定的,唯一的网络标识符
使用场景2.稳定的,持久的存储
使用场景3.有序的,优雅的部署和缩放
使用场景4.有序的,自动的滚动更新

Schduler组件

为建立的Pod进行节点选择(分配pod到不同的node节点上),负责集群的资源调度

kubelet(node节点)

负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。

k8s proxy(node节点)

负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API  Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。

Namespace命名空间

命名空间将资源对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。命名空间也称为虚拟集群。

数据卷Secret,ConfigMap,Downward API(不常用)

secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
ConfigMap 保存的是不需要加密的、应用所需的配置信息。ConfigMap 的用法几乎与 Secret 完全相同:可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件。
Downward API用于在容器中获取 POD 的基本信息,kubernetes支持

1.secret:保存敏感信息,比如用户名、密码、token
创建方式2种:命令行,yaml文件
引用3种:
volume挂载,secret中的key映射,环境变量env(最常用)
2.configMap:保存配置文件
创建方式4种:命令行,文件,目录,yaml文件
引用3种方式:configMap中的key映射,环境变量env,volume挂载(最常用)
DownwardAPI:将POD的信息映射到容器中(侧重点)
yaml文件创建
引用2种:volume挂载,环境变量env

ServiceAccount

我们在管理 kubernets 集群的时候,可能需要给予不同的用户不同的权限; 这个时候 kubernetes 提供的 serviceAccount 可以提供一个很不错的我们管理的切入点。Pod想要有权限需要绑定ServiceAccount,ServiceAccount绑定cluster-admin,这样pod就有了admin的权限

总结:serviceaccount是pod访问apiserver的权限认证,每个pod中都默认会绑定当前名称空间默认的sa中的secrets,来保证pod能正常的访问apiserver;
serviceaccount能和clusterrole进行绑定。绑定成功之后,serviceaccount的权限就和clusterrole一致了。后续pod再使用这个serviceaccount,pod的权限也就相同了;
不过这个是pod进程的权限;如果真正关乎与用户的权限的话,还是使用RBAC
说白了,serviceaccount就是pod使用的账号而已;