k8s之Service类型详解

1.ClusterIP 类型

2.NodePort 类型

3.LoadBalancer 类型

4.ExternalName 类型

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

例如,以下 Service 定义将 prod 名字空间中的 my-service 服务映射到 my.database.example.com:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

说明:
type: ExternalName 的服务接受 IPv4 地址字符串,但将该字符串视为由数字组成的 DNS 名称, 而不是 IP 地址(然而,互联网不允许在 DNS 中使用此类名称)。 类似于 IPv4 地址的外部名称无法

被 DNS 服务器解析。

如果你想要将服务直接映射到某特定 IP 地址,请考虑使用无头服务。

当查找主机 my-service.prod.svc.cluster.local 时,集群 DNS 服务返回 CNAME 记录, 其值为 my.database.example.com。访问 my-service 的方式与访问其他 Service 的方式相同, 主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发来完成。 如果后来你决定将数据库移到集群中,则可以启动其 Pod,添加适当的选择算符或端点并更改 Service 的 type。

注意:

针对 ExternalName 服务使用一些常见的协议,包括 HTTP 和 HTTPS,可能会有问题。 如果你使用 ExternalName 服务,那么集群内客户端使用的主机名与 ExternalName 引用的名称不同。

对于使用主机名的协议,这一差异可能会导致错误或意外响应。 HTTP 请求将具有源服务器无法识别的 Host: 标头; TLS 服务器将无法提供与客户端连接的主机名匹配的证书。

实战场景1:

假设你在集群外有一个数据库服务,地址为db.external.com,端口是3306(MySQL的默认端口)。你希望在集群内部用一个类似mysql.default.svc.cluster.local 的域名来访问它。

bash 复制代码
kubectl apply -f << EOF
apiVersion: v1
kind: Service
metadata: 
  name: mysql
  namespace: default
spec:
  type: ExternalName
  externalName: db.external.com
EOF

一旦创建完成,在集群内的Pod可以通过DNS名称mysql.default.svc.cluster.local或者mysql来访问

bash 复制代码
kubectl run test-pod --rm -it --image=busybox -- /bin/sh

然后访问:

bash 复制代码
nslookup mysql
telnet mysql 3306

应该可以看到DNS解析指向db.external.com

实战场景2:

假如你有一个应用程序AppA部署在命名空间aa中,服务名为servicea。

现在计划将AppA迁移到新的命名空间bb中,但是你希望在迁移的过程中,其他应用仍然能通过原有的

servicea访问AppA,以避免服务中断。

在aa命名空间中创建一个ExternalName的Service,将流量指向新的B命名空间的servicea

步骤:

1.在bb命名空间部署AppA和对应的servicea服务。

2.在aa命令空间创建ExternalName的Service。

bash 复制代码
kubectl apply -f << EOF
apiVersion: v1
kind: Service
metadata: 
  name: servicea
  namespace: aa
spec:
  type: ExternalName
  externalName: servicea.bb.svc.cluster.local
EOF

总结:

1.端口信息不可配置:ExternalName 类型的服务本身不会定义端口,所以需要你在Pod中直接访问目标主机的端口。

2.仅支持TCP流量:因为它本质是DNS CNAME映射,所以主要适用TCP协议。

3.安全性: 你仍需要自己处理认证、证书等安全问题。

相关推荐
阿里云云原生1 小时前
关于 DeepSeek 的 SuperAgent,以及我们的实践
云原生·agent
mengge.cloud2 小时前
prometheus+k8s+弹性伸缩,综合项目
云原生·容器·kubernetes·prometheus
Z21-X3 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
xbzb6 小时前
从零容器化部署 ECShop:Harbor 私有仓库 + 自定义 PHP 镜像 + LNMP 三容器
容器·php·harbor·镜像·仓库·ecshop
那明眸似水7 小时前
云原生项目三:Docker秒级启动NextCloud个人网盘存储办公系统
linux·运维·docker·云原生·容器
腾飞开源7 小时前
03_Kubernetes 核心概念拆解:从 Spec/Status 收敛到工作负载控制器的设计逻辑
云原生·容器·kubernetes
知已难寻18 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
xbzb1 天前
镜像到底存在哪:/var/lib/docker 的四级映射与 daemon.json 配置
docker·容器·json·镜像·daemon.json·四级
阿里云云原生1 天前
生产更可信,订阅更耐用丨Higress 社区进展报告
云原生
阿里云云原生1 天前
如何用 STAROps Elasticsearch 智能助手看穿“搜索变慢”
云原生