K8S学习记录 - 基础
K8S学习记录 - 基础
一、简介
容器编排工具。
K8S 是比容器更上一层的架构,它可以支持多种容器技术,比如我们熟悉的 Docker,K8S 定位是一个容器调度工具。
二、基本概念
cluster:一组节点。
node:node 节点的作用是承接 master 分配的工作负载。
master:master 节点也称为控制节点,每个 k8s 集群都有一个 Master 节点负责整个集群的管理控制。
service:service是一种抽象的对象,它定义了一组Pod的逻辑集合( Label Selector )和一个用于访问它们的策略。(四层负载均衡)
pod:
pod是容器的一个上层包装结构,
pod 可包含多个容器在里面,每个 pod 至少会有一个 Pause 容器,其它用户定义的容器都共享该 Pause 容器,Pause 容器的主要作用是用于定义 pod 的 ip 和 volume。
可以将 pod 看作是一个环境(包括容器、存储、网络ip:port、容器配置)。
Pod 可以被视作虚拟机或者物理主机。
container:容器。
deployment:是一个定义及管理多副本应用(即多个副本 Pod)的新一代对象,与Replication Controller相比,它提供了更加完善的功能,使用起来更加简单方便。
Ingress:Ingress是为进入集群的请求提供路由规则(反向代理规则)的集合。Ingress可以给service提供集群外部访问的URL、负载均衡、SSL终止、HTTP路由等。
用于规定HTTP或HTTPS请求应该被转发到哪个Service上。(七层负载均衡)
StatefulSet:有状态工作负载。deployment/rc 的一个特殊变种。
- pod都有稳定、唯一的网络标识;
- StatefulSet控制的pod副本的启停顺序是受控的;
- StatefulSet里的pod采用稳定的持久化存储卷,通过PV或PVC来实现。(删除pod时默认不会删除与StatefulSet相关的存储卷,以保证数据安全)
Volume:卷
PersistentVolume:持久卷,对存储资源创建和使用的抽象,使存储作为集群中的资源管理。PV是集群中的一块网络存储,与Node一样,也是集群的资源。
PersistentVolumeClaim:持久卷申请,让用户不需要关心具体的Volume实现细节,PVC是一个用户的请求,与Pod类似。Pod消费Node的资源,PVC消费PV的资源。
Headless Service:
三、Master 组成
API Server:提供了 HTTP Rest 接口的服务进程,所有资源对象的增、删、改、查等操作的唯一入口;
Controller Manager:k8s 集群所有资源对象的自动化控制中心;
Scheduler:k8s 集群所有资源对象自动化调度控制中心;
ETCD:k8s 集群注册服务发现中心,可以保存 k8s 集群中所有资源对象的数据。
四、Node 组成
kubelet:负责 Pod 对应容器的创建、启停等操作,与 Master 节点紧密协作;
kube-porxy:实现 k8s 集群通信与负载均衡的组件。(反向代理)
容器运行环境:比如 docker。
五、service 的几种类型(访问模式)
ClusterIp:默认类型,每个Node分配一个集群内部的Ip,内部可以互相访问,外部无法访问集群内部。
NodePort:基于ClusterIp,另外在每个Node上开放一个端口,可以从所有的位置访问这个地址。
LoadBalance:基于NodePort,并且有云服务商在外部创建了一个负载均衡层,将流量导入到对应Port。要收费的。
ExternalName:将外部地址经过集群内部的再一次封装(实际上就是集群DNS服务器将CNAME解析到了外部地址上),实现了集群内部访问即可。
Ingress:通过独立的ingress对象来制定请求转发的规则,把请求路由到一个或多个service中。这样就把服务与请求规则解耦了。
六、service 的三种代理模式
Userspace:
iptables:
IPVS:ipvs是工作在内核态的4层负载均衡,和iptables一样都是基于内核底层netfilter实现,netfilter主要通过各个链的钩子实现包处理和转发 。
七、IP
NodeIP:
ServcieIP(ClusterIP)(VIP)(虚IP):
PodIP:
八、Port
1、Port
service中clusterIP 对应的端口。
指该service暴露的端口,用yaml文件创建svc时是必选项,用命令创建时可以不指定,如果不指定,会继承pod中的containerPort。
2、NodePort
指node节点端口(只有当type为NodePort或LoadBalancer时才需要该参数,一般自动生成),用于对外通信。
3、TargetPort
clusterIP作为负载均衡, 后端目标实例(容器)的端口。
指后端pod暴露的端口,就是pod中的containerPort。
如果既不指定port又不指定targetPort,那么port和targetPort都会继承pod中的containerPort。
如果指定了port而没有指定targetPort,那么targetPort会继承port值,
所以此时必须指定targetPort值为pod中的containerPort,不能随便指定端口号,除非port值和pod中的containerPort相同(这种情况可以不指定targetPort)。
当type为ClusterIP时,流量经过的端口走向是:
svc端口(port)----pod端口(targetPort)----容器端口(containerPort)
当type为NodePort时,流量经过的端口走向是: 节点端口(NodePort)----svc端口(port)----pod端口(targetPort)----容器端口(containerPort)
4、ContainerPort
容器需要暴露的端口。
5、HostPort
容器暴露的端口映射到的主机端口。
九、EndPoint
podIP:targetPort
每个Service的Endpoints
十、K8S服务发现
1、环境变量
2、DNS
十一、资源
在 Kubernetes 里面, API 编程范式也就是 Custom Resources Definition(CRD)。我们常讲的 CRD,其实指的就是用户自定义资源。
参考资料
K8s易混点辨析:nodePort、port、targetPort、containerPort
Kubernetes中的端口hostPort、port、nodePort、targetPort
k8s ingress原理及ingress-nginx部署测试