一、简介
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>.
进入默认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 一样。
标签:baidu,name,service,Service,dev,ExternalName,使用,pod,k8s From: https://www.cnblogs.com/nwnusun/p/18137511