一、简介

externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,你可以提供集群内的名字,比如mysql.db.svc这样的建立在db命名空间内的mysql服务,也可以指定http://mysql.example.com这样的外部真实域名。

二、域名方式

ExternalName类型Service实例

例如,以下 Service 定义将 dev 名字空间中的 search 服务映射到 www.baidu.com

# baidu.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Service
metadata:
name: baidu
namespace: dev
spec:
type: ExternalName
externalName: www.baidu.com

使用如下命令创建资源

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

创建成功如下

[root@master ~]# kubectl get all -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/baidu ExternalName <none> www.baidu.com <none> 3d4h
[root@master ~]#

本次我们创建2个客户端pod用来测试,一个在dev命名空间,一个在默认命名空间下

# pod1.yaml

apiVersion: v1
kind: Pod
metadata:
name: centos7-pod
namespace: dev
spec:
containers:
- name: centos7-container
image: centos:7
command: ["/bin/bash"]
args: ["-c", "sleep infinity"]
# pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: centos7-pod
# namespace: baidu
spec:
containers:
- name: centos7-container
image: centos:7
command: ["/bin/bash"]
args: ["-c", "sleep infinity"]

创建资源如下

[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
centos7-pod 1/1 Running 0 100s
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
centos7-pod 1/1 Running 0 10m
[root@master ~]#

首先进入相同命名空间dev下的centos7 pod下,测试 externalName 类型 service DNS 服务发现

Kubernetes DNS 服务器是唯一的一种能够访问 ExternalName 类型的 Service 的方式

如果你在 Kubernetes 命名空间 dev 中有一个名为 my-service 的 Service, 则控制平面和 DNS 服务共同为 my-service.my-ns 生成 DNS 记录。 名字空间 my-ns 中的 Pod 应该能够通过按名检索 <service_name>、<service_name>.、.<service_name>.svc.cluster.local 来找到服务,如果不是同一个命名空间,则只能采用.<service_name>.svc.cluster.local 访问。

进入默认defaluts命名空间下的pod测试,由于不在同一个ns,所以DNS无法直接通过servicename去解析。

还可以安装DNS解析工具进行测试

yum install bind-utils
nslookup baidu

三、IP方式

其中一个常见场景是在集群外部托管自己的数据库,例如在 Google 计算引擎实例中。如果您在 Kubernetes 内部和外部分别运行一些服务,或者需要在 Kubernetes 允许的基础上获得更多定制或控制,通常可采用上述这种方式。

在本例中,已经创建Mysql 三主机集群环境:192.168.2.129、192.168.2.145、192.168.2.135

现在我们有了 IP 地址,那么第一步就是创建服务:

# mysql.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
ports:
- nodePort: 31760
port: 27017 # service 端口
protocol: TCP
targetPort: 3306 # pod端口

您可能会注意到此服务没有 Pod 选择器。此操作将创建一个服务,但它不知道往哪里发送流量。这样一来,您可以手动创建一个将从此服务接收流量的 Endpoints 对象。

# mysql-point.yaml
kind: Endpoints
apiVersion: v1
metadata:
name: mysql
subsets:
- addresses:
- ip: 192.168.2.129
ports:
- port: 3306

您可以看到 Endpoints 手动定义了数据库的 IP 地址,并且使用的名称与服务名称相同。Kubernetes 将 Endpoints 中定义的所有 IP 地址视为与常规 Kubernetes Pod 一样。

k8s之ExternalName使用的更多相关文章

  1. k8s系列---Service之ExternalName用法

    需求:需要两个不同的namespace之间的不同pod可以通过name的形式访问 实现方式: A:在其他pod内ping [svcname].[namespace] ping出来到结果就是svc的ip ...

  2. Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

    Kubernetes简介 Kubernetes是Google基于Borg开源的容器编排调度引擎,作为CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的 ...

  3. k8s的基本使用

    一.kubectl的命令参数 1)kubectl 能使用的命令.即查看帮助 [root@k8s6 ~]# kubectl kubectl controls the Kubernetes cluster ...

  4. k8s对接ceph存储

    前提条件:已经部署好ceph集群 本次实验由于环境有限,ceph集群是部署在k8s的master节点上的 一.创建ceph存储池 在ceph集群的mon节点上执行以下命令: ceph osd pool ...

  5. 对k8s service的一些理解

    服务service service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务 举个例子一个a服务运行3个pod,b服务怎么访问a服务的pod, ...

  6. K8s基于DNS的服务发现(转)

    原文地址:https://www.oschina.net/question/2657833_2201246 1.Kubernetes中如何发现服务 ◆   发现Pod提供的服务 首先使用nginx-d ...

  7. Kubernetes(k8s)底层网络原理刨析

    目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...

  8. k8s之Service资源

    1.Service概述 service是kubernetes中最核心的资源对象之一,service和pod之间是通过Label串起来,相同的Service的pod的Label是一样的.同一个servi ...

  9. k8s学习笔记

    9.deployment:声明式的升级应用 9.1.使用RC实现滚动升级 #kubectl rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v ...

  10. k8s~k8s里的服务Service

    k8s用命名空间namespace把资源进行隔离,默认情况下,相同的命名空间里的服务可以相互通讯,反之进行隔离. 服务Service 1.1 Service Kubernetes中一个应用服务会有一个 ...

随机推荐

  1. Linux input 子系统详解

    1. 模块概述 1.1.相关资料和代码研究 drivers/input/ include/uapi/linux/input-event-codes.h 2. 模块功能 linux核心的输入框架 3. ...

  2. Nuitka打包

    Nuitka打包PySide6/PyQt 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 文章目录 Nuitka打包PySide6/PyQt 一.需要C++编译器 二.安装Nuitka 三. ...

  3. LaTeX 编译 acmart 文档报错:No country present for an affiliation.

    在编译一篇从 arXiv 下载的文档时遇到如下错误: Class acmart Error: No country present for an affiliation. 有两种解决方案: 将错误降级 ...

  4. 非常简易的SpringBoot后台项目

    非常简易的SpringBoot后台项目 1. 创建项目 使用IDEA创建 Spring项目,或在 https://start.spring.io/ . https://start.aliyun.com ...

  5. 2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。 在筛选过程中,每轮选择一个孩子时,所有尚未选

    2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子. 在筛选过程中,每轮选择一个孩子时,所有尚未选 ...

  6. Encoder-Decoder、Seq2Seq、Attention

    Encoder-Decoder.Seq2Seq.Attention 传送门1:Encoder-Decoder 和 Seq2Seq 因为注意力不集中,所以这篇随笔就是看别人的文章,随手参考写写的. 1. ...

  7. Dart 2.12 现已发布

    作者 / Michael Thomsen Dart 2.12 现已发布,其中包含 健全的空安全 和 Dart FFI 的稳定版.空安全是我们最新主打的一项生产力强化功能,意在帮助您规避空值错误,以前这 ...

  8. AD域下,普通用户环境下安装软件需要管理员权限的解决办法

    原理:将AD域普通用户添加到管理组中,使其拥有管理员权限 做法: 1.切换到AD域管理员账户: 2.计算机 -> 管理 -> 用户和组 -> 组 -> Administrato ...

  9. 图片 电力电网行业IT运维方案

    智能电网背景下,电力.电网企业信息化逐渐渗透到其业务链的各个环节,云计算.物联网.移动互联网等新技术的应用,更驱动信息化与业务创新深度融合.电力.电网企业集团信息系统群逐渐朝着一体化方向发展,信息链越 ...

  10. WPF下使用FreeRedis操作RedisStream实现简单的消息队列

    Redis Stream简介 Redis Stream是随着5.0版本发布的一种新的Redis数据类型: 高效消费者组:允许多个消费者组从同一数据流的不同部分消费数据,每个消费者组都能独立地处理消息, ...