网站优化公司电话,cms搭建网站,网站建设推广顾问是什么意思,重庆企业服务建站网站开发简介
K8s 中的Service是一种抽象#xff0c;用于定义一组Pod的逻辑集合#xff0c;并为它们提供统一的网络入口。Service充当了Pod的负载平衡器和服务发现器#xff0c;为应用程序提供了稳定的网络地址#xff0c;使得应用程序可以访问与之关联的Pod而无需了解其具体的IP地…简介
K8s 中的Service是一种抽象用于定义一组Pod的逻辑集合并为它们提供统一的网络入口。Service充当了Pod的负载平衡器和服务发现器为应用程序提供了稳定的网络地址使得应用程序可以访问与之关联的Pod而无需了解其具体的IP地址或端口。
Service特点和功能 稳定的网络地址Service为一组Pod提供了一个虚拟IP地址ClusterIP这个地址是稳定的不受后端Pod的变化影响。应用程序可以通过Service的虚拟IP地址来访问与之关联的Pod。 负载平衡Service可以将传入的请求分发到与之关联的多个Pod中实现负载平衡从而提高应用程序的可用性和性能。 服务发现Service充当了服务发现器的角色使得其他应用程序或服务可以通过Service名称来发现和访问它所代表的后端Pod。 多种类型Kubernetes支持多种类型的Service包括ClusterIP、NodePort、LoadBalancer和ExternalName等每种类型适用于不同的场景和需求。 选择器匹配Service通过标签选择器Selectors来确定与之关联的Pod集合。只有具有特定标签的Pod才会被Service选中。 会话关联可选的会话关联Session Affinity功能可以确保将来自同一客户端的请求路由到相同的后端Pod以维护会话状态。
总之Service 是 Kubernetes 中一种非常重要的资源它提供了一种抽象和统一的方式来公开应用程序并实现负载均衡和服务发现从而简化了微服务架构中的网络管理和通信。
创建 Service
例如假定有一组 Pod每个 Pod 都在侦听 TCP 端口 9376并且它们还被打上 app.kubernetes.io/nameMyApp 标签。你可以定义一个 Service 来发布该 TCP 侦听器。
apiVersion: v1
kind: Service # 指定了资源的类型这里是Service。
metadata: # 指定了Service的元数据包括标签和名称。labels: # 指定了一组标签这里有一个标签run: redisrun: redisname: my-service # 指定了Service的名称这里是 my-service
spec: # 指定了Service的规格包括端口、选择器、会话关联等。internalTrafficPolicy: Cluster # 指定了内部流量策略这里设置为Cluster表示只使用集群内部的流量。ipFamilies: # 指定了IP族这里设置为IPv4表示只使用IPv4地址。- IPv4ipFamilyPolicy: SingleStack # 指定了IP族策略这里设置为SingleStack表示只使用单一的IP族。ports: # 指定了Service监听的端口和转发的目标端口。- port: 80 # 指定了Service监听的端口这里是80。protocol: TCP # 指定了协议这里是TCP。targetPort: 6379 # 指定了转发的目标端口也就是后端pod 端口这里也是80。selector: # 指定了Service所选择的Pod的标签这里选择了带有run redis 标签的 Pod。run: redissessionAffinity: None # 指定了会话关联的策略这里设置为None表示不启用会话关联type: ClusterIP # 指定了Service的类型这里是ClusterIP表示Service只在集群内部可访问。这个Service将流量从集群内部的80端口转发到具有run: redis 标签的Pod并且只使用IPv4地址。Service 能够将任意入站 port 映射到某个 targetPort。 默认情况下出于方便考虑targetPort 会被设置为与 port 字段相同的值。
端口定义
Pod 中的端口定义是有名字的你可以在 Service 的 targetPort 属性中引用这些名字。 例如我们可以通过以下方式将 Service 的 targetPort 绑定到 Pod 端口
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app.kubernetes.io/name: proxy
spec:containers:- name: nginximage: nginx:stableports:- containerPort: 80name: http-web-svc---
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app.kubernetes.io/name: proxyports:- name: name-of-service-portprotocol: TCPport: 8080targetPort: http-web-svc # 后端 pod 端口的名字 也可以写80端口Service 的默认协议是 TCP除此之外还有 UDP SCTP两种协议。
EndpointSlices
EndpointSlice 是 Kubernetes 1.16 引入的新概念用于解决 Endpoints 对象过大的问题。EndpointSlice 将一个服务的终端信息分成多个小的片段Slice每个片段包含一部分后端 Pod 的信息。每个 EndpointSlice 对象都包含了一部分服务终端的 IP 地址和端口信息以及与之相关联的标签和条件信息。EndpointSlice 可以更有效地管理大规模服务减少对 Kubernetes API Server 的压力并提高服务发现的性能。
使用EndpointSlice的建议
对于普通的服务发现和负载均衡需求通常只需关注 Endpoints 即可。当处理大型服务或大规模集群时EndpointSlice 可以提供更好的性能和可伸缩性。大多数情况下不需要直接操作 EndpointSlice因为 Kubernetes 会自动管理它们。默认情况下控制面创建和管理的 EndpointSlice 将包含不超过 100 个端点。 你可以使用 kube-controller-manager 的 --max-endpoints-per-slice 标志设置此值最大值为 1000。
总的来说Endpoints 和 EndpointSlice 都是 Kubernetes 中用于表示服务终端的重要资源它们提供了服务发现和负载均衡的功能但 EndpointSlice 更适用于处理大规模服务和大型集群。
查看 EndpointSlice
# 查看 endpointslice 资源
kubectl get endpointslice# 查看 endpointslice 自动生成的yaml文件
kubectl get endpointslice -oyamlendpointslice的yaml文件介绍
addressType: IPv4 # 指定了终端的地址类型这里是IPv4
apiVersion: discovery.k8s.io/v1 # 指定了资源的API版本
endpoints: # 包含了服务终端的详细信息每个元素表示一个终端
- addresses: # 指定了后端 Pod 的IP地址- 172.21.231.188conditions: # 包含了终端的状态条件例如是否就绪、正在服务、是否终止等ready: trueserving: trueterminating: falsenodeName: node02 # 指定了运行该终端的节点名称targetRef: # 指定了与终端相关联的目标资源例如Podkind: Pod # 资源类型为Podname: php-apache-7d4456444b-8t2bz # 代理的后端Pod名字
kind: EndpointSlice # 指定了资源的类型为EndpointSlice
metadata: # 包含了资源的元数据信息generateName: php-apache- # 指定了资源的生成名称generation: 13 # 指定了资源的生成数labels: # 资源的标签信息用于标识和分类资源endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.iokubernetes.io/service-name: php-apacherun: php-apachename: php-apache-6mzj5 # 指定了资源的名称ownerReferences: # 指定了资源的所有者引用例如与之关联的Service- apiVersion: v1blockOwnerDeletion: truecontroller: truekind: Servicename: php-apache
ports: # 指定了服务终端监听的端口信息
- name: port: 80protocol: TCPEndpoints
在 K8S 中Endpoints 是一种 API 资源用于表示一个服务的终端即该服务所关联的后端 Pod 的网络地址信息。当创建一个 Service 对象时K8S 会自动创建相应的 Endpoints 对象用于存储该服务的后端 Pod 的 IP 地址和端口信息。
Endpoints 主要用于以下几个方面
服务发现Endpoints 提供了一种机制使得其他应用程序或服务可以发现和访问与之关联的后端 Pod。通过查询 Endpoints应用程序可以获取到与之关联的所有后端 Pod 的 IP 地址和端口信息并与其进行通信。负载均衡当一个服务与多个 Pod 关联时K8S 会自动在 Endpoints 中存储这些 Pod 的地址信息。Service 对象会将请求转发到与之关联的所有 Pod 中从而实现负载均衡的效果。服务代理可以使用Endpoints yaml文件手动修改代理除K8S自己以外的服务。
Endpoints yaml文件介绍
查看方法
kubectl get endpoints php-apache -oyamlapiVersion: v1 # 指定了 Kubernetes API 的版本
kind: Endpoints # 指定了资源类型为 Endpoints
metadata: # 包含了资源的元数据信息包括标签和名称labels:run: php-apachename: php-apache # 资源名字
subsets: # 包含了终端的子集信息每个子集表示一组后端 Pod
- addresses: - ip: 172.21.231.188 # 后端Pod地址nodeName: node02 # Pod 运行在在那个节点上targetRef:kind: Pod # 后端代理的资源类型name: php-apache-7d4456444b-8t2bz # 代理的Pod名字ports:- port: 80 # 指定代理后端 Pod 的端口号protocol: TCP # 指定协议使用Endpoints 代理K8S外部服务
例如使用 Endpoints 外部nginx服务具体配置如下
---
apiVersion: v1
kind: Service
metadata:labels:k8s-app: web-nginx # 标签必须和下面的Endpoints标签一致name: web-nginx # Service 名字必须和下面Endpoints 名字一直
spec:ports:- name: http # ports 名字必须和下面一致port: 8080 # Service 自己的端口按需修改protocol: TCP # 协议按需修改targetPort: 80 # 代理外部服务端口必须和Endpoints的端口一致sessionAffinity: None # 是否建立回话关联type: ClusterIP # 服务类型
---
apiVersion: v1
kind: Endpoints
metadata:labels:k8s-app: web-nginx # 标签和上面一致name: web-nginx # 名字和上面一致
subsets:
- addresses: # 需要代理外部的服务地址 有几个就写几个- ip: 192.168.1.161
# - ip: 192.168.1.207
# - ip: 192.168.1.251ports:- name: http # post 名字和上面一致port: 80 # 端口和外部服务的端口一致和上面的端口一致protocol: TCP # 和上面一致修改好以后创建
按照我这个配置正常情况下肯定是可以代理外部服务了这样代理外部服务主要是为了统一所有环境的配置文件。
kubectl create -f web-nginx.yaml使用 Service 代理外部域名
使用 Service 代理百度域名 肯定能代理成功但是百度不允许跨域访问。
apiVersion: v1
kind: Service
metadata:labels:app: web-nginxname: web-nginx
spec:type: ExternalNameexternalName: www.baidu.comService 常用类型
ClusterIP
通过集群的内部 IP 公开 Service选择该值时 Service 只能够在集群内部访问。 这也是你没有为服务显式指定 type 时使用的默认值。
示例
apiVersion: v1
kind: Service
metadata:labels:run: php-apachename: php-apache
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: php-apachetype: ClusterIP # 不指定类型默认是 ClusterIPNodePort
通过每个节点上的 IP 和静态端口NodePort公开 Service。 为了让 Service 可通过节点端口访问Kubernetes 会为 Service 配置集群 IP 地址 相当于你请求了 type: ClusterIP 的服务。
示例
apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: NodePortselector:app.kubernetes.io/name: MyAppports:# 默认情况下为了方便起见targetPort 被设置为与 port 字段相同的值。- port: 80targetPort: 80# 可选字段# 默认情况下为了方便起见Kubernetes 控制平面会从某个范围内分配一个端口号#默认30000-32767nodePort: 30007 # NodePort 可以自己指定端口不指定的话就是随机端口K8S 默认的端口范围是30000-32767可以自己修改 二进制方式部署的修改apiserver启动文件即可 –service-node-port-range30000-32767
vim /usr/lib/systemd/system/kube-apiserver.servicekubeadm 方式部署的修改这个文件夹下面 /etc/kubernetes/ 找到kube-apiserver.yaml 有关的文件修改即可 参数都是一样的。
LoadBalancer
用于将外部流量均衡地分发到集群中的后端 Pod。LoadBalancer 在云提供商如AWS、阿里云腾讯云等上创建一个负载均衡器并将该负载均衡器配置为将流量路由到 Kubernetes 集群中的 Service。这使得应用程序可以通过公共 IP 地址或 DNS 名称访问 Kubernetes 集群中的服务。
示例
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app.kubernetes.io/name: MyAppports:- protocol: TCPport: 80targetPort: 9376clusterIP: 10.0.171.239type: LoadBalancer
status:loadBalancer:ingress:- ip: 192.0.2.127如要设置内部负载均衡器请根据你所使用的云平台为 Service 添加以下注解之一
阿里云
metadata:annotations:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet百度云
metadata:name: my-serviceannotations:service.beta.kubernetes.io/cce-load-balancer-internal-vpc: true腾讯云
metadata:annotations:service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxAWS
metadata:name: my-serviceannotations:service.beta.kubernetes.io/aws-load-balancer-internal: trueExternalName
将服务映射到 externalName 字段的内容例如映射到主机名 api.foo.bar.example。 该映射将集群的 DNS 服务器配置为返回具有该外部主机名值的 CNAME 记录。
示例
## 代理外部域名就是用的这个类型
apiVersion: v1
kind: Service
metadata:name: my-servicenamespace: prod
spec:type: ExternalNameexternalName: my.database.example.com无头ServiceHeadless Services
无头服务K8S中一种特殊类型的服务与普通的服务类型如ClusterIP、NodePort、LoadBalancer不同它并不分配 ClusterIP也不会代理流量到任何后端 Pod。相反它的主要目的是为了服务发现通过 DNS 记录提供了服务的所有 Pod 的 IP 地址列表。这样应用程序可以直接通过 Pod 的 IP 地址来访问服务而不需要经过 Kubernetes 的服务代理。
由于无头服务提供了每个 Pod 的直接 IP 地址因此它通常用于运行有状态应用程序如数据库、缓存
示例
apiVersion: v1
kind: Service
metadata:name: mysqllabels:app: mysqlapp.kubernetes.io/name: mysql
spec:ports:- name: mysqlport: 3306clusterIP: None # 类型设置为noneselector:app: mysql查询 DNS 记录 使用 Pod 内置的 DNS 解析功能可以通过无头服务的 DNS 名称来获取所有后端 Pod 的 IP 地址列表。例如通过查询 my-headless-service.namespace.svc.cluster.local 可以获取到所有与 my-headless-service 服务关联的 Pod 的 IP 地址列表。