简述Kubernetes Service类型?

在默认情况下,一个Pod在哪个Node节点上运行,是由scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的,但是在实际使用中,这并不满足要求,因为在很多情况下,我们想控制某些Pod在某些某些节点上,这就要求Kubernetes能对Pod进行调度,Kubernetes提供了四种调度方式

  • 自动调度:由scheduler计算得出

定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上,注意,这里所说的调度是强制的,这意味着即使调度的Node不存在,也会向上面进行调度,只不过pod运行失败而已

如下,查看可以发现此时已经调度到node2节点上了

首先给node1和node2节点打不同的标签

如下,可以看到,pod如愿被调度到node2节点上

最后使用如下命令删除资源

Kubernetes是当今最流行的开源容器管理平台,来自Google Borg的开源版本,2014年推出。Kubernetes源于希腊语,意为舵手,K8S是一个简称,因为首尾字母中间正好有8个字母。

基于容器技术,Kubernetes可以方便的进行集群应用的部署、扩容、缩容、自愈机制、服务发现、负载均衡、日志、监控等功能,大大减少日常运维的工作量。

从两个维度来看k8s。



Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。

APIServer 负责对外提供RESTful的Kubernetes API服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。

controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。

etcd 保存了整个集群的状态。etcd是一个高可用的键/值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

Node 可以是一个物理机也可以是虚拟机,每个节点上都运行了可以运行 Pods 的服务。通过Master节点来进行管理。

  • 反向代理: 将客户端流量转发到与service对应的一组后端pod

Pod 是Kubernetes中可以创建和部署的最小单位。Pod包含了应用容器、存储资源、唯一的网络IP地址以及容器运行的参数。Pod内部的容器共享的网络、存储资源。Docker是Pod中最常用的容器运行环境,但仍允许用户使用其他的容器环境。

Pod使用有两种方式:

  • 一个Pod中运行多个容器 containers (这些容器联系必须 非常紧密,而且需要 直接共享资源。 web-db模式不行)

在Docker中,容器是最小的处理单元,增删改查的对象是容器,容器是一种虚拟化技术,容器之间是隔离的,隔离是基于Linux Namespace实现的。而在Kubernetes中,Pod包含一个或者多个相关的容器,Pod可以认为是容器的一种延伸扩展,一个Pod也是一个隔离体,而Pod内部包含的一组容器又是共享的(包括PID、Network、IPC、UTS)。除此之外,Pod中的容器可以访问共同的数据卷来实现文件系统的共享。

在kubernetes中,镜像的下载策略为:

Always:每次都下载最新的镜像

Never:只使用本地镜像,从不下载

IfNotPresent:只有当本地没有的时候才下载镜像

Pod被分配到Node之后会根据镜像下载策略进行镜像下载,可以根据自身集群的特点来决定采用何种下载策略。无论何种策略,都要确保Node上有正确的镜像可用。

通过yaml文件,可以在Pod中设置:

Host网络,一些特殊场景下,容器必须要以host方式进行网络设置(如接收物理机网络才能够接收到的组播流),在Pod中也支持host网络的设置,如:spec-->hostNetwork=true;

重启策略,当Pod中的容器终止退出后,重启容器的策略。这里的所谓Pod的重启,实际上的做法是容器的重建,之前容器中的数据将会丢失,如果需要持久化数据,那么需要使用数据卷进行持久化设置。Pod支持三种重启策略:Always(默认策略,当容器终止退出后,总是重启容器)、OnFailure(当容器终止且异常退出时,重启)、Never(从不重启);

工作类容器,一次性任务。通过Job运行一个容器,当其任务执行完以后,就自动退出,集群也不再重新将其唤醒。

执行定时任务的控制器。

k8s旧版,通过它实现了 Pod 的多副本管理(现在不建议用)

Kubernetes进行垃圾回收管理的控制器,Kubernetes的垃圾回收由kubelet进行管理,每分钟会查询清理一次容器,每五分钟查询清理一次镜像。在kubelet刚启动时并不会立即进行GC,即第一次进行容器回收为kubelet启动一分钟后,第一次进行镜像回收为kubelet启动五分钟后。(了解一下)

客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。

service可以将pod ip封装起来,即使pod发生重建,依然可以通过service来访问pod提供的服务,service还解决了负载均衡的问题. 运行在每个node上的kube-proxy进程其实就是一个智能的软件负载均衡器,它负责把service的请求转发到后端的某个pod实例。

Kubernetes创建Pod时会自动添加所有可用的service环境变量到该Pod中,如有需要.这些环境变量就被注入Pod内的容器里。需要注意的是,环境变量的注入只发送在Pod创建时,且不会被自动更新。这个特点暗含了service和访问该service的Pod的创建时间的先后顺序,即任何想要访问service的pod都需要在service已经存在后创建,否则与service相关的环境变量就无法注入该Pod的容器中,这样先创建的容器就无法发现后创建的service。

Kubernetes集群现在支持增加一个可选的组件——DNS服务器。这个DNS服务器使用Kubernetes的watchAPI,不间断的监测新的service的创建并为每个service新建一个DNS记录。如果DNS在整个集群范围内都可用,那么所有的Pod都能够自动解析service的域名。

Kubernetes使用iptables和kube-proxy解析service的人口地址,在中小规模的集群中运行良好,但是当service的数量超过一定规模时,仍然有一些小问题。首当其冲的便是service环境变量泛滥,以及service与使用service的pod两者创建时间先后的制约关系。目前来看,很多使用者在使用Kubernetes时往往会开发一套自己的Router组件来替代service,以便更好地掌控和定制这部分功能。

容器中的文件系统是临时的,一旦容器重新启动,所有运行时对文件的操作都会丢失。Kubernetes使用Volumes来解决这个问题。不同于Docker自身的Volume,Kubernetes提供了Volume的生命周期管理,另外还提供了多种存储形式的支持。在Pod的spec中指定volume的类型以及挂载的位置。

实际使用中,存储选择优先顺序:

发布时间: 18:18:35 来源:亿速云 阅读:113 作者:柒染 栏目:

这篇文章将为大家详细讲解有关如何进行Kubernetes服务类型的浅析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在Kubernetes中,服务总是能使其网络访问到一个或一组Pod上。服务将会根据标签选择Pod并且当对这些服务建立网络时,它会选择集群中所有与服务的selector相匹配的Pod,并选择其中的一个,然后将网络请求转发给它。

在K8S中我们应该如何区分Deployment和服务呢?

  • Deployment主要负责让一组pod在集群中保持运行

  • 服务主要负责在集群中启用对一组pod的网络访问

我们可以使用deployment而不使用服务,所以我们可以保持几个相同的Pod在K8S集群中运行。此外,Deployment的规模可以扩大和缩小,pod也可以复制。在Kubernetes中,单个pod可以直接通过网络请求单独访问,因此要跟踪pod会有些困难。

我们也可以使用一个服务类型而不需要deployment。如果我们这样做,将创建一个单一的pod,而不是像我们在deployment中那样一起创建所有pod。不过,我们还有另一种替代方案,即我们的服务能够根据分配给它们的标签进行选择,从而将网络请求路由到这些Pod。

在Kubernetes中,有两种方式可以发现服务:

  • 类型。DNS server被添加到集群中,以便观察Kubernetes API为每个新服务创建DNS record set。当整个集群启用DNS后,所有的Pod都应该能够自动进行服务名称解析。

  • ENV变量。在这一发现方法中,一个pod运行在一个节点上,所以 kubelet为每个active服务添加环境变量。

服务规范中的类型属性决定了服务如何暴露在网络中。比如,ClusterIP、NodePort和LoadBalancer。

  • NodePort—这使得服务可以通过集群中每个节点上的静态端口访问。

  • LoadBalancer—服务通过云提供商的器功能可以从外部访问。阿里云、AWS、Azure都提供了这一功能。

通过deployment kind的帮助,以“Hello World” App形式的简单示例将会帮助你更好地理解如何创建服务。

我们的操作流程是,当我们看到应用程序已经部署完成并且以up状态运行的时候,我们将创建服务(Cluster IP)来访问Kubernetes中的应用程序。

现在,让我们创建一个正在运行的deployment

这里,这个命令在Kubernetes中创建了一个有两个应用程序副本的deployment。

应用程序现在正在运行,如果你想要访问新创建的应用程序,我们需要创建ClusterIP类型的服务:

  • 使用kubectl expose命令,这是一个更为简单的选项。因为这一命令可以无需创建YAML文件即可创建一个服务。

那么,现在我们将访问我们的应用程序:

然后,我们需要执行port-forward命令。因为我们的服务类型是ClusterIP,所以只能在集群内访问,因此我们必须通过转发端口到集群中的本地端口才能访问我们的应用程序。

我们可以使用其他类型,如LoadBalancer,这将在AWS或GCP中创建一个LB,然后我们可以使用给LB的DNS地址和我们端口号来访问应用程序。

现在我们可以从工作站浏览http://localhost:8080,并且我们应该会看到:

此示例YAML创建了可用于外部网络请求的服务。在这里,我们提到了带Value的NodePort,因此服务被映射到集群中每个节点上的端口。

下面是一个yaml的例子,它将展示我们如何在Kubernetes中使用NodePort服务类型。

关于如何进行Kubernetes服务类型的浅析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

我要回帖

更多关于 b的类型 的文章

 

随机推荐