Kubernetes

Kubernetes Pods是有生命周期的。他们可以被创建,而且销毁不会再启动。 如果您使用Deployment来运行您的应用程序,则它可以动态创建和销毁 Pod。

一个Kubernetes的Service是一种抽象,它定义了一组Pods的逻辑集合和一个用于访问它们的策略 - 有的时候被称之为微服务。一个Service的目标Pod集合通常是由Label Selector 来决定的(下面有讲一个没有选择器的Service 有什么用处)。

举个例子,想象一个处理图片的后端运行了三个副本。这些副本都是可以替代的 - 前端不关心它们使用的是哪一个后端。尽管实际组成后端集合的Pod可能会变化,前端的客户端却不需要知道这个变化,也不需要自己有一个列表来记录这些后端服务。Service抽象能让你达到这种解耦。

不像 Pod 的 IP 地址,它实际路由到一个固定的目的地,Service 的 IP 实际上不能通过单个主机来进行应答。 相反,我们使用 iptables(Linux 中的数据包处理逻辑)来定义一个虚拟IP地址(VIP),它可以根据需要透明地进行重定向。 当客户端连接到 VIP 时,它们的流量会自动地传输到一个合适的 Endpoint。 环境变量和 DNS,实际上会根据 Service 的 VIP 和端口来进行填充。

kube-proxy支持三种代理模式: 用户空间,iptables和IPVS;它们各自的操作略有不同。

Userspace

作为一个例子,考虑前面提到的图片处理应用程序。 当创建 backend Service 时,Kubernetes master 会给它指派一个虚拟 IP 地址,比如 10.0.0.1。 假设 Service 的端口是 1234,该 Service 会被集群中所有的 kube-proxy 实例观察到。 当代理看到一个新的 Service, 它会打开一个新的端口,建立一个从该 VIP 重定向到新端口的 iptables,并开始接收请求连接。

当一个客户端连接到一个 VIP,iptables 规则开始起作用,它会重定向该数据包到 Service代理 的端口。 Service代理 选择一个 backend,并将客户端的流量代理到 backend 上。

这意味着 Service 的所有者能够选择任何他们想使用的端口,而不存在冲突的风险。 客户端可以简单地连接到一个 IP 和端口,而不需要知道实际访问了哪些 Pod。

iptables

再次考虑前面提到的图片处理应用程序。 当创建 backend Service 时,Kubernetes 控制面板会给它指派一个虚拟 IP 地址,比如 10.0.0.1。 假设 Service 的端口是 1234,该 Service 会被集群中所有的 kube-proxy 实例观察到。 当代理看到一个新的 Service, 它会配置一系列的 iptables 规则,从 VIP 重定向到 per-Service 规则。 该 per-Service 规则连接到 per-Endpoint 规则,该 per-Endpoint 规则会重定向(目标 NAT)到 backend。

当一个客户端连接到一个 VIP,iptables 规则开始起作用。一个 backend 会被选择(或者根据会话亲和性,或者随机),数据包被重定向到这个 backend。 不像 userspace 代理,数据包从来不拷贝到用户空间,kube-proxy 不是必须为该 VIP 工作而运行,并且客户端 IP 是不可更改的。 当流量打到 Node 的端口上,或通过负载均衡器,会执行相同的基本流程,但是在那些案例中客户端 IP 是可以更改的。

IPVS

在大规模集群(例如10,000个服务)中,iptables 操作会显着降低速度。 IPVS 专为负载平衡而设计,并基于内核内哈希表。 因此,您可以通过基于 IPVS 的 kube-proxy 在大量服务中实现性能一致性。 同时,基于 IPVS 的 kube-proxy 具有更复杂的负载平衡算法(最小连接,局部性,加权,持久性)。

Service类型

下面我们详细说下k8s支持的4种类型的Service。

Cluster IP


创建ClusterIP的Service yaml如下:

apiVersion: v1
kind: Service
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443selector:run: pod-pythontype: ClusterIP

使用 kuebctl get svc :

类型为ClusterIP的service,这个service有一个Cluster-IP,其实就一个VIP。具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现。

这种类型的service 只能在集群内访问。

NodePort

我们的场景不全是集群内访问,也需要集群外业务访问。那么ClusterIP就满足不了了。NodePort当然是其中的一种实现方案。

创建NodePort 类型service 如下:

apiVersion: v1
kind: Service
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443nodePort: 30080selector:run: pod-pythontype: NodePort

使用 kuebctl get svc :

此时我们可以通过http://4.4.4.1:30080或http://4.4.4.2:30080 对pod-python访问。该端口有一定的范围,比如默认Kubernetes 控制平面将在–service-node-port-range标志指定的范围内分配端口(默认值:30000-32767)。

LoadBalancer

LoadBalancer类型的service 是可以实现集群外部访问服务的另外一种解决方案。不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过Service的status.loadBalancer字段被发布出去。

创建 LoadBalancer service 的yaml 如下:

apiVersion: v1
kind: Service
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443nodePort: 30080selector:run: pod-pythontype: LoadBalancer

使用 kuebctl get svc :

可以看到external-ip。我们就可以通过该ip来访问了。

当然各家公有云支持诸多的其他设置。大多是公有云负载均衡器的设置参数,都可以通过svc的注解来设置,例如下面的aws:

metadata:name: my-serviceannotations:service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true"# Specifies whether access logs are enabled for the load balancerservice.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "60"# The interval for publishing the access logs. You can specify an interval of either 5 or 60 (minutes).service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "my-bucket"# The name of the Amazon S3 bucket where the access logs are storedservice.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "my-bucket-prefix/prod"# The logical hierarchy you created for your Amazon S3 bucket, for example `my-bucket-prefix/prod`

ExternalName

类型为 ExternalName 的service将服务映射到 DNS 名称,而不是典型的选择器,例如my-service或者cassandra。 您可以使用spec.externalName参数指定这些服务。

创建 ExternalName 类型的服务的 yaml 如下:

kind: Service
apiVersion: v1
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443type: ExternalNameexternalName: remote.server.url.com


说明:您需要 CoreDNS 1.7 或更高版本才能使用ExternalName类型。

当查找主机 service-python.default.svc.cluster.local时,集群DNS服务返回CNAME记录,其值为my.database.example.com。 访问service-python的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。

将生产工作负载迁移到Kubernetes集群并不容易。大多数我们不可以停止所有服务并在Kubernetes集群上启动它们。有时,尝试迁移轻量且不会破坏你服务的服务是很好的。在此过程中,一个可能不错的解决方案是使用现有的有状态服务(例如DB),并首先从无状态容器开始。

从Pod中访问外部服务的最简单正确的方法是创建ExternalName service。例如,如果您决定保留AWS RDS,但您还希望能够将MySQL容器用于测试环境。让我们看一下这个例子:

kind: Service
apiVersion: v1
metadata:name: test-servicenamespace: default
spec:type: ExternalNameexternalName: test.database.example.com

你已将Web应用程序配置为使用URL测试服务访问数据库,但是在生产集群上,数据库位于AWS RDS上,并且具有以下URL test.database.example.com。创建ExternalName service 并且你的Web Pod尝试访问test-service上的数据库之后,Kubernetes DNS服务器将返回值为test.database.example.com的CNAME记录。问题解决了。

ExternalName service 也可以用于从其他名称空间访问服务。例如:

kind: Service
apiVersion: v1
metadata:name: test-service-1namespace: namespace-a
spec:type: ExternalNameexternalName: test-service-2.namespace-b.svc.cluster.localports:- port: 80

test-service-2。

这个意义在哪里?

ExternalName service 也是一种service,那么ingress controller 会支持,那么就可以实现跨namespace的ingress。

原文链接:https://segmentfault.com/a/1190000023125587

k8s中service类型相关推荐

  1. k8s中Service ClusterIP ping不通?

    一. Service的类型 先来看看<kubernetes权威指南>中对Service类型的介绍: ClusterIP:kubernetes默认会自动设置Service的虚拟IP地址,仅可 ...

  2. K8S中service与controller(控制器)通过标签选择器(selector)匹配pod

    文章目录 1.1 当前k8s的环境 1.2 创建sc名称空间 1.3 通过实践理解 1.4 deployment控制器部署pc-erp-frontend 项目 1.5 daemonset控制器部署m- ...

  3. 【运维面试】k8s中service和ingress的区别

    serivce是如何被设计的: 在pod中运行的容器在动态,弹性的变化(比如容器的重启IP地址会变化),为了给pod提供一个固定的,统一访问的接口,以及负载均衡的能力,并借助DNS系统实现服务发现功能 ...

  4. 记一次k8s中service端口限制在30000-32767问题排查

    问题 今天利用service暴露nodePort端口80报以下错误 he Service "webapp" is invalid: spec.ports[0].nodePort: ...

  5. 关于 Kubernetes中Service使用Metallb实现LoadBalancer的一个Demo

    写在前面 学习K8s中Service遇到,单独整理分享给小伙伴 博文内容涉及: Metallb的创建 LoadBalancer类型的Service的创建 有些人心如花木,皆向阳而生 --烽火戏诸侯&l ...

  6. 『中级篇』k8s的NodePort类型Service以及Label的简单实用(68)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』k8s的NodePort类型Service以及Label的简单实用(68) 上次主要说了service的一种类型,c ...

  7. kubernetes(三)k8s中通信和Service

    目录 1.同一个Pod中的容器通信 2.集群内Pod之间的通信 3 集群内Service-Cluster IP 4.外部服务访问集群中的Pod 4.1 Service-NodePort 4.2.Ser ...

  8. k8s中hostname, hosts文件, DNS和代理问题, service和pod的访问问题

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 验证一个域名的ip地址可以使用 nslookup xx.xx..xx 在kubernets中不同命名空间的服务相互访问 涉及到的是Pod和Servic ...

  9. 副本 K8S中的Service的存在理由,android高级面试题及答案

    k8s群集中的每个节点都运行一个kube-proxy的组件,kube-proxy其实是一个代理层负责实现service userspace模式 客户端访问ServiceIP(clusterIP)请求会 ...

最新文章

  1. Mysql的sql注入_MySQL SQL注入
  2. 将十六进制的字符串转化为UIImage
  3. 六十五、下一个更大的数系列,单调栈解决方法
  4. libaio.so.1 mysql_libaio.so.1()(64bit) is needed by MySQL-server
  5. Golang入门第一天-工具准备
  6. Extjs的数据读取器store和后台返回类型简单解析
  7. H5 下载文件到本地
  8. 伊斯兰教历的计算和各个月的名称
  9. mysql还原数据库非常慢_mysql还原数据库慢
  10. win服务器系统无法切换输入法,win10输入法切换不了怎么办?win10无法切换输入法现象的解决方法...
  11. 计算机辅助设计师考试报考网址,计算机辅助设计师证如何报考?报名入口
  12. Saver类--变量的保存和恢复
  13. 狂妄之人计算机音乐,Undertale音乐 MEGALOVANIA 狂妄之人
  14. 02-FTP文件共享服务
  15. linux多线程_免费Linux下载工具,你还不知道?
  16. 抖音带货平台怎么收费?抖音带货费用有哪些
  17. pe下找不到ssd硬盘_进入pe后找不到固态硬盘怎么解决
  18. LeeCode:救生艇(贪心)
  19. mysql集群 solr_Solr单机部署和集群部署
  20. MinIO历史版本下载

热门文章

  1. python教程哪个版本好-终于清楚python入门最好的教程
  2. 自学python入门-学python入门看什么书
  3. python和c哪个适合入门-关于python和c语言学哪个好
  4. python毕业设计有哪些方向-Python毕业选题档案管理系统 开题报告
  5. python职能-Python岗位职责
  6. c+还是python好-既然C+不如Java、Python,为什么还要学C+?
  7. 学python需要什么-想要学人工智能需要学些什么python的知识
  8. python和c++哪个好找工作-少儿编程学python和C++哪个好
  9. python简单代码input-Python简单程序的练习
  10. python读取文件多行内容-Python逐行读取文件内容的方法总结