NFS环境搭建与在K8s的应用

第一部分:配置 docker

1.1、配置Nginx,转发 nexus 上传包的请求
sudo tee /etc/nginx/conf.d/k8s.conf <<-‘EOF’

HTTPS 服务器块

server {
listen 443 ssl;
server_name sls.registry.k8s;

# SSL 证书配置
ssl_certificate /home/projectname/server/mydomain.crt;
ssl_certificate_key /home/projectname/server/mydomain.key;# 反向代理设置
location / {proxy_pass http://192.168.1.205:8082;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;
}

}
EOF

nginx -s reload

1.2、配置Nexus 调整上传附件的大小,确保能上传镜像
http {

// 新增下面这一行
client_max_body_size 2000M;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
// 修改这一行的值
keepalive_timeout 100;
types_hash_max_size 2048;include /etc/nginx/mime.types;
default_type application/octet-stream;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;gzip on;include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

}

1.3、配置docker 让docker 能访问nexus
1.3.1、nginx + nexus + docker 服务器
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“insecure-registries”: [ “sls.registry.k8s:443”,“192.168.1.205:8082”],
“registry-mirrors”: [ “https://sls.registry.k8s”,“http://192.168.1.205:8082”,“https://7e9g5tmw.mirror.aliyuncs.com”,“https://registry.docker-cn.com”],
“exec-opts”: [“native.cgroupdriver=systemd”]
}

EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1.3.2、k8s 服务器:
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“insecure-registries”:[“sls.registry.k8s:5000”,“192.168.1.205:8082”],
“registry-mirrors”: [“https://sls.registry.k8s:5000”,“http://192.168.1.205:8082”,“https://7e9g5tmw.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload

第二部分: 安装NFS

2.1、安装NFS 服务器:
搭建一个 NFS(Network File System)服务器通常需要在 Linux 系统上进行操作。下面是一个基本的步骤指南:

步骤 1: 安装 NFS 服务器软件

  1. 使用包管理器安装 NFS 服务器软件。具体命令取决于你使用的 Linux 发行版。以 Ubuntu 为例,可以使用以下命令:

    sudo apt update
    sudo apt install nfs-kernel-server
    

步骤 2: 配置 NFS 服务器

  1. 编辑 NFS 服务器的配置文件。在 Ubuntu 上,配置文件位于 /etc/exports

    sudo nano /etc/exports
    
  2. 在配置文件中添加要共享的目录及其权限。例如,如果要共享 /srv/nfs_share 目录,可以添加类似以下内容:

    
    

/srv/nfs_share *(rw,sync,no_subtree_check)


- `/srv/nfs_share`: 要共享的目录路径。
- `*`: 允许所有客户端访问。
- `rw`: 可读写权限。
- `sync`: 同步写入。
- `no_subtree_check`: 不检查子目录。3. 保存并关闭文件。4. 更新 NFS 服务器配置:

sudo exportfs -a


### 步骤 3: 启动 NFS 服务器1. 启动 NFS 服务器:

sudo systemctl start nfs-server


2. 如果需要,设置 NFS 服务器在系统启动时自动启动:

sudo systemctl enable nfs-server


### 步骤 4: 配置防火墙1. 如果有防火墙启用,确保允许 NFS 流量通过。NFS 使用 UDP 和 TCP 端口 2049。### 步骤 5: 配置客户端1. 在客户端系统上安装 NFS 客户端软件。同样地,命令取决于你的 Linux 发行版。2. 挂载 NFS 共享到客户端:

sudo mount <NFS服务器的IP或主机名>:<共享的目录> <本地挂载点>


例如:

sudo mount 192.168.1.205:/srv/nfs_share/projectname /mnt/nfs


### 注意事项:- 确保网络中的所有主机能够解析 NFS 服务器的主机名或 IP 地址。
- 请根据实际需求调整配置,例如添加访问控制、更改权限等。
- 对于生产环境,确保数据的安全性和完整性。
- 测试 NFS 服务器和客户端之间的连接和数据访问,以确保一切正常运行。以上是基本的 NFS 服务器搭建指南,具体步骤可能会因操作系统版本、网络环境等因素而略有不同。2.2、在k8s集群上安装NFS 工具:要在 Kubernetes 中挂载 NFS,你首先需要在你的 Kubernetes 集群所在的节点上安装 NFS 客户端。NFS 客户端软件通常在大多数 Linux 发行版的默认软件仓库中都可以找到。以下是在常见的几个 Linux 发行版上安装 NFS 客户端的方法:1. **在 Ubuntu 上安装 NFS 客户端:**

sudo apt update
sudo apt install nfs-common


2. **在 CentOS/RHEL 上安装 NFS 客户端:**

sudo yum install nfs-utils


安装完成后,你就可以在 Kubernetes 节点上使用 `mount` 命令手动挂载 NFS 共享,以确保 NFS 客户端已经正确安装并且可以正常工作。例如:

sudo mount -t nfs <NFS服务器IP地址或域名>:/path/to/nfs/share /local/mount/point


这里的 `/local/mount/point` 是你希望将 NFS 共享挂载到的本地目录。安装 NFS 客户端后,你可以按照之前提供的 Kubernetes 配置示例,在 Pod 中使用 Volume 来挂载 NFS 共享。确保在配置中正确设置了 NFS 服务器的地址和共享路径,并且在 Kubernetes 节点上已经可以通过 NFS 客户端正常访问该共享路径。请注意,你需要确保在 Kubernetes 集群中的每个节点上都安装了 NFS 客户端,以便能够在所有节点上挂载 NFS 共享。

2.3、应用到POD:
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-app-projectname-keycloak-pv

配置标签供pvc选择

labels:
pv: local-app-projectname-keycloak-pv
spec:
capacity:
storage: 30Gi
accessModes: # 访问模式

  • ReadWriteMany # 读写权限,可以被多个节点挂载
    persistentVolumeReclaimPolicy: Retain

存储类型,与底层真正存储对应(nfs只是一个代表,这里还可以配置cifs、clusterfs或者其他存储类型)

nfs:
path: /srv/nfs_share/projectname
server: 192.168.1.205


apiVersion: v1
kind: PersistentVolumeClaim
metadata:

pvc的名字,提供给pod用于绑定

name: local-app-projectname-keycloak-pvc
namespace: local-app
spec:
accessModes:
- ReadWriteMany
resources: # 请求的空间
requests:
storage: 30Gi
selector: # 标签选择器绑定对应的PV
matchLabels:
pv: local-app-projectname-keycloak-pv


2.4、keycloak 配置分布式缓存:

<?xml version="1.0" encoding="UTF-8"?>

<jgroups><!-- 定义一个名为"prod"的自定义JGroups堆栈 --><stack name="prod"><!-- 使用TCP协议 --><TCP bind_port="7800" port_range="30" recv_buf_size="20000000" send_buf_size="640000"/><!-- RED插件 --><RED/><!-- MPING插件 --><!-- 多播地址,默认为239.2.4.6 --><!-- 多播端口,默认为43366 --><!-- 发现运行次数,默认为3 --><!-- IP数据包生存时间,默认为2 --><MPING break_on_coord_rsp="true"mcast_addr="${jgroups.mping.mcast_addr:239.2.4.6}"mcast_port="${jgroups.mping.mcast_port:43366}"num_discovery_runs="3"ip_ttl="${jgroups.udp.ip_ttl:2}"/><!-- MERGE3插件 --><MERGE3 /><!-- FD_SOCK2插件 --><FD_SOCK2 /><!-- FD_ALL3插件 --><FD_ALL3 timeout="3000" interval="1000" timeout_check_interval="1000" /><!-- VERIFY_SUSPECT2插件 --><VERIFY_SUSPECT2 timeout="1000" /><!-- pbcast.NAKACK2插件 --><pbcast.NAKACK2 use_mcast_xmit="false" xmit_interval="200" xmit_table_num_rows="50"xmit_table_msgs_per_row="1024" xmit_table_max_compaction_time="30000" /><!-- UNICAST3插件 --><UNICAST3 conn_close_timeout="5000" xmit_interval="200" xmit_table_num_rows="50"xmit_table_msgs_per_row="1024" xmit_table_max_compaction_time="30000" /><!-- pbcast.STABLE插件 --><pbcast.STABLE desired_avg_gossip="2000" max_bytes="1M" /><!-- pbcast.GMS插件 --><pbcast.GMS print_local_addr="false" join_timeout="${jgroups.join_timeout:2000}" /><!-- UFC插件 --><UFC max_credits="4m" min_threshold="0.40" /><!-- MFC插件 --><MFC max_credits="4m" min_threshold="0.40" /><!-- FRAG4插件 --><FRAG4 /></stack>
</jgroups><cache-container name="keycloak"><transport cluster="my-cluster"/><local-cache name="default"><transaction transaction-manager-lookup="org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup"/></local-cache><local-cache name="realms"><encoding><key media-type="application/x-java-object"/><value media-type="application/x-java-object"/></encoding><memory max-count="10000"/></local-cache><local-cache name="users"><encoding><key media-type="application/x-java-object"/><value media-type="application/x-java-object"/></encoding><memory max-count="10000"/></local-cache><distributed-cache name="sessions" owners="2"  mode="SYNC" statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/sessions" preload="true"/></persistence></distributed-cache><distributed-cache name="authenticationSessions"  mode="SYNC" owners="2"  statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/authenticationSessions" preload="true"/></persistence></distributed-cache><distributed-cache name="offlineSessions" owners="2"  mode="SYNC" statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/offlineSessions" preload="true"/></persistence></distributed-cache><distributed-cache name="clientSessions" owners="2"  mode="SYNC" statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/clientSessions" preload="true"/></persistence></distributed-cache><distributed-cache name="offlineClientSessions" owners="2"  mode="SYNC" statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/offlineClientSessions" preload="true"/></persistence></distributed-cache><distributed-cache name="loginFailures" owners="2"  mode="SYNC" statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/loginFailures" preload="true"/></persistence></distributed-cache><local-cache name="authorization"  statistics="true"><encoding><key media-type="application/x-java-object"/><value media-type="application/x-java-object"/></encoding><memory max-count="10000"/></local-cache><distributed-cache name="work"   owners="2"  mode="SYNC" statistics="true"><expiration lifespan="-1"/><persistence><file-store path="/projectname/work" preload="true"/></persistence></distributed-cache><local-cache name="keys"><encoding><key media-type="application/x-java-object"/><value media-type="application/x-java-object"/></encoding><expiration max-idle="3600000"/></local-cache><distributed-cache name="actionTokens" owners="2"  mode="SYNC" statistics="true"><encoding><key media-type="application/x-java-object"/><value media-type="application/x-java-object"/></encoding><persistence><file-store path="/projectname/actionTokens" preload="true"/></persistence></distributed-cache>
</cache-container>

3、配置 jenkins

def pom
def version = “0.1.4”;
def verDateStr = “20240401”;

pipeline {
agent any

stages {stage('Checkout') {steps {// 检出Keycloak代码git credentialsId: 'MyCredentialsId', url: 'http://192.168.1.205:9980/projectname/porsso1903.git', branch: 'load_test'			}}stage('Build') {steps {sh 'cp -f conf/keycloak.conf quarkus/runtime/src/main/resources/META-INF/keycloak.conf'sh 'cp -rf conf/api.properties services/src/main/resources/api.properties'// 构建Keycloak			 sh 'mvn clean install -DskipTests'  }}stage('Docker Build & Push image to Nexus'){steps {script {version = params.versionecho "--------------Docker Build & Push image to Nexus-----------"+ version;//	pom = readMavenPom file: "./pom.xml" //  version = "${pom.properties.deployversion}"echo "docker阶段获取到的版本号:${version}"withCredentials([usernamePassword(credentialsId: 'Nexus', passwordVariable: 'password', usernameVariable: 'user')]) {sh "docker -v"sh "id jenkins"sh "docker build --build-arg JAR_VERSION=0.0.0.1.0 -f dockerfile2 -t sls.registry.k8s/projectname:${version} ." sh "docker login sls.registry.k8s -u $user -p admin*****"sh "docker push sls.registry.k8s/projectname:${version}"sh "docker rmi sls.registry.k8s/projectname:${version}"echo "镜像删除成功"}echo "--------------------输出pom version:${version}---------------------"}}}stage('Deploy to k8s'){steps {script{if(version == null){version = input id: 'Version-Input', message: '版本号为空,请输入要部署的版本号,如:1.0.0', ok: 'yes', parameters: [string(description: '拉取镜像的版本号', name: 'input-version')], submitter: 'projectname'echo "input已经执行version=${version}"}version = params.versionverDateStr = "20240331";withCredentials([usernamePassword(credentialsId: 'k8s-master-login', passwordVariable: 'pass', usernameVariable: 'user')]) { sh "echo $user"sh "echo $pass"def remote = [:]remote.name = 'k8smaster'remote.host = '192.168.1.222'remote.user = "$user"remote.password = "$pass"remote.allowAnyHosts = trueremote.pty=truetry {echo "k8s阶段获取到的版本号:${version}"sshCommand remote: remote, sudo: false, command: "sed -i -E 's/^( *image:.*projectname:)[0-9]+(\\.[0-9]+)*(.*)\$/\\1'${version}'\\3/' /home/projectname/keycloak/local-app-projectname-keycloak.yaml"sshCommand remote: remote, sudo: false, command: "sed -i -E 's/v[0-9]+\\.[0-9]+\\.[0-9]+_[0-9]+/v${verDateStr}/g'  /home/projectname/keycloak/local-app-projectname-keycloak.yaml"sshCommand remote: remote, sudo: true, command: "kubectl delete -f /home/projectname/keycloak/local-app-projectname-keycloak.yaml"sshCommand remote: remote, sudo: true, command: "kubectl apply -f /home/projectname/keycloak/local-app-projectname-keycloak.yaml"sshCommand remote: remote, sudo: true, command: "kubectl get pods --all-namespaces -o wide|grep app-projectname-keycloak"echo "try已执行!项目部署完成.."}catch (err){echo "我是catch发生错误了:${err}"}finally {echo "我是finally,yaml的镜像版本为${version}"}} }}}}

}

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

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

相关文章

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人

【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人 目录 【GenAI】使用GenAI堆栈构建视频分析和转录字幕聊天机器人高层架构入门指南克隆存储库指定您的API密钥构建和运行应用程序使用yt-whisper提交视频访问Dockerbot聊天服务结论推荐超级课程: Docker快速入门到精通K…

【数字后仿】isolation Cell基础

1、在芯片验证中,“isolation” 和 “复位值(reset value)” 是两个可能相关联但不同的概念。解释一下这两个术语: Isolation(隔离):在多电源域(power domain)的芯片设计中,当其中一个电源域关闭时(比如为了节能),隔离机制确保关闭的电源域不会影响到其他仍在工作…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时&#xff0c;你是如何设置QWidget&#xff0c;QPushButton等原生基础控件的样式的&#xff1f;是不是主要是两种方法&#xff1f; 1.直接在可视化的.ui文件中直接添加qss语句。 2.在代码中通过setStyleSheet(QString qss)来设置qss语句。 上述两种方法&#xff0c;在程…

【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

栈在表达式求值中的应用 导读一、表达式的形式二、波兰表达式与逆波兰表达式三、表达式之间的相互转换四、栈实现波兰表达式4.1 问题分析4.2 问题完善4.3 算法实现4.3.1 获取波兰表达式4.3.2 从右往左扫描表达式4.3.3 遇到操作数进行入栈操作4.3.4 遇到操作符进行对应操作4.3.5…

Qt元对象系统

第二章Qt元对象系统 文章目录 第二章Qt元对象系统1.什么是元对象&#xff1f;2.元对象系统组成3.信号与槽信号和槽的本质绑定信号与槽自定义槽定义槽函数必须遵循一下规则槽函数的类型自定义槽案例 自定义信号自定义信号需要遵循以下规则信号和槽重载二义性问题 4.内存管理1. 简…

【数据库索引】【面试题】【SQL】什么时候不需要用索引?

在数据库查询优化中,索引是一种重要的工具,可以提高查询性能。然而,并不是所有的情况下都适合使用索引。 以下是一些情况下(收集整理)不建议使用索引: 更新频繁的列:索引会占用数据库资源,当列经常被更新时,索引可能会变得过时,导致查询性能下降。 小数值类型:对于…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位&#xff0c;提升体验。 2.包大小优化 减小包中静态资源&#xff0c;例如图片文件&#xff0c;可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

跨平台移动端开发技术对比

跨平台移动端开发技术对比 移动互联网时代,开发一款App通常需要覆盖iOS和Android两大平台。为了提高开发效率、控制成本,很多团队会选择跨平台开发的技术方案。目前主流的跨平台开发技术包括React Native、Flutter、Weex、uni-app等。本文将对比分析几种主流跨平台技术的优劣。…

了解游戏相关知识

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

【嵌入式DIY实例】-DIY便携式粉尘分析仪

DIY便携式粉尘分析仪 文章目录 DIY便携式粉尘分析仪1、硬件准备2、硬件接线3、代码实现细粉尘分析仪是一种用于监测废气通过管道、烟囱或烟道时悬浮在废气中的粉尘或细颗粒浓度的装置; 通常,来自工业燃烧过程或空气过滤系统的废气。 悬浮在大气中一段时间的固体颗粒构成尘埃。…

MySQL常见故障案例与优化介绍

前言 MySQL故障排查的意义在于及时识别并解决数据库系统中的问题&#xff0c;确保数据的完整性和可靠性&#xff1b;而性能优化则旨在提高数据库系统的效率和响应速度&#xff0c;从而提升用户体验和系统整体性能。这两方面的工作都对于保证数据库系统稳定运行、提升业务效率和…

加域报错:找不到网络路径

在尝试将计算机加入Windows域时&#xff0c;如果收到“找不到网络路径”的错误提示&#xff0c;可能的原因及解决方法如下&#xff1a; 网络连接问题&#xff1a;确保计算机与域控制器之间的物理网络连接是正常的&#xff0c;可以通过ping命令测试与域控制器的连通性。例如&…

LeetCode 56. 合并区间

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3…

HarmonyOS 应用开发之LifecycleService接口切换LifecycleData接口切换

LifecycleService接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onStart?(): void;ohos.app.ability.ServiceExtensionAbility.d.tsonCreate(want: Want): void;onCommand?(want: Want, startId: number): void;ohos.app.ability.ServiceExtensionAbility.…

算法训练营第27天|LeetCode 39.组合总和 40.组合总和2 131.分割回文串

LeetCode 39.组合总和 题目链接&#xff1a; LeetCode 39.组合总和 解题思路&#xff1a; 用回溯的方法&#xff0c;&#xff0c;注意这次回溯不是i1&#xff0c;而是i&#xff0c;是因为可用重复选取。 代码&#xff1a; class Solution { public:vector<vector<i…

nginx怎么配置https访问

一、安装nginx yum -y install nginx二、准备证书 申请证书&#xff0c;并将证书上传到/etc/pki/nginx/目录&#xff0c;证书可以在腾讯云等云平台申请 二、配置nginx user root; worker_processes auto;events {worker_connections 1024; }http {include mime.t…

关于ffmpeg的安装和编码格式问题

安装 5.1安装 https://blog.csdn.net/JineD/article/details/113528285 3.4.8安装 https://blog.csdn.net/qq_42528520/article/details/120487457 编码格式 ffmpeg能转很多的视频格式&#xff0c;不同的格式对应的版本也不一样。如上述安装5.1和3.4.8都是一样的流程&#xff0…

mysql故障及解决分析

目录 MySQL 单实例故障排查 MySQL 单实例故障排查 &#xff08;1&#xff09;故障现象 1 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql/mysql.sock (2) 问题分析&#xff1a;以上这种情况一般都是数据…

c# 插值搜索-迭代与递归(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组&#xff0c;编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素&#xff0c;跳转搜索需要 O(? n) 时间&#xff0c;二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进&#xff0c;…