k8s跨namespace访问服务

kubernetes 服务跨命名空间访问

你们都知道namespace是做为资源隔离,用于分组,能够把我不一样组件,不一样服务放在不一样namespace下,便于管理。那么我如今有需求,但愿服务之间能够互相访问,也就是跨namespace的服务访问,应该怎么处理呢?

svc 的 4种类型
ClusterIP 默认,分配一个VIP,只能内部访问
NodePort ClusterIP基础上,在每一个节点绑定一个对外访问端口
LoadBalancer 在NodePort基础上,外部负载均衡器转发到NodePort
ExternalName 集群外部的服务引入到集群内部来,集群内部使用html

实现上述功能,就须要使用大svc的ExternalName 这种类型。node

状况:v2 namespace须要访问default namespace的rabbitmq服务nginx

解决办法:在v2 namespace里面建立service,不指定selector, 采用type=ExternalName的方式,externalName定义成为指向namespace=default中的rabbitmq-serviceredis

# vi rabbitmq.yamlspring

  1. apiVersion: v1api

  2. kind: Servicesession

  3. metadata:app

  4. name: rabbitmq负载均衡

  5. namespace: v2curl

  6. spec:

  7. ports:

  8. - port: 5672

  9. name: amqp

  10. sessionAffinity: None

  11. type: ExternalName

  12. externalName: rabbitmq.default.svc.cluster.local


[root@bdy-master1]# kubectl create -f rabbitmq.yaml

[root@bdy-master1]# kubectl get service -A |grep rabbit

default rabbitmq ClusterIP None <none> 5672/TCP 108d

default rabbitmq-service NodePort 10.254.252.174 <none> 15672:32001/TCP,5672:32002/TCP 115d

v2 rabbitmq ExternalName <none> rabbitmq.default.svc.cluster.local 5672/TCP 25h

测试是否能够跨namespace访问

[root@bdy-master1 rabbitmq-service]# kubectl exec -it -n v2 api-57596df5b8-sx2hc sh

/var/www/html # nslookup rabbitmq

nslookup: can't resolve '(null)': Name does not resolve

Name: rabbitmq

Address 1: 172.30.28.24 172-30-28-24.rabbitmq.default.svc.cluster.local

Address 2: 172.30.3.4 rabbitmq-1.rabbitmq.default.svc.cluster.local

Address 3: 172.30.43.8 172-30-43-8.rabbitmq.default.svc.cluster.local

Address 4: 172.30.43.2 rabbitmq-2.rabbitmq.default.svc.cluster.local

Address 5: 172.30.3.30 172-30-3-30.rabbitmq.default.svc.cluster.local

Address 6: 172.30.28.2 rabbitmq-0.rabbitmq.default.svc.cluster.local

/var/www/html # ping rabbitmq

PING rabbitmq (172.30.43.2): 56 data bytes

64 bytes from 172.30.43.2: seq=0 ttl=62 time=0.720 ms

64 bytes from 172.30.43.2: seq=1 ttl=62 time=0.650 ms

^C

--- rabbitmq ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.650/0.685/0.720 ms

/var/www/html # nc -n -v rabbitmq 5672

rabbitmq (172.30.43.2:5672) open

本文出自http://www.javashuo.com/article/p-athqqbvl-eg.html

状况v2

具体操做方法以下

1.在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

2.新建一个namespace test

$ kubectl create namespace test

3.在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


4.在 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的访问了

本文出自连接https://blog.csdn.net/gou12341234/article/details/106023150?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.channel_param


还有另一种方式

若是你要链接namespace是redis的,服务名是redis-master的服务,你能够这样去配置你的链接:

spring:  
  profiles: redis-prod  
  redis:    
    host: redis-master.redis 
    port: 6379
    password: 123456
    database: 1

它采用了服务名+命名空间的格式,若是是相同的namespace,能够直接使用服务名来解析。

参考连接http://www.javashuo.com/article/p-zalyhhvp-hr.html

参考连接https://www.colabug.com/2020/0913/7692782/

相关文章
相关标签/搜索