关于 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 恰恰是可以解决这样的流量请求地址地址显示的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502532.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaEE-网络编程-3 UDP

目录 Socaket套接字 UDP数据报套字节编程 1.DatagrameSocket类 DatagramSocaket构造方法: DatagramSocaket常用方法&#xff1a; 2.DatagramPacket类 DatagramPacket构造方法&#xff1a; UDP回显服务器实现 UDP服务端实现&#xff1a; 创建一个Socket类对象&#xf…

【Vim Masterclass 笔记08】第 6 章:Vim 中的文本变换及替换操作 + S06L20:文本的插入、变更、替换,以及合并操作

文章目录 Section 6&#xff1a;Transforming and Substituting TextS06L21 Inserting, Changing, Replacing, and Joining1 定位到行首非空字符&#xff0c;并启用插入模式2 在紧挨光标的下一个字符位置启动插入模式3 定位到一行末尾&#xff0c;并启用插入模式4 定位到光标的…

Transformer知识梳理

Transformer知识梳理 文章目录 Transformer知识梳理什么是Transformer&#xff1f;语言模型迁移学习 Transformer结构注意力层原始结构 总结 什么是Transformer&#xff1f; 语言模型 Transformer模型本质上都是预训练语言模型&#xff0c;大部分采用自监督学习&#xff08;S…

小程序学习06——uniapp组件常规引入和easycom引入语法

目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范&#xff1a; 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 &#xff08;a&#xff09;新建compoents文件…

数据插入操作的深度分析:INSERT 语句使用及实践

title: 数据插入操作的深度分析:INSERT 语句使用及实践 date: 2025/1/5 updated: 2025/1/5 author: cmdragon excerpt: 在数据库管理系统中,数据插入(INSERT)操作是数据持久化的基础,也是应用程序与用户交互的核心功能之一。它不仅影响数据的完整性与一致性,还在数据建…

并发服务器框架——zinx

zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架&#xff0c;它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能&#xff0c;包括但不限于连接管理、数据编解码、业务处理、负载均衡等&#xff0c;适用于构建各种 TCP 网络服务&#xff0c;如游戏…

科研绘图系列:R语言科研绘图之标记热图(heatmap)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息参考介绍 科研绘图系列:R语言科研绘图之标记热图(heatmap) 加载R包 library(tidyverse) library(ggplot2) library(reshape)…

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

Prism模块化

1.先假设ModuleA是需要被模块化的&#xff0c;里面随便写了个用户控件 2.需要用这个模块就给添加一下它的引用 3.使用这个模块的时候就在App.xaml.cs中添加这个模块&#xff0c;通过重写方法ConfigureModuleCatalog实现 protected override void ConfigureModuleCatalog(IModu…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

【FlutterDart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector&#xff5e;简单实现&#xff08;10 /100&#xff09; 【Flutter&Dart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小&#xff08;11 /100&#xff09; 上效果 对比一下vscode的效果&…

umd格式

umd格式是啥&#xff1f; umd格式是一种通用模块&#xff0c;他同时支持AMD、CJS、ESM模块和全局变量的方式 umd格式打包后的基本代码结构如下: (function (root, factory) {if (typeof define function && define.amd) {// AMDdefine([dependency], factory);} el…

《Rust权威指南》学习笔记(二)

枚举enum 1.枚举的定义和使用如下图所示&#xff1a; 定义时还可以给枚举的成员指定数据类型&#xff0c;例如&#xff1a;enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下&#xff0c;使用::进行分隔。 2.一个特殊的枚举Option&#xff0…

CoppeliaSim和Python进行无人机联合仿真

首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。 最终运行效果: 一、 建立起CoppeliaSim和Python的远程连接 1. 拷贝API函数和库文件 拷贝库函数文件 sim.py、simConst.p…

「Java 数据结构全面解读」:从基础到进阶的实战指南

「Java 数据结构全面解读」&#xff1a;从基础到进阶的实战指南 数据结构是程序设计中的核心部分&#xff0c;用于组织和管理数据。Java 提供了丰富的集合框架和工具类&#xff0c;涵盖了常见的数据结构如数组、链表、栈、队列和树等。本文将系统性地介绍这些数据结构的概念、…

windows11安装minikube

主要是按照官网步骤安装&#xff0c;由于是英文&#xff0c;又不是常规安装包的形式&#xff0c;稍微难理解一点&#xff0c;特此记录。 下文仅是对部分步骤做了说明&#xff0c;需要以官网为主&#xff0c;本文为辅。 一、访问minikube官网 https://minikube.sigs.k8s.io/d…

LLM大模型RAG内容安全合规检查

1.了解内容安全合规涉及的范围 我们先回顾一下智能答疑机器人的问答流程。问答流程主要包括用户、智能答疑机器人、知识库、大语言模型这四个主体。 涉及内容安全的关键阶段主要有&#xff1a; 输入阶段&#xff1a;用户发起提问。 输出阶段&#xff1a;机器人返回回答。 知识…

OpenCV计算机视觉 05 图像边缘检测(Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测)

图像边缘检测 边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具&#xff0c;通常用于特征提取和特征检测&#xff0c;旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。 yuancv2.imread(yuan.png) cv2.imshow(yuan,yuan) cv2.waitKey(0) yuan_xcv2.Sob…

【C++】P2550 [AHOI2001] 彩票摇奖

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a; &#x1f4af;题解思路1. 问题解析 &#x1f4af;我的实现实现逻辑问题分析 &#x1f4af;老…