前言
记得去年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.localtest-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.10Address: 172.21.0.10#53Name: nacos-headless.default.svc.cluster.localAddress: 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) AGEservice/test-rabbitmq NodePort 172.21.10.248 <none> 5672:31469/TCP,4369:32745/TCP,25672:32057/TCP,15672:31961/TCP 183dservice/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) AGEservice/test-redis-headless ClusterIP None <none> 6379/TCP 5h58mservice/test-redis-master NodePort 172.21.5.38 <none> 6379:30554/TCP 5h58mservice/test-redis-replicas NodePort 172.21.9.204 <none> 6379:32709/TCP 5h58m
Redis同理,6379对外的端口应该是:30554。当然redis没有图形界面。
遗留问题
rabbitmq通过ingress形式对外裸露之后集群内域名拜访没有问题,然而通过对外实在域名拜访UI图形界面的时候始终拜访不上,所以前面我选用了NodePort和LoadBalancer形式来对外裸露,如果有哪位大佬晓得能够通知我一下。
援用:
k8s 对外服务之ingress