kubernetes 服务跨命名空间访问
大家都知道namespace是作为资源隔离,用于分组,可以把我不同组件,不同服务放在不同namespace下,便于管理。那么我现在有需求,希望服务之间可以互相访问,也就是跨namespace的服务访问,应该怎么处理呢?
svc 的 4种类型
ClusterIP 默认,分配一个VIP,只能内部访问
NodePort ClusterIP基础上,在每个节点绑定一个对外访问端口
LoadBalancer 在NodePort基础上,外部负载均衡器转发到NodePort
ExternalName 集群外部的服务引入到集群内部来,集群内部使用
实现上述功能,就需要使用大svc的ExternalName 这种类型。
具体操作方法如下
- 在default 下创建服务 ,以echoservice 为例
$ kubectl apply -f https://bit.ly/echo-service
service/echo created
deployment.apps/echo created
可以通过kubectl 查看服务
$ kubectl get svc echo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo ClusterIP 10.102.214.18 <none> 8080/TCP,80/TCP 69m
- 新建一个namespace test
$ kubectl create namespace test
- 在test下创建svc ,关联到default下svc
apiVersion: v1
kind: Service
metadata:
name: echo-default
namespace: test
spec:
type: ExternalName
externalName: echo.default.svc.cluster.local
$ kubectl get svc -n test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo-default ExternalName <none> echo.default.svc.cluster.local <none> 29m
- 在 test 下创建ingres ,指向test下svc,这样就可以访问default下的echo服务了
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: demo
namespace: test
spec:
rules:
- http:
paths:
- path: /bar
backend:
serviceName: echo-default
servicePort: 80
$ kubectl get ingress -n test
NAME HOSTS ADDRESS PORTS AGE
demo * 192.168.159.129 80 31m
$ curl -i 192.168.159.129:32359/bar
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Sat, 09 May 2020 09:08:48 GMT
Server: echoserver
X-Kong-Upstream-Latency: 1
X-Kong-Proxy-Latency: 1
Via: kong/2.0.3
Hostname: echo-c4cb89895-pnf85
Pod Information:
node name: 192.168.159.129
pod name: echo-c4cb89895-pnf85
pod namespace: default
pod IP: 10.32.0.7
Server values:
server_version=nginx: 1.13.3 - lua: 10008
Request Information:
client_address=::ffff:10.32.0.6
method=GET
real path=/
query=
request_version=1.1
request_scheme=http
这样就可以通过svc 的ExternalName实现跨namespace的访问了