Kubernetes——使用Rinetd进行service的负载均衡

本文介绍了如何在Kubernetes中使用Rinetd进行Service的负载均衡和对外暴露服务。首先,通过修改Service的YAML配置实现内部负载均衡,然后详细阐述了Rinetd的安装和配置过程,以将Service的8000端口对外映射,使得外部客户端能够访问。最后,指出了这种方法的局限性,即Service删除后再创建需要重新配置。
摘要由CSDN通过智能技术生成

Kubernetes——使用Rinetd进行service的负载均衡

一、使用Rinetd进行service的负载均衡

1.1 访问集群

利用yml部署一个tomcat集群后,客户端访问,需要指定端口去访问,结构图如下

image-20211123121741846

此时就会发现一个问题,每次访问tomcat分布式集群,都需要指定节点的ip,而且现在要上分布式的情况,都是因为单一的节点不够用,才需要上集群,所以这套结构,显然缺点啥,而且Master节点的service8000端口,似乎只有服务器内部可用,有那么点浪费了。那么改进之后的结构图就出来了。

image-20211123122422789

由Master节点去做这个负载均衡,让他随机的去挑选Node1或者Node2即可,第二个问题又来了,如何去做这个负载均衡?

其实kubernetes的service自身就可以做到负载均衡

1.2 改写service.yml,支持负载均衡

1.2.1 修改service.yml内容
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  labels:
    app: tomcat-service
spec:
  # 注释掉这行
  # type: NodePort
  selector:
    app: tomcat-cluster
  ports:
  - port: 8000
    targetPort: 8080
  # 注释掉这行,等于所有节点都不暴露32500了,都由8000来接收
  #  nodePort: 32500
1.2.2 重启service
kubectl apply -f service.yml
1.2.3 查看是否生效
[root@k8s-master tomcat-service]# kubectl get service
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP    17d
# IP是10.111.212.119,端口号是8000
tomcat-service   ClusterIP   10.111.212.119   <none>        8000/TCP   12m
[root@k8s-master tomcat-service]# kubectl describe service tomcat-service
Name:              tomcat-service
Namespace:         default
Labels:            app=tomcat-service
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"tomcat-service"},"name":"tomcat-service","namespace":"de...
Selector:          app=tomcat-cluster
Type:              ClusterIP
IP:                10.111.212.119
Port:              <unset>  8000/TCP
TargetPort:        8080/TCP
Endpoints:         10.244.1.23:8080,10.244.2.20:8080
Session Affinity:  None
Events:            <none>
[root@k8s-master tomcat-service]# curl 10.111.212.119:8000
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server

# 此处观看的并不清晰,所以创建一个web页面去查看
# 此处的知识,需要基于NFS文件集群共享来实现
# 在主节点上操作
[root@k8s-master tomcat-service]# cd /usr/local/data/www-data/
[root@k8s-master www-data]# mkdir test
[root@k8s-master www-data]# cd test/
[root@k8s-master test]# vim index.jsp
# 写入如下内容
<%=request.getLocalAddr()%>

# 保存退出
# 再次执行curl请求
[root@k8s-master test]# curl 10.111.212.119:8000/test/index.jsp
10.244.2.20
[root@k8s-master test]# curl 10.111.212.119:8000/test/index.jsp
10.244.1.23
[root@k8s-master test]# curl 10.111.212.119:8000/test/index.jsp
10.244.2.20
[root@k8s-master test]# curl 10.111.212.119:8000/test/index.jsp
10.244.1.23
[root@k8s-master test]# curl 10.111.212.119:8000/test/index.jsp
10.244.2.20
[root@k8s-master test]# curl 10.111.212.119:8000/test/index.jsp
10.244.2.20
# 就可以发现请求的节点ip是随机的了

1.3 使用Rinetd对外暴露8000端口

通过10.111.212.119确实可以做到负载均衡的访问,但是我们的客户端浏览器并不能访问啊,这个ip一看就是内网ip,而我们的ip肯定是要192.168.8.64:8000/test/index.jsp,这样子才能被我们的客户端访问,此时就需要用到Linux系统中的端口转发组件——Rinetd了

1.3.1 端口转发工具-Rinetd
  • Rinetd是Linux操作系统中为重定向传输控制协议工具

  • 可将源IP端口数据转发至目标IP端口

  • 在Kubernetes中用于将Service服务对外暴露

1.3.2 安装、配置Rinetd
1.3.2.1 下载Rinetd
# 可以直接下载
链接: https://pan.baidu.com/s/1otUETTg87HJHQi7VzzhF9w 提取码: 36fw
# 也可以去官方下载
http://www.boutell.com/rinetd/http/rinetd.tar.gz
1.3.2.2 安装Rinetd
# 进入/usr/local目录,因为我把rinetd.tar.gz放在这里面了
cd /usr/local
# 解压rinetd.tar.gz
tar -zxvf rinetd.tar.gz
# 进入解压后的目录
cd rinetd
# 修改rinetd.c中的内容
sed -i 's/65536/65535/g' rinetd.c
# 创建/usr/man目录,这个目录是rinetd官方强制要求的
mkdir -p /usr/man/
# 安装、更新gcc
yum install -y gcc
# 编译安装Rinetd
make && make install
# 配置端口映射
vim /etc/rinetd.conf
# 写入以下内容,0.0.0.0表示针对任意的IP开放,10.100.22.231表示需要开放的IP,第一个8000表示对外开放8000,映射的是第二个8000端口
0.0.0.0 8000 10.100.22.231 8000

# 挂载配置
rinetd -c /etc/rinetd.conf 

# 查看是否挂载成功
netstat -tulpn
[root@k8s-master test]# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
...         
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      26449/rinetd  
...

# 重新挂载
pkill rinetd
rinetd -c /etc/rinetd.conf

# 设置开机自启
rinetd -c /etc/rinetd.conf
把这条命令加到/etc/rc.local里面就可以开机自动运行

1.3.3 测试外部是否能访问
image-20211123140911265 image-20211123143241066
1.3.4 缺陷

一旦删除service,再重新create这个service,那么就需要重新查询service的IP,再重新挂载

Kubernetes其他文档列表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值