首页 > 其他分享 >Kubernetes ExternalName类型的服务

Kubernetes ExternalName类型的服务

时间:2024-05-31 10:45:31浏览次数:26  
标签:服务 Kubernetes service Service dev ExternalName DNS 类型

1、概述

  在《Kubernetes Headless服务》这篇博文中对Kubenertes Service资源类型进行了概述并详细介绍了Headless服务,通过这篇博文我们可以知道Service一般分为3种类型:ClusterIP、NodePort、LoadBalancer,唯独对 ExternalName 置若罔闻,本文将详细介绍Kubernetes ExternalName类型的服务。

  ExternalName Service是Kubernetes中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把服务请求透明地重定向到指定的DNS名称,无论该名称指向的是外部服务还是集群内的其他服务,例如第三方 API 服务、外部数据库,或跨命名空间的内部服务。在配置上,只需将 Service 的 type 设置为 ExternalName 并指定 externalName 字段即可。ExternalName Service 简化了对不同 DNS名称资源的访问配置,使得服务依赖的地址变化对集群内的应用透明,但不提供负载均衡和服务发现功能。

2、工作机制

  • 当访问 ExternalName Service 时,Kubernetes 的 DNS 解析返回一个 CNAME 记录。
  • 这个 CNAME 记录将请求重定向到指定的 DNS 名称,从而实现服务的透明重定向。

知识普及:DNS  CName(CanonicalName)记录,简称CNAME记录。也叫别名级联,如同给人起的外号一样,小名一样,如你的名字:叫张小明,你家人叫你小明,也是指的是你。

  CNAME也被称为规范名字。CNAME记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。例如,有一台计算机名为“host.pt6.cn”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个cname别名(CNAME):WWW和MAIL。 这两个别名的全称就是“ www.pt6.cn”和“mail.pt6.cn” 。实际上他们都指向“host.pt6.cn”。 同样的方法可以用于当您拥有多个域名需要指向同一服务器IP,此时您就可以将一个域名做A记录DNS解析指向服务器IP然后将其他的域名做cname记录别名到之前做A记录的域名上,那么当您的服务器IP地址变更时您就可以不必麻烦的一个一个域名更改指向了,只需要更改做A记录DNS解析的那个域名,而其他做cname别名DNS解析的那些域名的指向也将自动更改到新的IP地址上了。

 

3、配置

  • 通过 spec.type 字段设置为 ExternalName,并在 spec.externalName 字段中指定目标 DNS 名称。
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  type: ExternalName
  externalName: my.external.service.com

  在这个示例中,my-service 是一个 ExternalName Service,它将请求重定向到 my.external.service.com

4、示例

编辑external_name.yaml文件如下:

apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Service
metadata:
  name: search
  namespace: dev
spec:
  type: ExternalName
  externalName: www.baidu.com

使用如下命令创建资源:

[root@master service]# kubectl apply -f external_name.yaml
namespace/dev created
service/search created

查看资源如下:

[root@master service]# kubectl get service -n dev
NAME     TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)   AGE
search   ExternalName   <none>       www.baidu.com   <none>    11s

此时,在集群内部的pod中就可以通过 search.dev.svc.cluster.local 访问www.baidu.com了,下面验证一下,首先登录一个pod查看 /etc/resolve.conf:

[root@master service]# kubectl exec -it pod/pc-deployment-6gdc5bf56c-9bg6w -n dev /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@pc-deployment-5ffc5bf56c-9bg6w:/#
root@pc-deployment-5ffc5bf56c-9bg6w:/# cat /etc/resolv.conf
nameserver 10.96.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

然后使用dig命令验证:

[root@master service]# dig @10.96.0.10 search.dev.svc.cluster.local

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.96.0.10 search.dev.svc.cluster.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62861
;; flags: qr aa rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;search.dev.svc.cluster.local.  IN      A

;; ANSWER SECTION:
search.dev.svc.cluster.local. 30 IN     CNAME   www.baidu.com.
www.baidu.com.          30      IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       30      IN      A       110.242.68.3
www.a.shifen.com.       30      IN      A       110.242.68.4

;; Query time: 5 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Wed Apr 06 23:48:14 CST 2022
;; MSG SIZE  rcvd: 219

5、使用场景 

  • 外部资源访问: 将集群内服务请求重定向到外部资源,例如第三方 API 服务、外部数据库等。

  • 内部资源访问: 在多集群或多命名空间环境中,将服务请求重定向到不同命名空间或不同集群内的服务。

  • 服务迁移与重构: 在服务迁移过程中,临时将请求重定向到新的服务地址,确保服务的连续性和透明性。

6、总结

  ExternalName Service 是 Kubernetes 中一种灵活的服务类型,通过 DNS CNAME 机制将请求重定向到指定的 DNS 名称。它适用于需要透明地访问外部或内部 DNS 资源的场景,简化了服务访问配置,使得服务依赖的地址变化对应用透明。

标签:服务,Kubernetes,service,Service,dev,ExternalName,DNS,类型
From: https://www.cnblogs.com/zhangmingcheng/p/18224014

相关文章

  • 32.MySQL数据库【二】存储引擎与基本数据类型.
    【一】MySQL之存储引擎1)介绍针对不同的数据有不同的处理机制,存储引擎就是不同的处理机制2)MySQL主要的存储引擎1.innodb是MySQL5.5版本之后的默认存储引擎支持事务、外锁、外键2.myisam是MySQL5.5版本之前的默认存储引擎速度比innodb快,但数据安全性较弱3.memory......
  • Kubernetes StatefulSet 扩缩容与升级
    KubernetesStatefulSet扩缩容与升级StatefulSet扩容kubectlscalestsstateful-set-web--replicas=5root@k8s-master1:~#kubectlgetpods--watch-lapp=pod-nginxNAMEREADYSTATUSRESTARTSAGEstateful-set-web-01/1Runnin......
  • Kubernetes 硬盘持久化之 StorageClass
    Kubernetes硬盘持久化之StorageClassStorageClass定义StorageClass为管理员提供了描述存储"类"的方法。不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。这个类的概念在其他存储系统中有时被称为"配置文件"。每个StorageClass......
  • 三十二、openlayers官网示例解析Draw lines rendered with WebGL——使用WebGL动态修
     官网demo地址:DrawlinesrenderedwithWebGL这个示例展示了如何用webgl渲染矢量图形并动态修改点、线属性。首先先把基本的地图加载上去initMap(){this.map=newMap({layers:[newTileLayer({source:newXYZ({......
  • 在kubernetes里使用seccomp限制容器的系统调用
    目录一.系统环境二.前言三.系统调用简介四.使用seccomp限制docker容器系统调用五.在kubernetes里使用seccomp限制容器的系统调用5.1配置seccomp允许pod进行所有系统调用5.2配置seccomp禁止pod进行所有系统调用5.3配置seccomp允许pod进行50个系统调用六.总结一.系统环境本文主......
  • 结构体类型一(C语言)
    前言Hello,小伙伴们,好久不见我又来了,今天我将着重介绍结构体相关的知识,还是老话,如果你喜欢我的内容的话,请不要忘了,点赞,收藏,评论哟,万分感谢!!在实际编程过程中,我们可能会希望把一些关联的数据存放在一起,这样方便我们使用。但是这些数据的类型有时候并不一致,例如一个学生的信息:有......
  • C#与C++类型对应关系总结
    另:在进行string转换时,需要加入前缀[MarshalAs(UnmanagedType.LPStr)]lpdword对应于refint C#调用DLL文件时参数对应表  C++中的DLL函数原型为extern"C"__declspec(dllexport)bool方法名一(constchar*变量名1,unsignedchar*变量名2)extern"C"__d......
  • 多模态模型的演进和四种主流架构类型
    机器学习中的多模态领域近年来取得了显著进展。能够处理图像、音频或视频以及文本(语言)的模型显著增多,特别是在Transformer模型的帮助下。我们对现在的多模态按照架构模式分为四类:A、B、C、D。A和B类型在模型内部层中深度融合多模态输入,可以实现细粒度控制模态信息流动,但需要大......
  • 这种嵌套字典类型的数据,我想把它读取到df里,如何操作?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【WYM】问了一个Pandas处理的问题,提问截图如下:原始数据:temp=dict()temp[64001]={64002:1.0,64003:1.0,64004:1.0,}temp[64002]={64001:1.0,64003:1.0,64004:1.0,}期待的结果:64001{64002:1.0,6......
  • 获取集合成员的联合类型
    给定一个具有联合成员的Set类型:typeMySet=Set<"foo"|"bar">;如何为其成员提取一个联合类型,就像这样:typeMySetMembers="foo"|"bar";......