k8s全称kubernetes,是能操作部署多个容器的工具。
从架构设计层面,我们关注的可用性,伸缩性都可以结合k8s得到很好的解决。
K8s pod 是K8s管理容器集的最小单位。 每个pod有一个分配给pod中的所有容器的单独的IP 地址。
在pod中的容器内存和存储资源是共享的。当应用程序只有一个进程时,pod 也可以有一个容器。
另外可以区分下Kubectl和K8s,Kubectl是K8s的命令行工具。它用于部署应用程序、监控和控制集群资源以及查看日志。从用户的角度来看,Kubectl 是你的K8s的控制面板。它使你能够执行所有K8s操作。从技术角度来看,Kubectl 是K8s API的客户端。
容器化技术无需虚拟出整个操作系统,只需要虚拟一个小规模的环境即可,而且启动速度很快,除了运行其中的应用外,基本不消耗额外的系统资源。
Docker是应用最为广泛的容器技术,通过打包镜像,启动容器来创建服务。但是随着应用越来越复杂,容器的数量也越来越多,由此衍生了管理运维容器的重大问题。至此k8s问世,提出了一套全新的基于容器技术的分布式架构领先方案,在整个容器技术领域的发展是一个重大突破与创新。
k8s集群由Master节点和Worker节点组成。
Master节点指的是集群控制节点,管理和控制整个集群,基本上k8s的所有控制命令都发给它,它负责具体的执行过程。可以在master中使用命令 kubectl get nodes
查看集群中所有节点,在Master上主要运行着:
master以外的节点为Worker节点。每个Node都会被Master分配一些工作负载(Docker容器),当某个节点宕机时,该节点上的工作负载就会被Master自动转移到其它节点上。在Node上主要运行着:
Deployment是一种controller,可用来管理pod,并为pod扩容。
pod 是 kubernetes 中最小的编排单位,通常由一个容器组成 (有时候会由多个容器组成)。
Pod是短暂的,且每个Pod都有一个唯一的IP地址,称之为Pod IP,Pod IP是动态变化的,会随着pod的删除和重建而发生改变。在K8S集群中,一个Pod里的容器与另外主机上的Pod容器能够直接通信
service可以做服务发现,即向pod的podID做请求服务,提供了一个统一的服务访问的入口。
ConfigMap是k8s的一个配置管理组件,可以将配置以key-value的形式传递,通常用来保存不需要加密的配置信息,加密信息则需用到Secret
使用k8s部署应用,将应用配置写进代码中时,会存在更新配置时也需要打包镜像的问题,ConfigMap可以将配置信息和docker镜像解耦。
使用微服务架构,存在多个服务共用配置的情况,使用ConfigMap可以实现多个服务共享配置。
Ingress用于实现用域名的方式访问k8s内部应用,是对集群中服务的外部访问进行管理的API对象。
Ingress用于从集群外部到集群内部Service的HTTP和HTTPS路由,流量从Internet到Ingress再到Services最后到Pod上,通常情况下,Ingress部署在所有的Node节点上。
Ingress可以配置提供服务外部访问的URL、负载均衡、终止SSL,并提供基于域名的虚拟主机。但Ingress不会暴露任意端口或协议。
Endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址。
可以通过Endpoint实现外部服务与内部服务建立连接。
Node上的Kube-proxy获取每个Service的Endpoints,实现Service的负载均衡功能。service配置selector,endpoint controller才会自动创建对应的endpoint对象;否则,不会生成endpoint对象。
如果检测到Service被删除,则删除和该Service同名的Endpoints对象;
如果检测到新的Service被创建或修改,则根据该Service信息获得相关Pod列表,然后创建或更新Service对应的Endpoints对象。