nwnusun

   ::  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、简介

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 的方式

image-20240415160022181

如果你在 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去解析。

image-20240415160146256

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

yum install bind-utils
nslookup baidu

image-20240415160520841

三、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 一样。

posted on 2024-04-16 09:58  匿名者nwnu  阅读(20)  评论(0编辑  收藏  举报