一、简介

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. 关于EF延时加载的面试题

    public async Task<ActionResult> GetData() { var data = (from leftdata in GetLeft() join rightd ...

  2. Python开发中,日期时间的相关处理

    在Python开发中,日期和时间处理是一个常见的需求.Python提供了多种模块和方法来处理日期和时间,以下是一些常用的模块和操作.通过介绍一些系统的Python类库以及第三方的类库,我们可以快速的实 ...

  3. ai识图测试

    var code = "9392b629-0d84-43ef-9b0f-34740fb024a6"

  4. java_父类子类

    private 只有自身能访问自身 自身 同包子 不同包子类 同包类 其他类 可以访问 不能继承 不能继承 不能访问 不能访问 package/friendly/default == 不写 自身 同包 ...

  5. Maven 配置程序入口

    配置单个程序入口 Exec Maven Plugin 插件允许你在 Maven 生命周期中的某个阶段直接运行 Java 类. 在你的 pom.xml 文件中添加如下配置: <project> ...

  6. 一篇文章讲清楚Java中的反射

    介绍 每个类都有一个 Class 对象,包含了与类有关的信息.当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象. 类加载相当于 Class 对象的加载.类在第 ...

  7. Docker网络下-自定义网络实战

    通过前面两篇的学习,我们对docker网络及四大网络类型都了解了.本文,咱们就来学习docker的自定义网络.我们为什么需要自定义网络呢?是为了让各个主机分门别类,井井有条.方便关联,使得网络之间可以 ...

  8. openFile(/tmp/spring.log,true) call failed. java.io.FileNotFoundException: /tmp/spring.log (Permission denied)

    ERROR [main] SpringApplication: Application run failed java.lang.IllegalStateException: Logback conf ...

  9. JavaScript习题之选择题

    console.log( (2==true)+1 )会弹出A trueB falseC 1D 2正确答案: C2 ==true为假,此时值为0 在JS中,"1555"+3的运行结果 ...

  10. QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家

    QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家 以下是<< QT5原理与源码分析视频课程>>的完整目录. 第1章 准备 第1节 您可以学到什么? 第2 ...