前言
记得去年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 .
3、在开发环境下Service类型设置成NodePort后,要找到正确的对应端口和IP,否则访问失败,如:访问rabbitmq
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/test-rabbitmq NodePort 172.21.10.248 5672:31469/TCP,4369:32745/TCP,25672:32057/TCP,15672:31961/TCP 183d
service/test-rabbitmq-headless ClusterIP 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 6379/TCP 5h58m
service/test-redis-master NodePort 172.21.5.38 6379:30554/TCP 5h58m
service/test-redis-replicas NodePort 172.21.9.204 6379:32709/TCP 5h58m
Redis同理,6379对外的端口应该是:30554。当然redis没有图形界面。
遗留问题
rabbitmq通过ingress方式对外暴露之后集群内域名访问没有问题,但是通过对外真实域名访问UI图形界面的时候一直访问不上,所以后面我选用了NodePort和LoadBalancer方式来对外暴露,如果有哪位大佬知道可以告诉我一下。