K8s: Helm搭建mongodb集群(1)
mongodb 集群搭建
- mongdb 部署前 需要创建 pvc, pv 和 sc,如果在云上会自动创建
- helm 应用中心: https://artifacthub.io
1 )Helm 安装 mongodb
A. 无本地存储配置,重启数据消失
- 在 https://artifacthub.io/packages/helm/bitnami/mongodb?modal=install 这个界面弹出的窗口中
- $
helm repo add bitnami https://charts.bitnami.com/bitnami- 这样就添加了这个源,通过 $
helm repo ls
- 这样就添加了这个源,通过 $
- $
helm install my-mongodb bitnami/mongodb --version 13.8.1
- $
- 上面的 helm install 命令是官网提供的最简单的,在安装的时候可以配置一些参数
- 如:$
helm install my-mongo bitnami/mongodb --version 13.8.1 --set persistence.enabled=false,auth.rootPassword="123456_mongodb" - 文档:https://artifacthub.io/packages/helm/bitnami/mongodb#mongodb-parameters
- 不同的参数,使用
,分隔
- 如:$
- 注意,低版本的 helm 的安装命令可能安装会报错,请使用 helm-v3.11.1 以上版本
- 执行
install命令后,会输出以下命令NAME: my-mongo LAST DEPLOYED: Wed May 1 15:32:14 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.8.1 APP VERSION: 6.0.4** Please be patient while the chart is being deployed **MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:my-mongo-mongodb.default.svc.cluster.localTo get the root password run:export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)To connect to your database, create a MongoDB® client container:kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashThen, run the following command:mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORDTo connect to your database from outside the cluster execute the following commands:kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 &mongosh --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD - 上面提示中,让我们把密码设置成当前节点的环境变量
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)- 执行上面一行写入环境变量
- 其中这里
kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d - 可以看到密码是上面设置的: 123456_mongodb
- $
printenv | grep MON这样也可以看到环境变量中设置的密码MONGODB_ROOT_PASSWORD=123456_mongodb
- 通过上面给的这个命令
- $
kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashIf you don't see a command prompt, try pressing enter. I have no name!@my-mongo-mongodb-client:/$ - 这里,可以开启一个mongodb的客户端
- 注意,这里的镜像
docker.io/bitnami/mongodb:6.0.4-debian-11-r10需要提前pull下 - 这个 docker.io 可能会有网络问题,参考 $
docker pull bitnami/mongodb:6.0.4-debian-11-r10
- $
- 通过上面的命令来进入数据库,注意这里, -p 后面基本没用,还得重新输入密码,因为安全性问题被高版本禁了
- $
mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD - 输入密码,这时候就已经连接进入 mongodb 数据库了,可以进行操作了
- 注意,这个pod如果一段时间不操作,会自动退出
- $
- $
kubectl get all | grep my-mongo从这里可以看出,它是一个 deployment 而不是 StatefulSets- 因此,它不会存储任何状态,退出后,数据就丢了
- 从外部访问它,上面也提示了命令,进行转发
- $
kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 --address 0.0.0.0Forwarding from 0.0.0.0:27017 -> 27017 - 注意,如果是云上转发,安全组需要配置入站规则
- 这时候,外部即可访问,通过node节点的ip加端口加用户名和密码
- 当然此作为简单示例,没有接入 Ingress 网络
- $
- 查看 deployment $
kubectl get deploymentNAME READY UP-TO-DATE AVAILABLE AGE my-mongo-mongodb 1/1 1 1 3h55m - 重新部署 $
kubectl rollout restart deployment my-mongo-mongodbdeployment.apps/my-mongo-mongodb restarted - 并且重新 port-forward 转发 $
kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 --address 0.0.0.0 - 发现数据丢失了 …
- 查看密码 $
kubectl get secret | grep my-mongo-mongodbmy-mongo-mongodb Opaque 1 4h9m my-mongo-mongodb-token-89wcr kubernetes.io/service-account-token 3 4h9m - $
kubectl get secret my-mongo-mongodb -o yamlapiVersion: v1 data:mongodb-root-password: MTIzNDU2X21vbmdvZGI= kind: Secret metadata:annotations:meta.helm.sh/release-name: my-mongometa.helm.sh/release-namespace: defaultcreationTimestamp: "2024-05-01T07:32:16Z"labels:app.kubernetes.io/component: mongodbapp.kubernetes.io/instance: my-mongoapp.kubernetes.io/managed-by: Helmapp.kubernetes.io/name: mongodbhelm.sh/chart: mongodb-13.8.1name: my-mongo-mongodbnamespace: defaultresourceVersion: "307736"uid: b0ef31fe-60cc-46a3-8bc6-510692b96d8d type: Opaque- 可以看到,密码被base64加密了
- 现在需要重新安装有存储的,把之前的卸载了
- $
kubectl uninstall my-mongo - 这样会同步删除其他相关的附带配置, 使用 delete 是删不干净的
- $
- 无本地存储配置,重启数据消失
B.搭建 mongodb 有本地存储,重启数据保留
- 在安装的时候和上述有区别, 直接安装是不会成功的,需要配置 PVC
- persistence.size 默认是8Gi, 如果在云上可能是10的倍数
- $
helm install my-mongo bitnami/mongodb --version 13.8.1 --set persistence.size=10Gi,auth.rootPassword="123456_mongodb"- 这时候会自动创建 pvc
NAME: my-mongo LAST DEPLOYED: Thu May 2 08:59:53 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.8.1 APP VERSION: 6.0.4** Please be patient while the chart is being deployed **MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:my-mongo-mongodb.default.svc.cluster.localTo get the root password run:export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)To connect to your database, create a MongoDB® client container:kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashThen, run the following command:mongosh admin --host "my-mongo-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORDTo connect to your database from outside the cluster execute the following commands:kubectl port-forward --namespace default svc/my-mongo-mongodb 27017:27017 &mongosh --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD - 注意,这里如果在云上,会自动创建 pvc, pv, storage class, 以及云硬盘, 在本地的话,需要自己处理
- 参考: https://blog.csdn.net/Tyro_java/article/details/138157501
- 这时候会自动创建 pvc
- $
kubectl get pvc验证获取 pvc - 上面提示的命令,都执行以下,进行开启终端和进行连接
- 以及参考上面无存储的进行转发处理,在外部进行客户端的连接, 以及重启后验证数据是否丢失
- 如果在云上,端口这块,要配置安全组规则
- 注意,
uninstall执行的时候,存储也会丢失,注意提前备份 - 更多的配置,参考文档
2 )Helm 搭建mongodb集群
- $
helm install my-mongo bitnami/mongodb --version 13.8.1 --set architecture="replicaset",persistence.size=10Gi,auth.rootPassword="123456_mongodb"- 注意, 这里添加了
architecture="replicaset",默认值是 standalone - 这样就可以设置成主从数据库了
NAME: my-mongo LAST DEPLOYED: Thu May 2 13:46:04 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.8.1 APP VERSION: 6.0.4** Please be patient while the chart is being deployed **MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:my-mongo-mongodb-0.my-mongo-mongodb-headless.default.svc.cluster.local:27017my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017To get the root password run:export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 -d)To connect to your database, create a MongoDB® client container:kubectl run --namespace default my-mongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r10 --command -- bashThen, run the following command:mongosh admin --host "my-mongo-mongodb-0.my-mongo-mongodb-headless.default.svc.cluster.local:27017,my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
- 注意, 这里添加了
- $
kubectl get allNAME READY STATUS RESTARTS AGE pod/my-mongo-mongodb-0 1/1 Running 0 2m18s pod/my-mongo-mongodb-arbiter-0 1/1 Running 0 2m18sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 6d2h service/my-mongo-mongodb-arbiter-headless ClusterIP None <none> 27017/TCP 2m18s service/my-mongo-mongodb-headless ClusterIP None <none> 27017/TCP 2m18sNAME READY AGE statefulset.apps/my-mongo-mongodb 2/2 2m18s statefulset.apps/my-mongo-mongodb-arbiter 1/1 2m18s- 可以看到是 statefulset 而非 deployment
- 这里 Arbiter永远是Arbiter,Arbiter 节点只参与投票,不能被选为 Primary,并且不从 Primary 同步数据
- 而Primary可能退下来成为Secondary,而Secondary可能在选举期间成为Primary
- 过一会儿 $
kubectl get po -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-mongo-mongodb-0 1/1 Running 0 7m15s 10.244.1.90 node1.k8s <none> <none> my-mongo-mongodb-1 1/1 Running 0 7m05s 10.244.1.91 node1.k8s <none> <none> my-mongo-mongodb-arbiter-0 1/1 Running 0 7m15s 10.244.1.89 node1.k8s <none> <none>- 可以看到,现在已经有2个节点,以及一个选举节点
- 按照上面提示给出的命令进行配置环境变量,以及客户端不再赘述
- 要连接这个集群上面也给出了命令提示
mongosh admin --host "my-mongo-mongodb-0.my-mongo-mongodb-headless.default.svc.cluster.local:27017,my-mongo-mongodb-1.my-mongo-mongodb-headless.default.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD- 这里是主从的集群,有2个库,my-mongo-mongodb-0 和 my-mongo-mongodb-1
- 如果一台挂掉,另一台还会继续提供服务
- 如果想要连接一台,就把其中的一台给去掉
- 选择其中之一进行连接,你就会知道,连接的是主节点还是从节点
- 如果在从节点执行查询前,还需要设置查询的权限, 执行 $
rs.secondaryOk() - 关于扩容和缩容
- 扩容 $
kubectl scale statefulset <statefulset-name> --replicas=<new-replica-count> -n <namespace> - 缩容 $
kubectl scale statefulset <statefulset-name> --replicas=<new-replica-count> -n <namespace> - 如果扩容缩容操作在云上,可以直接调整
- 扩容 $
相关文章:
K8s: Helm搭建mongodb集群(1)
mongodb 集群搭建 mongdb 部署前 需要创建 pvc, pv 和 sc,如果在云上会自动创建helm 应用中心: https://artifacthub.io 1 )Helm 安装 mongodb A. 无本地存储配置,重启数据消失 在 https://artifacthub.io/packages/helm/bitnami/mongodb…...
应用分层和企业规范
目录 一、应用分层 1、介绍 (1)为什么需要应用分层? (2)如何分层?(三层架构) MVC 和 三层架构的区别和联系 高内聚: 低耦合: 2、代码重构 controlle…...
Flutter笔记:Widgets Easier组件库(1)使用各式边框
Flutter笔记 Widgets Easier组件库(1):使用边框 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…...
OpenHarmony实战开发-上传文件
Web组件支持前端页面选择文件上传功能,应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中,当用户在前端页面点击文件上传按钮,应用侧在onShowFileSelector()接口中收到文件上传请求,在此接…...
外贸企业邮箱是什么?做外贸企业邮箱哪个好?
外贸企业邮箱是什么?外贸企业在进行跨国沟通时必不可少的工具就是外贸企业邮箱,外贸企业邮箱需要具备的条件就是海外邮件抵达率高、安全稳定、多语言沟通。而我们又怎么选择一个适合的外贸企业邮箱呢?小编今天带您一起了解。 一、外贸企业邮…...
写一个简单的程序
思路分析: 1. 导入必要的库 首先,确保你的项目中包含了AWT或Swing库,因为我们将使用它们来创建图形界面。 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import j…...
CentOS安装Docker指南
Docker安装与配置教程 Docker作为一种轻量级的虚拟化技术,在现代软件开发和运维中扮演着重要的角色。下面,我将以技术博主的身份,向大家详细介绍如何在Linux系统上安装和配置Docker,特别是如何设置Docker的监听地址和端口&#x…...
python绘图(pandas)
matplotlib绘图 import pandas as pd abs_path rF:\Python\learn\python附件\pythonCsv\data.csv df pd.read_csv(abs_path, encodinggbk) # apply根据多列生成新的一个列的操作,用apply df[new_score] df.apply(lambda x : x.数学 x.语文, axis1)# 最后几行 …...
Android(Java)项目支持Kotlin语言开发
Android(Java)项目通过相关Kotlin设置后,允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境: Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项: 第一步:在项…...
Terraform创建模块
模块就是包含一组Terraform代码的文件夹,可以通过模块直接使用别人编写好的Terraform代码来创建资源。 Terraform模块是编写高质量Terraform代码,提升代码复用性的重要手段,可以说,一个成熟的生产环境应该是由数个可信成熟的模块组…...
《华为鸿蒙:从备胎到主角的崛起之路》
华为鸿蒙操作系统的发展历程可以追溯到 2012 年,当时华为开始规划自有操作系统鸿蒙 OS。然而,直到 2019 年 5 月,鸿蒙才正式进入开发阶段。 2019 年 8 月 9 日,华为正式发布了鸿蒙操作系统。 鸿蒙系统的首个版本是于 2019 年推出…...
FPGA学习笔记(2)——Verilog语法及ModelSim使用
1.1 语法 1、赋值语句 和 < 为阻塞赋值,当该语句结束时,下一个语句才开始执行,串行执行 < 为非阻塞幅值,该语句和整个语句块同时执行,并行执行 1.2 ModelSim使用 1、修改源文件路径:File -> …...
2024年十大AI工具,让你的工作学习效率飞跃
在这个迅速变化的数字时代,人工智能技术正在以前所未有的速度发展和革新。AI技术不仅深入科研、医疗和教育等领域,还广泛应用于日常生活和商业活动中。本文梳理了2024年十款最好用的AI工具,它们各有特色,能极大提升工作效率和生活…...
linux之NAMP
linux之NAMP Nmap(Network Mapper)是一个开源的网络扫描和安全审计工具。它被设计用来快速地扫描大型网络,尽管它也可以对单个主机进行有效的扫描。Nmap利用原始IP数据包以多种方式探测目标网络上的主机、服务(应用程序名称和版本…...
uniapp 禁止截屏(应用内,保护隐私)插件 Ba-ScreenShot
禁止截屏(应用内,保护隐私) Ba-ScreenShot 简介(下载地址) Ba-ScreenShot 是一款uniapp禁止应用内截屏的插件,保护隐私,支持禁止截屏、放开截屏 截图展示 也可关注博客,实时更新最…...
数字电路-5路呼叫显示电路和8路抢答器电路
本内容涉及两个电路,分别为5路呼叫显示电路和8路抢答器电路,包含Multisim仿真原文件,为掌握FPGA做个铺垫。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 一、5路呼叫显…...
C++中的函数签名
前言: 很多C初学者会发现函数签名这一概念在C的学习过程中经常出现,然而很多人往往不太了解函数签名包括些什么,本文章将从一个初学者的角度出发,详细解释函数签名这一概念。 在C中,函数签名用于唯一地识别函数重载。…...
Mac brew安装Redis之后更新配置文件的方法
安装命令 brew install redis 查看安装位置命令 brew list redis #查看redis安装的位置 % brew list redis /usr/local/Cellar/redis/6.2.5/.bottle/etc/ (2 files) /usr/local/Cellar/redis/6.2.5/bin/redis-benchmark /usr/local/Cellar/redis/6.2.5/bin/redis-check-ao…...
安卓应用开发(一):工具与环境
开发工具 Android Studio,用于开发 Android 应用的官方集成开发环境 (IDE)。包括以下功能: 基于Gradle的构建系统 gradle是一个项目构建工具,将源工程打包构建为apk 安卓模拟器统一环境代码编辑模拟器实时更新Github集成Lint功能࿰…...
基于springboot+vue+Mysql的在线动漫信息平台
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
OpenRGB:一键终结RGB灯光混乱,开源免费的多品牌设备统一控制方案
OpenRGB:一键终结RGB灯光混乱,开源免费的多品牌设备统一控制方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgra…...
当你能证明你的代码能带来流量时,你就永远不会被视为“垃圾”。
在商业世界里,代码本身没有价值,代码产生的结果才有价值。 如果你写的代码逻辑完美、架构优雅、注释清晰,但用户不用、业务不增长,那它在老板眼里就是“成本”,甚至是“垃圾”。如果你写的代码哪怕有些粗糙、用了“笨办…...
阿联酋人工智能大学:AI能在战争迷雾中做出理性判断吗?
这项由阿联酋穆罕默德本扎耶德人工智能大学和美国马里兰大学共同完成的研究发表于2026年3月,论文编号为arXiv:2603.16642v1。有兴趣深入了解的读者可以通过该编号查询完整论文。在人类历史上,预测战争走向一直是个极其困难的任务。就像我们很难在暴风雨中…...
用MediaPipe和Python做个隔空切水果游戏:从手势骨架提取到简单游戏逻辑实现
用MediaPipe和Python打造体感切水果游戏:从手势识别到游戏逻辑全解析 还记得小时候在街机厅玩《水果忍者》的畅快感吗?现在,我们完全可以用Python和MediaPipe技术,在电脑前通过手势隔空切水果!本文将带你从零开始&…...
高效对接Tiktok电商API:PHP开发者的一站式解决方案指南
高效对接Tiktok电商API:PHP开发者的一站式解决方案指南 【免费下载链接】tiktokshop-php Unofficial Tiktok Shop API Client in PHP. Use API version 202309 and later 项目地址: https://gitcode.com/gh_mirrors/ti/tiktokshop-php 在瞬息万变的电商生态中…...
防火墙旁挂模式实战:用华为模拟器ENSP搭建VRF+OSPF实验环境(保姆级)
华为eNSP防火墙旁挂模式全实战:从VRF设计到流量抓包分析 在企业网络架构中,防火墙的部署方式直接影响网络安全策略的实施效果。旁挂模式作为一种灵活部署方案,既能实现流量精细化管控,又避免了单点故障风险。本文将带您使用华为eN…...
AI的“血管”:从大模型需求看6G、高速光纤与智算中心网络的技术变革
大模型训练与推理的爆发,正以前所未有的力度重塑通信网络基础设施。6G、高速光纤、智算中心网络,正成为AI基础设施的“血管”,承载着算力的血液,决定智能的极限。当GPT-5.4的推理能力逼近人类专家,当Sora可以生成一分钟…...
从“炼丹”到“调参”:聊聊反向传播里那些容易被忽略的梯度细节(以PyTorch为例)
从“炼丹”到“调参”:聊聊反向传播里那些容易被忽略的梯度细节(以PyTorch为例) 在深度学习的世界里,反向传播算法就像炼金术士的魔法书,而梯度则是那些隐藏在公式背后的神秘力量。许多开发者能够熟练地调用.backward(…...
String、StringBuilder、StringBuffer 的本质区别
作为 Java 开发者,String、StringBuilder、StringBuffer 这三个类几乎每天都在用。但面试官总爱问这道题,因为它背后藏着 JVM 内存模型、线程安全、性能优化等核心知识点。今天我们从本质出发,彻底把这三个类讲透。一、String 为什么不可变&a…...
Qwen3-32B-Chat微调实战:提升OpenClaw代码生成任务的准确性
Qwen3-32B-Chat微调实战:提升OpenClaw代码生成任务的准确性 1. 为什么需要微调Qwen3-32B-Chat? 去年夏天,当我第一次尝试用OpenClaw自动化我的开发工作流时,遇到了一个令人沮丧的问题:模型生成的代码虽然语法正确&am…...
