k8s NFS 服务器更换 ip 后持久卷处理
前言k8s 的服务器在安装完成后,难免会遇到服务器需要整个更换 ip 段的情况,虽然很麻烦,需要改各种外部依赖的 Endpoints、重装 k8s ……但是也不得不做,其中最麻烦的就属以 NFS 为基础的持久卷了
遇到的小问题k8s使用的 NFS 服务器更换 ip ,会导致 pvc 挂载不上,按说修改下挂载参数的 NFS 服务器 ip 就行,而挂载参数是在 pv 里面设置的,但是 pv 在创建后里面的参数无法修改,使用 kubectl edit 时候提示 k8s 禁止修改已经创建好的 pv
尝试解决狗歌搜索下,发现前人也遇到了这个问题 https://serverfault.com/questions/1033326/kubernetes-persistencevolume-nfs-ip-change
文章里面第一个回答本质还是去改 pv 的配置,等 kubectl apply -f pv.yaml 就会发现 kubectl 提示不能更改,看到了下面提供了一个 k8s 论坛的链接:https://discuss.kubernetes.io/t/update-persistentvol ...
Golang 从零开始搭建自动部署平台,一键部署基础服务
前言为什么要做公司用到的中间件和用到的组件超级多,JDK、Nginx、Docker、Rabbitmq、Harbor、Mysql、pgsql、MinIO……大概有 20 多个,虽然写了部署文档,直接复制粘贴就能部署,但是每次都得折腾差不多 5-6 个小时左右,而且这期间得一直盯着,和组里另一个运维(已经奏了😭)聊天的时候,他是这么说的:“来公司的别的没学会啥,复制粘贴倒是变得很熟练了😂”
做了一段时间之后,总感觉每次都这么折腾很没有意义,纯属浪费时间,就决定要把这个过程自动化
为什么不选择 Ansible在运维(网工也有)自动化部署里面,有着非常好用的工具——Ansible ,那么为什么还是要自己折腾一番,自己单独搞一套出来捏?考虑按照优先级有以下几点
想做一些定制化的东西,用 Ansible 不大好弄
有一些定制化的需求,如果是自己开发就很好做,但是用 Ansible 就不大好整,随便举几个例子
1、公司的软件仓库非常慢(共享 20Mbps 带宽,和镜像仓和代码仓还有一堆服务器共用,在开发提交代码、CI/CD 传镜像和客户服务器下载镜像的时候下载会非 ...
Golang 写爬虫快速拿到数据的小技巧
前言最近在帮忙做内蒙那边的爬虫项目,因为公司基本上都是做业务开发的,会写爬虫的基本上是没有,我之前又做过一点,所以就找到我咯
目标是爬取知网、超星期刊和读秀的文章数据,不过知网那边在做的时候史诗性的加强了反爬虫策略(①今天打开和明天打开的页面都看起来一样,但是元素的位置变了 ;②需要获取文章的链接,但是链接在 5 分钟到 3 小时左右的随机时间就会过期,这就导致批量获取完链接再去抓详情页的数据的时候进不去详情页了😂)
协商之后,只需要做超星和读秀的,难度小了不少
验证码由于提供的服务器没有显卡,加上 CPU 的性能也比较拉,人家不愿意给设备加钱但是愿意盯着去手点验证码,这块就没有怎么去折腾,知网的验证码比较简单,当时尝试了 OCR 的方法,用的 sml2h3/ddddocr: 带带弟弟 通用验证码识别OCR pypi版 (github.com) 这个搭了个 API Server ,然后去调它的接口拿 OCR 的结果,知网验证码的问题解决了,读秀和超星是一套验证码机制,里面是扭曲图形加扭曲文字的形式,因为上面的原因,就没有深入研究
开发按说爬虫一般都是用 Python 写,也 ...
Golang 搞定 k8s 应用无网自动化滚动升级
前言我们有一些客户为了网络安全,在我们把服务部署完之后,就把服务器全部断开外网访问,在我们需要更新的时候,给我们一个 Windows 的跳板机,我们需要先找一台 Linux 的机器 dcoker pull image ,然后 docker save 保存 tar 包,scp 保存这个 tar 包到电脑,用 ToDesk 把这个 tar 包传到跳板机,然后在跳板机上 scp 这个 tar 包到 k8s 集群的各个节点上,然后 kubectl edit deployment.apps 修改应用负载配置文件里面 image 配置,把 tag 修改成新版的,然后 kubectl get pods 查看启动情况,如果没有启动再 kubectl logs -f 看日志
上面这套流程,实在是太过麻烦,公司有一套应用中心,可以直接滚动升级,之前的文章也稍稍提到过,但是这个应用中心设计的时候要求必须联网才能使用,需要和公有云上面跑的应用市场联动,如果没有外网就不能用它一键升级,也就得回到上面叙述的超复杂更新流程
体会了几次这样的流程,加上开发那边发版频繁,每次更新都走一遍这样的流程,实在是不能忍,反复的 ...
解决 docker 和 docker-compose 和内网 IP 冲突问题
前言docker 一键部署爽,内网冲突火葬场。最近实施去客户那边调试,某个屋的设备可以连上网关,而某个屋的设备都不行,找了半天没有找到原因,于是晚上直接一个电话敲到了我这里,让我帮忙康康
寻找原因之前也遇到过了这种情况,简单排除掉了物联网设备那边的网关设置问题,马上想到了 docker 的问题,docker network ls 一看,发现 docker 和 docker-compose 占用的客户的地址,客户使用了 172.0.0.0/8 做为内网地址(不是很标准的做法,但是很常见),docker 占用了 172.17.0.0/16 作为桥接地址,docker-compose 跑了个 Harbor ,把 172.18.0.0/16 也给占了,物联网设备那边的网关下一跳是 172.18.12.1 ,于是华丽丽的冲突了,物联网路由访问咱们网关机器不通,于是连接不上
修改 Docker 桥接网段非常简单,有个 bip 的设置
vim /etc/docker/daemon.json
"bip":"10.255.0.1/16" ...
Jenkins Golang CI 打包上传到镜像仓,一个 shell 脚本搞定
前言写程序难免经历要很多调试,对于 K8S 开发,如果需要和集群内的其它服务进行交互,要么需要用 VPN 连接到集群内部,要么就需要打包 Docker 镜像,然后更新集群内的版本,就我来说,不是很喜欢前种方法,因为连到集群之后查资料就不是很方便,另外每次发版也是要走 CI 流程的,不妨做下 Golang 的 CI
公司技术栈是 Java + SpringBoot ,基本上没啥 Golang 的项目,自然也没有 Golang 的 CI 脚本,所以需要自己做,之前我弄过不少 CI ,不过是 Github Action 和 Gitea + Drone 之类的,需要写一个 yaml 文件,同时有很多可以用的组件 (use:xxx 这样的),是基于 Docker 的流水线,很方便,而公司使用的是 Jenkins ,而且是非常老版的 Jenkins ,所以只能写 Shell 脚本来打包
编写 Shell 脚本虽然我很不喜欢 Shell 脚本,不愿意写这玩意儿,不过还好不需要从零开始,找隔壁组大佬要到了 Java 的 CI 脚本,可以在它的基础上简单改改就行
之前我做了套 Gitea + Dron ...
【低价好物】50块钱的光纤交换机(三)?皖通邮电ZXWT CTNS 180X&150X
本篇为系列文章之第三篇
第一篇传送门:【低价好物】50块钱的光纤交换机(一)?分组传送终端格林威尔GPN710
第二篇传送门:【低价好物】50块钱的光纤交换机(二)?瑞斯康达iTN系列分组传送终端
往期【低价好物】合集(从新到旧):
【低价好物】50块钱一个的移动IEG-100系列9口全千兆边缘智能网关,会翻车吗?
【低价好物】50块钱的光纤交换机(三)?皖通邮电ZXWT CTNS 180X&150X
【低价好物】50块钱的光纤交换机(二)?瑞斯康达iTN系列分组传送终端
【低价好物】50块钱的光纤交换机(一)?分组传送终端格林威尔GPN710
【低价好物】让10多年前的防火墙继续在今天发光发热——DPTech FW1000-GC-N
皖通邮电的文档超难找,不建议没有网管交换机配置经验的同学入手
前言一时捡漏一时爽,一直捡漏一直爽!在前两期之后又有上交换机的需求了,又想玩点儿新的,于是又开始在海鲜市场搜寻起来,于是让我发现了皖通邮电(中兴子公司)的 180X & 150X ,价格也是相当的合适,赶紧入手几个康康
入手渠道、价格、设备基本信息和外观如图
ZXWT ...
k8s Golang 应用开发初体验
前言两年之前玩过 k8s ,搭了一套 k8s 集群(见:k8s豹之篇——搭建自己的 k8s 集群,实战部署 LuckyBlog 和 LuckyTalk 服务),来公司之后一直负责各个生产环境的 k8s 集群的运维,先是从运维的角度对 k8s 的理解深入了不少,最近又整了一套服务器运行状态监控,从开发的角度对 k8s 又有了一些新的理解,在这里记录一下
项目概述简介之前在这篇文章提到过一点:如何用超简单方法写一个Prometheus的Exporter ,之前做的是一个单体应用,由于公司之前的监控平台必须有外网连接才能登录,登录了之后才能拿到 json 格式的数据,而很多客户没有给服务器开放外网,导致没有办法登录到监控平台去拿数据,另一方面,由于是单体应用,需要手动部署,所以如果有哪里需要部署,需要我自己去上传、运行,很是麻烦。而公司对于 k8s 应用有着自动部署的平台,鼠标点一下就能部署,所以就想着一方面想脱离公司的监控平台直接拿到运行状态数据,一方面把自己的应用也做成 k8s 的,方便实施去部署,避免自己一个个去部署的尴尬和麻烦
各个服务器的运行状态是使用 Prometheus Exp ...
DDNS 分线路解析分流,减轻站点流量压力
前言9 月的时候,为了后面开发准备学习一些新玩意儿,按照我的习惯,学习新东西一般比较倾向于做一个 mini project ,结合自己的需求,于是选了这个 DDNS 分线路解析作为学习的 mini project
学到的新玩意儿
viper 读取配置文件
之前是用 ini 包做的解析,使用 viper 可以读取 JSON 、 TOML 、YAML、 INI 在内的多种格式的配置文件,甚至是 Java 的 properties 文件
gin 静态文件打包
通过 Go 的 embed 包,可以把所有文件(比如前端文件和静态资源)打包进一个二进制文件运行,方便部署的同时可以规避同时打开文件数量过多的问题(公司有个老项目,java 写的,没有打成一个 jar 包,访问量大了时候经常出问题)
Gracefully Shutdown
Gin 可以在等待处理完当前的连接之后再关闭,这个机制叫做 Gracefully Shutdown ,需要用到 Go 的 channel
template
顾名思义,是“模板”,可以在不通过请求接口的情况下,拿到后端对象的数据,由于是在服务器端渲染的,客 ...
如何用超简单方法写一个Prometheus的Exporter
前言想要监控公司生产环境一些节点的运行状态,目前公司做的有监控平台,可以拿到各个节点的运行数据,但是是看不到趋势的,只能看到当前时间点的状态,为了能够看到数据的趋势,为服务器的扩缩容做更好的决策,需要写一个 Prometheus 的 Exporter 将监控平台的数据导出
监控平台需要登录,数据有 API 接口、json ,具体登录平台拿 json 数据的过程不表
实践一般来说,用 Go 来写 Prometheus 的 Exporter 是用 Prometheus 官方的实现:https://github.com/prometheus/client_golang 来做,简单看了下网上的示例,如果要实现动态 label 则很麻烦,需要实现一个自己的 Controller ,如果只暴露一两个指标,就很方便,我们希望能够用服务器的主机名和服务器的 IP ,以及客户的名称作为 label ,方便后面做可视化的时候筛选指标。那么有没有什么简单一点的方式呢
哎,还真有,来介绍下今天的主角:https://github.com/VictoriaMetrics/metrics 用它的时候和写这篇文章的 ...