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/

相關文章
相關標籤/搜索