共计 2705 个字符,预计需要花费 7 分钟才能阅读完成。
前言
记得去年 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