前言

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