Kubernetes 服务发现使用介绍

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Kubernetes 中 Pod 是有生命周期的,每个 Pod 都有属于自己的 IP 地址。 但是当我们创建和删除 Pod 时,它的 IP 地址并不是固定的。那么也就是说,当我们把 Pod 的 IP 提供给前端应用时,服务不可用的几率相当较大。官方说明

Kubernetes 服务发现使用介绍



一、基本介绍


二、Kubernetes 服务发现使用介绍


1.ClusterIP

2.Headless Service

3.NodePort


一、基本介绍



Kubernetes 中 Pod 是有生命周期的,每个 Pod 都有属于自己的 IP 地址。 但是当我们创建和删除 Pod 时,它的 IP 地址并不是固定的。那么也就是说,当我们把 Pod 的 IP 提供给前端应用时,服务不可用的几率相当较大。官方说明


不过呢,Kubernetes 定义了一种 Service 资源,每个 Service 都有一个固定的 VIP 地址。我们可以 通过标签匹配的方式,来将 Service 自动的绑定到合适的 Pod 应用上,并且当我们请求 Service 时,它还会将请求转发到后端的 Pod 应用。


image.png


  1. 每个 node 主机上都会运行 Kube-Proxy 组件,并通过 APIServer 来实时监控 Service 和 Endpoints 服务。
  2. 当用户创建出含有标签选择器的 Service 时,Endpoints 也会随着创建出来,用来存放 Service 匹配到 Pod 的 IP 地址。
  3. Kube-Proxy 监控到 Service 和 Endpoints 发生改变后,将会对 iptables 或 ipvs 进行规则配置(来实现基于四层的路由转发)
  4. 最终,用户通过 Kube-Proxy 提供的路由转发,来实现服务的映射访问。


上面其实是针对于 Pod 应用的,还有一种情况是 Pod 要访问外部的应用,如:现在有三台主机组成的一个 RabbitMQ 集群。此时 Pod 访问其中任意一台主机的 RabbitMQ 服务都是可以的,但是这样的话并没有冗余性。


所以我们可以通过直接 创建出 Service,但不给它配置标签选择器。这样的话,Endpoints 也就不会自动的创建出来。 接下来,我们便可以自定义的来创建 Endpoints,这里我们只需要将 Endpoints 名称和 Service 名称配置成一样的即可。


Service,Endpoints 与 Pod 的关系:


image.png


二、Kubernetes 服务发现使用介绍



[root@k8s-master01 ~]# vim nginx-web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-web
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-web
    image: nginx:1.18.0
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: index
  volumes:
  - hostPath:
      path: /app/nginx/html
    name: index
[root@k8s-master01 ~]# mkdir -p /app/nginx/html && echo "This is Nginx:80" > /app/nginx/html/index.html
[root@k8s-master01 ~]# kubectl create -f nginx-web.yaml


image.png


1.ClusterIP


通过使用 K8s 内部定义的 IP 地址,来实现集群内部的服务访问(因为是在内部定义的,所以在外部并不能直接访问)


[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  type: ClusterIP             # Service 的默认类型
  ports:
  - name: nginx-web
    port: 8080                # Service 的显示端口
    targetPort: 80              # Pod 的服务端口
  selector:
    app: nginx
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml


验证:


image.png


2.Headless Service


无头服务,主要适用于那种不需要 ClusterIP 的服务,通过配置标签选择器,CoreDNS 便可以将 Service 的名称解析到 Pod 应用上。


[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  ports:
  - name: nginx-web
    port: 8080
    targetPort: 80
  clusterIP: "None"
  selector:
    app: nginx
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml


image.png


因为 CoreDNS 组件主要就是用来给 Service 提供一个域名和 IP 的对应解析关系,但是我们这里配置的无头服务,也就是说这个 Service 并没有提供 ClusterIP 地址。所以我们下面解析的时候,直接就解析到 Service 匹配到的 Pod 应用上。


image.png


需要了解的是,当我们配置的是无头服务时,Kube-Proxy 并不会将这个无头服务加入到 iptables 或 ipvs 规则中。不过,我们可以通过在容器内部,以域名的方式去访问。如上图,我们使用 nc 命令判断容器到 nginx-web 域名的连通性是正常的。


3.NodePort


通过在所有的 node 主机上映射一个端口,之后便可以通过任意一台 node 主机的 IP 地址和映射端口 来路由到 Service 上。


[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  type: nodePort
  ports:
  - name: nginx-web
    port: 8080
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml


image.png


Service 除了上面那几种类型,还可以使用 LoadBalancer 和 ExternalName 类型。


  • LoadBalancer:在 NodePort 基础上,通过借助 Cloud Provider(云厂商)来创建外部负载均衡器,并将请求转发到 NodePort 上。
  • ExternalName:用于将集群外部的服务引入到集群内部中,从而达到可以在集群内部直接使用(通过 CoreDNS 实现)


[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  type: ExternalName
  ports:
  - name: nginx-web
    port: 80
    targetPort: 80
    externalName: www.baidu.com
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml


image.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4月前
|
负载均衡 Kubernetes 算法
K8s服务发现与负载均衡的技术探索
【7月更文挑战第15天】K8s通过Service资源对象和kube-proxy组件实现了高效、灵活的服务发现和负载均衡机制。通过合理选择Service类型、优化kube-proxy配置以及使用Ingress进行高级路由,可以确保应用在K8s集群中高效、可靠地运行。随着云原生技术的不断发展,K8s的服务发现和负载均衡机制也将不断完善和优化,为更多场景提供强大的支持。
|
tengine 自然语言处理 Kubernetes
Nacos2.0的K8s服务发现生态应用及规划
Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能。随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社区开始考虑如何提供更加云原生方向的功能和用法。本次分享主要介绍 Nacos 在 2.0 版本在Kubernetes 环境下对服务发现生态的应用探索成果及后续探索方向的规划。
Nacos2.0的K8s服务发现生态应用及规划
|
Kubernetes 负载均衡 安全
K8S | Service服务发现
在K8S集群中是通过Pod组件来部署应用服务,Deployment组件实现Pod编排管理,Service组件实现应用的访问;
264 0
|
域名解析 Kubernetes 网络协议
【k8s】kubernetes的基于coredns的服务发现机制
【k8s】kubernetes的基于coredns的服务发现机制
255 0
|
运维 负载均衡 Kubernetes
基于 Stork 和 Quarkus 扩展 Kubernetes 服务发现
在传统的单体架构中,应用程序已经通过静态主机名、IP 地址和端口知道后端服务的存在位置。IT运维团队为服务可靠性和系统稳定性维护静态配置。自从微服务开始在分布式网络系统中运行以来,其维护发生了显著变化。之所以发生这种变化,是因为微服务需要与多个后端服务进行通信,以提高负载均衡和服务弹性。
132 0
|
Kubernetes 网络协议 Cloud Native
K8S生态之服务发现解析
当前,云原生生态已经成为全球各大厂商以及企业尤其是互联网企业技术选型、场景推广的一个重要参考标准。云原生所代表的技术已经逐渐成为大家的共识,从一个虚无缥缈的概念逐渐演化成众多参与者的下一个技术战略储备。自然而言,承载业务需求的应用架构就会提及到微服务生态体系,以及其中最重要的分布式协作模式——“Service Discovery”,即:服务发现。
197 0
|
存储 缓存 Kubernetes
Dubbo-kubernetes 基于Informer服务发现优化之路
在 Kubernetes(简称 K8S,一个可移植容器的编排管理工具)体系中,etcd 存储集群的数据信息,kube-apiserver作为统一入口,任何对数据的操作都必须经过 kube-apiserver。因此 Dubbo 想要以 Kubernetes 作为注册中心,必须调用 kube-apiserver 获取服务地址列表,那是以什么样的机制保持信息的可靠性、实时性、顺序性、高性能呢?答案就是基于List/Watch的Informer组件。
Dubbo-kubernetes 基于Informer服务发现优化之路
|
缓存 Kubernetes 监控
Dubbo3 基于 Kubernetes Informer 的服务发现原理解析
## List/Watch 机制介绍 List/Watch机制是Kubernetes中实现集群控制模块最核心的设计之一,它采用统一的异步消息处理机制,保证了消息的实时性、可靠性、顺序性和性能等,为声明式风格的API奠定了良好的基础。 `list`是调用`list API`获取资源列表,基于`HTTP`短链接实现。 `watch`则是调用`watch API`监听资源变更事件,基于`HTTP
524 0
Dubbo3 基于 Kubernetes Informer 的服务发现原理解析
|
域名解析 缓存 Prometheus
Kubernetes 集群 DNS 服务发现原理
本文介绍 Kubernetes 集群中 DNS 服务发现原理。
14510 0
|
Perl 容器 Kubernetes
从零开始入门 | Kubernetes 中的服务发现与负载均衡
作者 | 阿里巴巴技术专家  溪恒 一、需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机器的 IP 地址。