K8S入门到精通06-基于Rinted的Service负载均衡
程序员文章站
2024-01-28 16:02:22
...
Service提供负载均衡实现
这里我们直接使用Service的负载均衡,不再将端口直接暴露在宿主机节点上,集群内部通过k8s内部网络相互访问。由tomcat-service这个特殊的pod来实现流量转发与负载均衡。
修改tomcat-service.yml如下:
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service # Service也是一个特殊的pod,需要设置lables
spec:
# type: NodePort # Service类型
selector:
app: tomcat-cluster # 指定绑定的pod
ports:
- port: 8000 # Service在k8s集群内部暴露的端口
targetPort: 8080 # 被映射的容器暴露端口
# nodePort: 32500 # 集群每个Node节点上对外暴露的端口
仅需注释如下两行内容
# type: NodePort # Service类型
# nodePort: 32500 # 集群每个Node节点上对外暴露的端口
变更service
kubectl apply -f tomcat-service.yml
在NFS共享目录中增加测试index.jsp,验证负载均衡效果
# 在Master节点(NFS Server)中执行如下命令
mkdir /data/www-data/test/
echo "IP:<%=request.getLocalAddr()%>" > /data/www-data/test/index.jsp
# 查看Service内部IP
kubectl get service tomcat-service
# 使用curl测试,10.103.113.6为上一步中获取的ClusterIP
curl 10.103.113.6:8000/test/index.jsp
# 返回处理请求的pod容器的ip
# IP:10.244.1.17
端口转发工具-Rinetd
上一步中10.*段的IP为K8S集群内部通信使用的IP,如何将这些IP提供的端口映射到外部呢?
- Rinetd是Linux操作系统中为重定向传输控制协议工具
- 可将源IP端口数据转发至目标IP端口
- 在Kubernetes中用于将service服务对外暴露
rinted安装
rinted源码无法从官网下载,资源以事先准备好
这里我们使用Master节点作为端口转发宿主机,所有rinted安装在Master节点(192.168.0.31)上,以下命令均在该节点执行。
# 解压rinted源码
tar -zxf rinetd.tar.gz
cd rinetd/
# 修改rinted运行映射的端口范围
sed -i 's/65536/65535/g' rinted.c
# 创建rinted依赖目录
mkdir -p /usr/man/
# 安装C语言编译器
yum install -y gcc
# 编译并安装
make && make install
配置rinted
增加配置文件/etc/rinetd.conf
# 宿主机映射监听的IP+端口(0.0.0.0表示所有IP)、映射目的IP+端口
# 10.103.113.6即tomcat-service使用的ClusterIP
0.0.0.0 8000 10.103.113.6 8000
运行rinted
rinetd -c /etc/rinetd.conf
查看映射情况
使用netstat -nptl
可以看到rinetd开启了8000端口
使用如下地址可在浏览器中访问rinted+service提供的服务
http://192.168.0.31:8000/test/index.jsp
总结
目前我们已经学习了k8s集群对外暴露服务的两种方式
- 使用Service提供的NodePort,在每一个Node节点开启端口映射,实现流量的转发
- Rinted+Service,使用Rinted设置对外暴露的IP+端口,通过Service实现访问的负载均衡
一般而言,Rinted+Service性能上会略胜一筹,大型集群应用优先考虑选择该种方式。
版权说明
本文章内容为马士兵教育《架构师高级技能kubernetes入门到精通》课程的学习笔记
百度网盘上相关源码资料包 提取码:xdji