首页 > 编程语言 >关于 webservice 日志中 源IP是node IP的问题,是否能解决换成 真实的客户端IP呢

关于 webservice 日志中 源IP是node IP的问题,是否能解决换成 真实的客户端IP呢

时间:2025-01-05 21:30:03浏览次数:3  
标签:node false webservice IP gitlab nodeport 2.3 name

本篇目录

该实践来自于客户的一个真实需求

1. 问题背景

  • gitlab是基于混合架构部署
  • gitlab没有使用ingress
  • gitlab的webservice的service类型为nodeport,然后通过lb来转发实现,域名挂在lb上

关于 gitlab的webservice的service类型为nodeport 可以稍微展开一下,其实就是通过创建一个新的webservice的service yaml文件,然后修改该service的类型是 nodeport,这样可避免后续通过helm upgrade 升级/更新 gitlab的时候,导致service又还原为配置中默认的ClusterIP或LoadBalancer而是的gitlab访问出现问题。

2. 部署gitlab 17.5

在k8s集群中搭建gitlab17.5,不启用ngix-ingress,同时将webservice的service类型使用nodeport的方式。

2.1 添加repo源

## 添加gitlab-jh源
helm repo add gitlab-jh https://charts.gitlab.cn
## 更新gitlab-jh源
helm repo update
## 查看gitlab-jh的charts包,包含了gitlab和gitlab-runner
helm search repo gitlab-jh -l

2.2 添加repo源 下载17.5.0的charts包

## 拉取对应版本的charts包
helm fetch gitlab-jh/gitlab --version 8.5.0
## 解压
tar -xf gitlab-8.5.0.tgz
cd gitlab

2.3 修改values文件

2.3.1 hosts修改如下
  • 添加gitlab的域名
  • 禁用https
  • 配置externalIP
  hosts:
    domain: bdeet.top # 添加域名
    ...
    https: false # 禁用https
    externalIP:
      - 43.133.36.192 #配置externalIP
2.3.2 appConfig修改如下
  • 添加sidekiq的路由规则
  appConfig:
    sidekiq:
      routingRules:
      - ["feature_category=source_code_management","code"]
      - ["feature_category=integrations","integrations"]
      - ["feature_category=continuous_integration,continuous_delivery", "pipeline"]
      - ["feature_category=code_review","code_review"]
      - ["*", "default"]
2.3.3 gitlab下的sidekiq配置
  • 添加sidekiq的队列组
gitlab:
  sidekiq:
    concurrency: 25
    pods:
    - name: code
      queues: code
    - name: integrations
      queues: integrations
    - name: pipeline
      queues: pipeline
    - name: code-review
      queues: code-review
    - name: default
2.3.4 certmanager修改如下
  • installCRDs设置为false,不安装
  • install设置为false,不安装
certmanager:
  installCRDs: false
  ...
  install: false
2.3.5 nginx-ingress修改如下
  • enabled设置false,不用自带的nginx
nginx-ingress: &nginx-ingress
  enabled: false
  tcpExternalConfig: "false"
2.3.6 <可选> prometheus修改如下
  • install设置为false,不安装
prometheus:
  install: false
2.3.7 <可选> runner配置
  • 禁用runner,单独部署
gitlab-runner:
  install: false
2.3.8 <可选> 数据库连接数配置
  • 调整数据库的连接数
postgresql:
  install: true
  ...
  primary:
    extendedConfiguration: |
      max_connections = 500
2.3.9 创建webservice新的service yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: gitlab-shell
  name: gitlab-server-gitlab-shell-nodeport
  namespace: gitlab
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: ssh
    port: 22
    protocol: TCP
    targetPort: 2222
  selector:
    app: gitlab-shell
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: gitlab-server-webservice-nodeport
  namespace: gitlab

spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http-workhorse
    port: 8181
    protocol: TCP
    targetPort: http-workhorse
  selector:
    app: webservice
  type: NodePort
2.3.10 腾讯云上配置lb,并配置后端转发的服务

此处 负载均衡快速入门,将lb的22和80/443 映射到后端服务的2222和8181即可,域名可以直接挂在lb上。

2.4 部署gitlab

 helm upgrade --install gitlab gitlab-jh/gitlab --timeout 600s --set certmanager-issuer.email=wkx_0422@163.com  --version 8.5.0 -f values.yaml
2.4.1 查看密码
kubectl get secret <name>-gitlab-initial-root-password -ojsonpath='{.data.password}' | base64 --decode ; echo

2.5 访问gitlab

经过测试发现确实webservice的log中的remote ip都是nodeport的ip,已经和用户的环境一致。

3. 解决

3.1 技术调研

关于 externalTrafficPolicy 的解释,参考如下:

  • https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
  • https://www.cnblogs.com/zhangmingcheng/p/17637712.html

3.2 解决方案

将webservice的service类型为nodeport的yaml中的 externalTrafficPolicy: Cluster 改成 externalTrafficPolicy: Local 即可。

关于 externalTrafficPolicy 的策略说明

  • Cluster 隐藏了客户端源 IP,可能导致第二跳到另一个节点,但具有良好的整体负载分布。
  • Local 保留客户端源 IP 并避免 LoadBalancer 和 NodePort 类型服务的第二跳, 但存在潜在的不均衡流量传播风险。

因此对 上面2.3.9的yaml文件修改如下(见红色字体):

apiVersion: v1
kind: Service
metadata:
labels:
app: gitlab-shell
name: gitlab-server-gitlab-shell-nodeport
namespace: gitlab
spec:
externalTrafficPolicy: Local
internalTrafficPolicy: Cluster
ipFamilies:

  • IPv4
    ipFamilyPolicy: SingleStack
    ports:
  • name: ssh
    port: 22
    protocol: TCP
    targetPort: 2222
    selector:
    app: gitlab-shell
    type: NodePort

apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: gitlab-server-webservice-nodeport
namespace: gitlab
spec:
externalTrafficPolicy: Local
internalTrafficPolicy: Cluster
ipFamilies:

  • IPv4
    ipFamilyPolicy: SingleStack
    ports:
  • name: http-workhorse
    port: 8181
    protocol: TCP
    targetPort: http-workhorse
    selector:
    app: webservice
    type: NodePort

4. 验证

4.1 gitlab 请求验证

如下是本地ip
在这里插入图片描述
本地访问gitlab,查看日志
在这里插入图片描述

4.2 runner 请求验证

本地runner的IP
在这里插入图片描述
gitlab上跑一个流水线
在这里插入图片描述

综上所述,在gitlab的日志中,客户的端的请求都已经为真实的ip地址。

5. 思考

抛开gitlab本身,其实对于在k8s中部署的服务而言,如果走了ingress网络是不存在这个问题,而恰恰是因为绕过了ingress,通过nodeport的方式产生了这个问题,而externalTrafficPolicy 恰恰是可以解决这样的流量请求地址地址显示的问题。

标签:node,false,webservice,IP,gitlab,nodeport,2.3,name
From: https://blog.csdn.net/weixin_44729138/article/details/144950724

相关文章

  • Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
    我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码。下面推荐一个.Net版本的Eval的开源项目。01项目简介Eval-Expression.NET是一个非常强大工具,使得开发人员可以动态编译和执行C#代码和表达式。通过C#反射,还能轻松访问公共和私有方法、字段、属性值......
  • HTML5 翻转动画(Flip Animation)详解
    HTML5翻转动画(FlipAnimation)详解翻转动画(FlipAnimation)是一种动态效果,使元素在Y轴或X轴上翻转,常用于卡片效果或展示详细信息。以下是翻转动画的详细介绍及实现示例。1.翻转动画的特点动态视觉效果:通过翻转效果使页面更具吸引力,增加交互感。信息展示:适合用于展示额外......
  • 8.Redis底层数据结构——ziplist和listpack
    一、ziplist1.1ziplist结构Redis采用紧凑的字节数组表示一个压缩列表,压缩列表结构示意图如下:<zlbytes><zltail><zllen><entry><entry>...<entry><zlend>zlbytes:压缩列表的字节长度,占4个字节,因此压缩列表最多有2*32-1个字节。zltail:压缩列表尾元素相对于压缩......
  • 网络世界的“交通规则”——TCP/IP(一)
    一、非可靠传输的协议——UDP1.1UDP的报文格式(1)UDP长度:表示整个UDP数据包的长度(报头+载荷);(2)校验和:用于验证UDP数据包在传输过程中有没发生比特翻转(由于各种原因导致的比特位变化,如0变为1,接收方在收到数据包后会重新进行校验和的计算,如果与UDP数据包中的校验和不同,就会丢......
  • 【网络协议】IPv4 地址分配 - 第一部分
    文章目录十进制与二进制网络如何被寻址地址类型网络地址广播地址主机地址如何确定网络和主机部分的位数?网络中的主机数量与前缀号的关系计算每个前缀的主机数量公式子网掩码二进制与操作(BinaryANDing)与操作(ANDOperation)二进制与操作的结果关于子网划分为什么要进行......
  • Javascript中的return你了解多少?
     目录1、 js中对于return用法的三种情况的总结如下:2、return的特点......
  • node.js毕设超市商品管理系统论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于超市商品管理系统的研究,现有研究主要以大型企业的综合管理系统为主,专门针对超市这一特定商业场景下的商品管理系统的研究较少。在国内外,大型零售企......
  • node.js毕设超市零售管理系统论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于超市零售管理系统的研究,现有研究主要集中在大型连锁超市的整体运营管理方面,多从宏观战略、供应链管理等角度展开研究,专门针对超市内部零售管理系统......
  • javasript DOM基础学习
    DOM简介1.1什么是DOMDOM是一个处理可扩展标记语言(HTML、XML)的接口,可以改变网页的内容、结构和样式1.2DOM树文档:一个页面就是一个文档,DOM中使用document表示元素:页面中所有的标签都是元素,DOM中使用element表示节点:网页中所有的内容都是节点(标签、属性、文本、注释等),DOM中使......
  • node.js毕设超级记事本app论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于记事本app的研究,现有研究主要以功能简单的基础型记事应用为主。在国内外,许多记事本app侧重于基本的文字记录功能,如记录会议、日程等简单事项,对于多功......