四层代理
创建 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 服务器将无法提供与客户端连接的主机名匹配的证书。
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
进入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>
pod访问k8s外部的服务器
我在k8s集群外部有一个数据库,现在pod想连接怎么实现.
首先要保证k8s宿主机要和数据库网络通。
创建一个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
/ #
标签:内外部,通讯,svc,master,cheng,test,k8s,root
From: https://www.cnblogs.com/9527com/p/18037167