K8S使用Helm安裝RabbitMQ和Redis的總結

Awbeci發表於2022-01-21

前言

記得去年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方式來對外暴露,如果有哪位大佬知道可以告訴我一下。

引用:

k8s 對外服務之ingress

相關文章