1

前言

记得去年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


Awbeci
3.1k 声望213 粉丝

Awbeci