K8S容器访问外部资源 Endpoint指定多个端口
K8S容器访问外部资源K8S宿主机网络允许访问外网时,Pod是可以直接访问到公网资源的。但是比如数据库,消息队列类资源可能只对宿主机内网开放,这时Pod将无法访问到这些资源。解决这个问题,有2个方法手动创建Endpoint通过创建一个无label Selector的Service,再创建一个同名的Endpoint。这样就实现了访问集群内的ClusterIP和端口就访问到指定外部资源了。创建资源的e
·
K8S容器访问外部资源
K8S宿主机网络允许访问外网时,Pod是可以直接访问到公网资源的。但是比如数据库,消息队列类资源可能只对宿主机内网开放,这时Pod将无法访问到这些资源。解决这个问题,有2个方法
- 直接访问外网IP,手动创建Endpoint
- 通过域名访问,创建ExternalName类型的Service
手动创建Endpoint
通过创建一个无label Selector的Service,再创建一个同名的Endpoint。这样就实现了访问集群内的ClusterIP和端口就访问到指定外部资源了。
- 创建资源的endpoint和service
# cat oracle-endpoint-service.yaml
apiVersion: v1
kind: Service
metadata:
name: oracle-test
spec:
ports:
- port: 1521
targetPort: 1521
protocol: TCP
---
kind: Endpoints
apiVersion: v1
metadata:
name: oracle-test
subsets:
- addresses:
- ip: 172.100.1.93
ports:
- port: 1521
- 查看分配的ClusterIP为10.10.222.37
- 创建oracle应用测试10.10.222.37:1521或者oracle-test.test.svc.cluster.local:1521(ServiceName.Namespace.svc.cluster.local:Port)是否可以访问
PS:一个Endpoint可以拥有多个端口
# cat rocketmq-endpoint-service.yaml
apiVersion: v1
kind: Service
metadata:
name: rocketmq-t
namespace: test
spec:
ports:
- port: 10909
targetPort: 10909
protocol: TCP
name: rocketmq-c
- port: 9876
targetPort: 9876
protocol: TCP
name: rocketmq-n
---
kind: Endpoints
apiVersion: v1
metadata:
name: rocketmq-t
namespace: test
subsets:
- addresses:
- ip: 172.100.1.101
ports:
- name: rocketmq-c
port: 9876
protocol: TCP
- name: rocketmq-n
port: 10909
protocol: TCP
ExternalName
创建类型为ExternalName的Service,可以通过指定域名访问资源
# cat myservice.yaml
kind: Service
apiVersion: v1
metadata:
name: mysql
spec:
ports:
- port: 3306
protocol: TCP
targetPort: 3306
type: ExternalName
externalName: remote.server.url.com
当查找主机 mysql.default.svc.cluster.local时,集群DNS服务返回CNAME记录,其值为remote.server.url.com。 访问mysql的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。
更多推荐
已为社区贡献1条内容
所有评论(0)