关于 webservice 日志中 源IP是node IP的问题,是否能解决换成 真实的客户端IP呢
本篇目录
- 1. 问题背景
- 2. 部署gitlab 17.5
- 2.1 添加repo源
- 2.2 添加repo源 下载17.5.0的charts包
- 2.3 修改values文件
- 2.3.1 hosts修改如下
- 2.3.2 appConfig修改如下
- 2.3.3 gitlab下的sidekiq配置
- 2.3.4 certmanager修改如下
- 2.3.5 nginx-ingress修改如下
- 2.3.6 <可选> prometheus修改如下
- 2.3.7 <可选> runner配置
- 2.3.8 <可选> 数据库连接数配置
- 2.3.9 创建webservice新的service yaml
- 2.3.10 腾讯云上配置lb,并配置后端转发的服务
- 2.4 部署gitlab
- 2.4.1 查看密码
- 2.5 访问gitlab
- 3. 解决
- 3.1 技术调研
- 3.2 解决方案
- 4. 验证
- 4.1 gitlab 请求验证
- 4.2 runner 请求验证
- 5. 思考
该实践来自于客户的一个真实需求
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 # 禁用httpsexternalIP:- 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: 25pods:- name: codequeues: code- name: integrationsqueues: integrations- name: pipelinequeues: pipeline- name: code-reviewqueues: 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-ingressenabled: falsetcpExternalConfig: "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-shellname: gitlab-server-gitlab-shell-nodeportnamespace: gitlab
spec:internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: sshport: 22protocol: TCPtargetPort: 2222selector:app: gitlab-shelltype: NodePort
---
apiVersion: v1
kind: Service
metadata:labels:app: webservicename: gitlab-server-webservice-nodeportnamespace: gitlabspec:internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: http-workhorseport: 8181protocol: TCPtargetPort: http-workhorseselector:app: webservicetype: 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 恰恰是可以解决这样的流量请求地址地址显示的问题。
相关文章:
关于 webservice 日志中 源IP是node IP的问题,是否能解决换成 真实的客户端IP呢
本篇目录 1. 问题背景2. 部署gitlab 17.52.1 添加repo源2.2 添加repo源 下载17.5.0的charts包2.3 修改values文件2.3.1 hosts修改如下2.3.2 appConfig修改如下2.3.3 gitlab下的sidekiq配置2.3.4 certmanager修改如下2.3.5 nginx-ingress修改如下2.3.6 <可选> prometheus修…...
Serializable接口
最近写项目的时候,发现有一些类要实现Serializable接口,一开始只是粗略的知道实现了Serializable接口,这个类的对象可以被序列化,但我比较轴,想知道这个接口到底有什么作用。 我点开这个接口发现什么方法都没有实现&am…...
如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈
如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈 问题背景 由于我司最早期19年使用的是gitee,因此大部分仓库都在gitee有几百个库的代码,…...
【HDU】1089 A+B for Input-Output Practice (I)
1089 AB for Input-Output Practice (I):以EOF结尾的输入 Problem Description Your task is to Calculate a b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one,…...
lua库介绍:数据处理与操作工具库 - leo
leo库简介 leo 模块的创作初衷旨在简化数据处理的复杂流程,提高代码的可读性和执行效率,希望leo 模块都能为你提供一系列便捷的工具函数,涵盖因子编码、多维数组创建、数据框构建、列表管理以及管道操作等功能。 要使用 Leo 模块,…...
逆向入门(1)C篇-正儿巴经的第1个实验
接触了这么久,第一次不是使用CV大法编写程序,认认真真的重头开始学习,记录一下找调试的感觉。 第一段代码,重温原码,反码和补码。 #include "stdafx.h"int main(int argc, char* argv[]) {char x -7;print…...
vue数据请求通用方案:axios的options都有哪些值
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 Node.js 中。 在使用 Axios 发送请求时,可以通过传递一个配置对象来指定请求的各种选项。 以下是一些常用的 Axios 配置选项及其说明: 1.url: (必需)请求的 …...
使用R语言绘制标准的中国地图和世界地图
在日常的学习和生活中,有时我们常常需要制作带有国界线的地图。这个时候绘制标准的国家地图就显得很重要。目前国家标准地图服务系统向全社会公布的标准中国地图数据,是最权威的地图数据。 今天介绍的R包“ggmapcn”,就是基于最新公布的地图…...
【PyTorch】迁移学习、数据增强
PyTorch官网 介绍 PyTorch 是一个开源的机器学习库,由 Facebook 的人工智能研究实验室开发。它提供了两种主要的功能:张量计算(类似于 NumPy,但具有 GPU 加速)和基于动态计算图的深度学习工具。PyTorch 因其灵活性、…...
Lucas-Kanade光流法详解
简介:个人学习分享,如有错误,欢迎批评指正。 光流(Optical Flow)描述的是图像序列中各像素点随时间的运动情况,是计算机视觉中的基本问题之一。光流问题涉及尝试找出一幅图像中的许多点在第二幅图像中移动的…...
python多张图片生成/合成gif
你可以通过调整帧率来提高GIF的流畅度。默认情况下,代码中的帧率为每秒1帧(fps=1)。我们可以增加这个值来加快动画速度。 下面是修改后的代码,将帧率从每秒1帧提高到每秒5帧(你可以根据需要进一步调整): 在这个版本中,我添加了一个可选参数fps,默认值为5帧每秒。你可…...
iptable限制多个端口出站
iptable限制多个端口出站 安装包 rootiptable:/home/bb# apt-get update rootiptable:/home/bb# apt-get -y install iptables iptables-restoreweb准备 rootweb:/home/bb/test-iptables# docker run -itd --name web -p 80:80 -v ./web1/index.html:/usr/share/nginx/html…...
springmvc--请求参数的绑定
目录 一、创建项目,pom文件 二、web.xml 三、spring-mvc.xml 四、index.jsp 五、实体类 Address类 User类 六、UserController类 七、请求参数解决中文乱码 八、配置tomcat,然后启动tomcat 1. 2. 3. 4. 九、接收Map类型 1.直接接收Map类型 &#x…...
Redis查询缓存
什么是缓存? 缓存是一种提高数据访问效率的技术,通过在内存中存储数据的副本来减少对数据库或其他慢速存储设备的频繁访问。缓存通常用于存储热点数据或计算代价高的结果,以加快响应速度。 添加Redis缓存有什么好处? Redis 基…...
双馈风电DFIG并网系统次转子侧变流器RSC抑制策略研究基于LADRC和重复控制的方法
风电装机容量的持续增长以及电力电子装置的大规模接入,导致电网强度降低,系 统运行特性发生深刻变化,严重威胁风电并网系统的安全稳定运行。因此本文以双馈风 电场经串补线路并网系统为研究对象,在深入分析双馈风电并网系统振荡…...
国产编辑器EverEdit - 使用技巧:变量重命名的一种简单替代方法
1 使用技巧:变量重命名的一种简单替代方法 1.1 应用场景 写过代码的都知道,经常添加功能的时候,是把别的地方的代码拷贝过来,改吧改吧,就能用了,改的过程中,就涉及到一个变量名的问题ÿ…...
使用SSH建立内网穿透,能够访问内网的web服务器
搞了一个晚上,终于建立了一个内网穿透。和AI配合,还是得自己思考,AI配合才能搞定,不思考只依赖AI也不行。内网服务器只是简单地使用了python -m http.server 8899,但是对于Gradio建立的服务器好像不行,会出…...
JWT认证实战
JWT(JSON Web Token)是一种轻量级的、基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传递信息。JWT 的特点是结构简单、轻量化和跨平台支持,适用于用户身份验证、信息加密以及无状态的 API 访问控制…...
计算机网络 (23)IP层转发分组的过程
一、IP层的基本功能 IP层(Internet Protocol Layer)是网络通信模型中的关键层,属于OSI模型的第三层,即网络层。它负责在不同网络之间传输数据包,实现网络间的互联。IP层的主要功能包括寻址、路由、分段和重组、错误检测…...
权限管理的方法
模块化分类 功能模块划分 把人资管理系统按业务逻辑拆分成清晰的功能区,例如招聘管理、培训管理、绩效管理、员工档案管理等。招聘管理模块下还能细分职位发布、简历筛选、面试安排等子功能;员工档案管理涵盖基本信息、教育经历、工作履历录入与查询等。…...
3步精通Zotero Better Notes:打造终极学术笔记管理系统
3步精通Zotero Better Notes:打造终极学术笔记管理系统 【免费下载链接】zotero-better-notes Everything about note management. All in Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-notes Zotero Better Notes是一款革命性的Zote…...
五步解锁Unity游戏视觉封印:UniversalUnityDemosaics全面指南
五步解锁Unity游戏视觉封印:UniversalUnityDemosaics全面指南 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDem…...
Windows Cleaner终极指南:如何快速解决C盘爆红问题,让Windows系统重获新生
Windows Cleaner终极指南:如何快速解决C盘爆红问题,让Windows系统重获新生 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 还在为Windows系…...
3个步骤轻松获取百度网盘真实下载地址:告别龟速下载的完整指南
3个步骤轻松获取百度网盘真实下载地址:告别龟速下载的完整指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否经常遇到百度网盘下载速度只有100KB/s的困扰&…...
ollama + QwQ-32B实战落地:教育智能助教、CTF解题助手、专利分析工具
ollama QwQ-32B实战落地:教育智能助教、CTF解题助手、专利分析工具 最近在折腾大模型本地部署,发现了一个挺有意思的模型——QwQ-32B。这名字听起来有点可爱,但能力可不简单。它属于Qwen系列,主打的是推理能力,号称在…...
Linux内核里那个神秘的`__pci_read_base`函数,到底是怎么算出PCIe设备BAR大小的?
Linux内核中__pci_read_base函数的BAR大小计算机制深度解析 在嵌入式Linux开发领域,PCIe设备的资源分配一直是驱动开发者必须掌握的底层技能。当我们面对一个PCIe设备驱动调试场景时,经常会遇到这样的困惑:内核是如何准确计算出每个BAR&#…...
别再只用官方API了!苹果CMS二次开发:打造你自己的影片数据接口保姆级教程
苹果CMS深度定制:构建高性能影片数据接口的实战指南 许多视频站长和开发者都遇到过这样的困境——苹果CMS自带的API功能过于基础,无法满足复杂的数据查询需求。当你的项目需要按特定分类筛选、自定义排序规则或实现多条件组合查询时,官方API就…...
【SITS2026权威指南】:AI代码变更影响分析的5大误判陷阱与3步精准评估法
第一章:SITS2026专家:AI代码变更影响分析 2026奇点智能技术大会(https://ml-summit.org) 在大型软件系统持续集成场景中,AI驱动的代码补丁(如GitHub Copilot Suggestions、Tabnine Auto-Commit)正高频介入开发流程。…...
AGI治理倒计时:2026奇点大会披露的3类高危失控场景及5步防御协议
第一章:2026奇点智能技术大会:AGI的治理框架 2026奇点智能技术大会(https://ml-summit.org) 全球首个AGI治理协同体启动 大会正式发布《AGI治理协同体宪章(2026草案)》,确立“能力-意图-影响”三维评估模型ÿ…...
用STM32玩转PS2无线手柄:从时序图到按键读取的保姆级代码解析
STM32与PS2无线手柄深度实战:时序解析与按键捕获全流程 第一次拿到PS2手柄想接入STM32时,我盯着那四根线发愣——CLK、CMD、DAT、CS,看似简单的接口背后藏着怎样的通信奥秘?作为嵌入式开发者,理解并实现这种专有协议是…...
