k8s 跨空间通讯(内外部)

四层代理

创建 ExternalName 类型的 Service

应用场景:跨名称空间访问

需求:default 名称空间下的 pod 想要访问 cheng-svc-pod名称空间下的 pod 服务

cheng-svc-pod下有一个svc服务,default想访问就要下完成的名称Service_name.svc_namespace.svc.cluster.local,名称太长不好记,后面要是删除了这个名称空间,还需要修改代码。 ExternalName相当于做了一个软链接,代码直接写软链接名称,后面修改不需要改代码,直接修改ExternalName配置就可以。

ExternalName 类型

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

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

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 服务器将无法提供与客户端连接的主机名匹配的证书。

服务(Service) | Kubernetes

cheng-svc-pod名称空间资源

[root@k8s-master cheng-svc-test]# kubectl -n cheng-svc-test get all
NAME                       READY   STATUS    RESTARTS   AGE
pod/nginx-cc89db96-c8hbp   1/1     Running   0          20m
pod/nginx-cc89db96-hrr75   1/1     Running   0          20m
pod/nginx-cc89db96-k4bp4   1/1     Running   0          20m

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/cheng-clusterip    ClusterIP   10.98.49.113    <none>        80/TCP         20m
service/nodeport-service   NodePort    10.105.177.35   <none>        80:30188/TCP   20m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           20m

NAME                             DESIRED   CURRENT   READY   AGE

defaulf 默认空间下创建pod

[root@k8s-master cheng-svc-test]# cat default.yaml 
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: default
  namespace: default
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: busybox
  template: 
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh","-c","sleep 360000"]

[root@k8s-master cheng-svc-test]# 
[root@k8s-master cheng-svc-test]# kubectl get pods
NAME                       READY   STATUS    RESTARTS      AGE
busybox                    0/1     Unknown   0             19d
default-6f44df49c8-w7b8h   1/1     Running   0             27s
nginx                      1/1     Running   1 (80m ago)   19d
[root@k8s-master cheng-svc-test]# 


创建 ExternalName

[root@k8s-master ~]# kubectl  ap
api-resources  (Print the supported API resources on the server)
api-versions   (Print the supported API versions on the server, in the form of "group/version")
apply          (Apply a configuration to a resource by file name or stdin)
[root@k8s-master ~]# kubectl  api-resources 
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus


[root@k8s-master cheng-svc-test]# cat client_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: client-svc
spec:
  type: ExternalName
  externalName: cheng-clusterip.cheng-svc-test.svc.cluster.local

[root@k8s-master cheng-svc-test]# 

[root@k8s-master cheng-svc-test]# kubectl apply -f client_svc.yaml 
service/client-svc created



Service_name.svc_namespace.svc.cluster.local

image-20231122161327699

image-20231122161445266

进入busybox测试

[root@k8s-master ~]# kubectl exec -it default-6f44df49c8-w7b8h -- /bin/sh
/ # wget -q -O -  cheng-clusterip.cheng-svc-test.svc.cluster.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ # wget -q -O - client-svc
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

image-20231122161713903

pod访问k8s外部的服务器

我在k8s集群外部有一个数据库,现在pod想连接怎么实现.

首先要保证k8s宿主机要和数据库网络通。

image-20231122162258925

image-20231122162324761

创建一个mysql的svc

[root@k8s-master cheng-svc-test]# cat mysql.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
  - port: 3306

[root@k8s-master cheng-svc-test]# kubectl apply -f mysql.yaml 
service/mysql created

[root@k8s-master cheng-svc-test]# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                        PORT(S)    AGE
client-svc   ExternalName   <none>           cheng-clusterip.cheng-svc-test.svc.cluster.local   <none>     22m
kubernetes   ClusterIP      10.96.0.1        <none>                                             443/TCP    19d
mysql        ClusterIP      10.100.239.193   <none>                                             3306/TCP   60s
[root@k8s-master cheng-svc-test]# 

创建一个 mysql_endpoint.yaml 文件,并在其中定义 Endpoints,指定外部 MySQL 服务的 IP 地址和端口。假设外部 MySQL 的 IP 地址为 192.168.199.224,端口为 3306:

[root@k8s-master cheng-svc-test]# cat mysql_endpoint.yaml 
apiVersion: v1
kind: Endpoints
metadata: 
  name: mysql
subsets:
- addresses:
  - ip: 192.168.199.224
  ports:
  - port: 3306

root@k8s-master cheng-svc-test]# kubectl apply -f mysql_endpoint.yaml 
endpoints/mysql created

查看mysql svc更新状态

[root@k8s-master cheng-svc-test]# kubectl describe service mysql 
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.100.239.193
IPs:               10.100.239.193
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.199.224:3306
Session Affinity:  None
Events:            <none>
[root@k8s-master cheng-svc-test]# 

​ 通过以上步骤,我们成功在 Kubernetes 集群中引入了外部的 MySQL 数据库。通过创建 Service 和 Endpoints,我们将外部 MySQL 的 IP 地址和端口与集群内内的 Service 进行了关联, 使得集群内部的应用可以通过 Service 名称访问外部的 MySQL 服务。通过访问该 Service,可以使 用集群内的应用与外部的 MySQL 数据库进行交互。

在这个场景中,mysql Service 的 ClusterIP 为 10.100.239.193,它将外部 MySQL 的 IP 地 址和端(192.168.33.224:3306)暴露给集群内部的应用。 你可以在需要访问外部 MySQL 数据库的应用中,使用 mysql Service 的名称来连接数据库。通 过这种方式,你可以在 Kubernetes 集群中轻松地引用外部的 MySQL 数据库,实现集群内外数据的 交互和共享。 请注意,这种方式适用于在 Kubernetes 集群中引入已经存在的外部服务。但在实际使用中,还需 要确保网络连接和安全性的考虑,如网络可访问性、防火墙规则、身份验证等。

通过pod测试mysql数据库

[root@k8s-master cheng-svc-test]# kubectl exec -it default-6f44df49c8-w7b8h -- /bin/sh
/ # 
/ # telnet mysql 3306
telnet: bad address 'mysql'
/ # telnet 10.100.239.193 3306
Connected to 10.100.239.193
J
5.7.28}b~RIy:):WjHmysql_native_passwordConnection closed by foreign host
/ # 

posted @   挖挖挖  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示