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
apiVersion: v1api
kind: Servicesession
metadata:app
name: rabbitmq負載均衡
namespace: v2curl
spec:
ports:
- port: 5672
name: amqp
sessionAffinity: None
type: ExternalName
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的訪問了
還有另一種方式
若是你要鏈接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/