文章目录
Kubernetes——使用Rinetd进行service的负载均衡
一、使用Rinetd进行service的负载均衡
1.1 访问集群
利用yml部署一个tomcat集群后,客户端访问,需要指定端口去访问,结构图如下
![image-20211123121741846](https://i-blog.csdnimg.cn/blog_migrate/02b3c8c73a0b5d8efc4289edf7b7dac4.png)
此时就会发现一个问题,每次访问tomcat分布式集群,都需要指定节点的ip,而且现在要上分布式的情况,都是因为单一的节点不够用,才需要上集群,所以这套结构,显然缺点啥,而且Master节点的service8000端口,似乎只有服务器内部可用,有那么点浪费了。那么改进之后的结构图就出来了。
![image-20211123122422789](https://i-blog.csdnimg.cn/blog_migrate/3ba4f24b906e57fc57e2ccf074ecc0c0.png)
由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](https://i-blog.csdnimg.cn/blog_migrate/a2fa44469b9aef6a922aac09b3d3511a.png)
![image-20211123143241066](https://i-blog.csdnimg.cn/blog_migrate/326229b0a12f599432e25ae833617487.png)
1.3.4 缺陷
一旦删除service,再重新create这个service,那么就需要重新查询service的IP,再重新挂载