前言
記得去年2021上半年的時候自學了k8s並且使用helm安裝了rabbitmq和redis,可以在開發、測試和生產環境上用起來,但是下半年之後就沒有用,再拾起來的時候發現好多知識點都忘了,這篇文章就是總結使用helm安裝rabbmitmq和redis的個人總結分享給大家。
總結
1、將服務暴露給外部客戶端
第一種通過service型別暴露:
這裡先了解下service的幾種型別:
Clusterip:預設型別,自動分配一個僅 Cluster 內部可以訪問的 虛擬IP,一般用作叢集內部負載均衡。
NodePort(service向外暴露):在ClusterIP 基礎上為 Service 在每臺機器上繫結一個對映埠,外網客戶端可以通過 NodeIP,Nodeport訪問。
LoadBalancer(service向外暴露):在 NodePort 基礎上,藉助 cloud provider 建立一個外部負載均衡器,並將請求轉發到 NodeIP 和 NodePort
ExternalName:把叢集外部的服務引入到叢集內部來,在叢集內部直接使用。沒有任何型別代理被建立,只有1.7之後版本的 kube-dns支援。
所以可以設定service為NodePort或者LoadBalancer來對外暴露服務
第二種通過ingress暴露:
此外externalIPs也可以使各類service對外提供服務,但是當叢集服務很多的時候,NodePort方式最大的缺點是會佔用很多叢集機器的埠;LB方式最大的缺點則是每個service一個LB又有點浪費和麻煩,並且需要k8s之外的支援; 而ingress則只需要一個NodePort或者一個LB就可以滿足所有service對外服務的需求。
2、不同環境下rabbitmq或者redis訪問方式不同
例如:開發環境和測試環境下rabbitmq訪問都不同,首先講測試環境,一般我們測試環境都會有臺測試伺服器,我們只要把rabbitmq和前臺及後臺的pod放到同一個叢集內,這樣我們可以通過k8s的叢集域名方式來訪問,如下面:
test-redis-master.redis.svc.cluster.local
test-rabbitmq.rabbitmq.svc.cluster.local
這個域名如何得到呢?可以通過安裝dnsutils來解析:
kubectl run dnsutils --image=tutum/dnsutils --generator=run-pod/v1 --command -- sleep infinity
kubectl exec dnsutils -- nslookup test-rabbmit-headless.rabbitmq 130 ↵
Server: 172.21.0.10
Address: 172.21.0.10#53
Name: nacos-headless.default.svc.cluster.local
Address: 172.20.0.119
但是,開發環境則不同,因為開發環境的程式碼在我們本地機器上面,所以你不能使用上面的叢集域名來訪問,那麼如何做到本地機器訪問rabbitmq和redis服務呢,答案就在上面的總結裡面,我們可以通過上面的三種方式來暴露rabbitmq和redis,哪三種呢?以及開發環境應該選取哪種?
1、NodePort
2、LoadBalancer
3、Ingress
這裡我只會對開發環境來談,既然是開發環境,我們則用最小的代價來完成工作,我們首選是NodePort,因為rabbitmq和redis我們使用的是StatefulSet有狀態方式來部署,那麼顯然IP也是固定的,我們只要通過節點IP+PORT方式來訪問即可,節點IP可以通過觀察pod或者service第三方服務商的後臺管理系統即可看到,當然你也可以通過命令檢視。
3、Helm刪除服務
直接在第三方服務商的控制檯操作即可,注意連同PVC也一起刪除了。
4、什麼是無頭服務(Headless Services) ?
有時不需要或不想要負載均衡,以及單獨的 Service IP。 遇到這種情況,可以通過指定 Cluster IP(spec.clusterIP)的值為 "None" 來建立 Headless Service。
注意:
1、同Service下的pod可以直接根據PodIP相互通訊
不同Service下的pod在叢集間pod通訊要藉助於 cluster ip
Service的IP地址,此為虛擬IP地址。外部網路無法ping通,只有kubernetes叢集內部訪問使用。
2、dnsutils指定名稱空間的查詢:
kubectl exec -i -t dnsutils -- nslookup <service-name>.<namespace>
3、在開發環境下Service型別設定成NodePort後,要找到正確的對應埠和IP,否則訪問失敗,如:訪問rabbitmq
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/test-rabbitmq NodePort 172.21.10.248 <none> 5672:31469/TCP,4369:32745/TCP,25672:32057/TCP,15672:31961/TCP 183d
service/test-rabbitmq-headless ClusterIP None <none> 4369/TCP,5672/TCP,25672/TCP,15672/TCP 183d
因為rabbitmq的圖形介面是15672對應的埠,所以應該是:31961。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/test-redis-headless ClusterIP None <none> 6379/TCP 5h58m
service/test-redis-master NodePort 172.21.5.38 <none> 6379:30554/TCP 5h58m
service/test-redis-replicas NodePort 172.21.9.204 <none> 6379:32709/TCP 5h58m
Redis同理,6379對外的埠應該是:30554。當然redis沒有圖形介面。
遺留問題
rabbitmq通過ingress方式對外暴露之後叢集內域名訪問沒有問題,但是通過對外真實域名訪問UI圖形介面的時候一直訪問不上,所以後面我選用了NodePort和LoadBalancer方式來對外暴露,如果有哪位大佬知道可以告訴我一下。