分类目录归档:技术

kuboard v3 快速部署

Kuboard 官网给的 k8s 单节点快速部署似乎不太好用,直接用 docker 的翻译了一份,用于快速部署。

---
apiVersion: v1
kind: Namespace
metadata:
  name: kuboard
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kuboard
  namespace: kuboard
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kuboard
  template:
    metadata:
      labels:
        app: kuboard
    spec:
      containers:
      - name: kuboard
        image: eipwork/kuboard:v3
        ports:
        - containerPort: 80
          name: http
        - containerPort: 10081
          name: agent
        env:
        - name: KUBOARD_ENDPOINT
          value: "http://192.168.26.133:30080"  # 请替换为您的实际内网 IP
        - name: KUBOARD_AGENT_SERVER_TCP_PORT
          value: "10081"
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        hostPath:
          path: /etc/kuboard/data
          type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: kuboard-svc
  namespace: kuboard
spec:
  selector:
    app: kuboard
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30080
  - name: agent
    port: 10081
    targetPort: 10081
  type: NodePort

Kubard 官网:https://kuboard.cn/

#Kubernetes

Ubuntu 22.04设置DNS

DNS域名系统是网络基础架构的核心部分,提供了一种将域名转换为IP地址的方法。

您可以将DNS视为互联网的电话簿。注意这篇文章不是在Ubuntu 22.04配置自己的DNS服务器。而是给客户端配置DNS的IP地址。

连接到Internet的每个设备均由其IP地址作为唯一标识。当您在浏览器中键入要访问的网站时,其域名必须转换为相应的IP地址。

什么是 DNS与DNS工作方式

操作系统首先检查其hosts文w件中是否存在相应的域,如果域名中不存在hosts文件,它将查询配置的DNS域名服务器以解析指定的域名。

域名解析后,系统将缓存请求并保留域名和相应IP地址的记录。DNS域名服务器为其他设备执行DNS解释的服务器。

通常,DNS服务器地址由您的ISP分配。但是,这些DNS服务器可能运行缓慢或未定期更新,这可能会导致在查询域名时解析为错误的IP地址。

或者出现延迟,有时您可能根本无法解析所需的域名的IP地址。有很多免费的公共DNS服务器。

这些DNS域名服务器快速,并定期更新。这是一些最受欢迎的公共DNS服务器。Google(8.8.8.8,8.8.4.4),Cloudflare(1.1.1.1,1.0.0.1)。

OpenDNS(208.67.222.222,208.67.220.220),Level3(209.244.0.3,209.244.0.4)。

如果要为连接到本地网络的所有设备设置DNS域名服务器,那么最简单和建议的方法是在家庭路由器进行更改。

Ubuntu 22.04 查看 DNS

在Linux 查看正在使用DNS服务器IP地址方法有很多,可以使用dig命令或者查看systemd-resolve服务的状态。

systemd-resolve -status命令打印很多信息。但我们可以使用grep命令来过滤DNS Servers字符串。

对于dig命令,如果只需要查看当前使用DNS地址,请运行命令dig myfreax.com | grep SERVER。

dig myfreax.com | grep SERVER 
sudo systemd-resolve --status | grep 'DNS Servers' -A2

dig myfreax.com | grep SERVER
;; SERVER: 8.8.8.8#53(8.8.8.8)

sudo systemd-resolve --status | grep 'DNS Servers' -A2
         DNS Servers: 1.1.1.1
                      1.0.0.1

sudo systemd-resolve –status | grep ‘DNS Servers’ -A2

Ubuntu 22.04 桌面设置DNS

在Ubuntu 22.04桌面环境设置DNS地址非常简单,不需要任何技术知识。首先打开设置窗口。

如果您连接到WiFi网络,请单击Wi-FI标签。否则,如果您有有线连接,请单击网络选项卡。

选择要为其设置DNS的连接,然后单击齿轮图标以打开网络管理器。选择IPv4设置选项卡。

禁用自动切换开关,然后输入DNS服务器的IP地址,以逗号分隔。我们将使用Google DNS服务器。

Ubunut 22.04 设置 DNS地址

点击应用按钮以保存更改。更改立即生效,除非您的系统或应用程序缓存了DNS记录。

如果要切换回原来的设置,请打开网络管理器,转到IPv4设置并启用自动切换开关。

Ubuntu 22.04 服务器设置DNS

过去,每当您想在Linux中配置DNS地址时,只需打开/etc/resolv.conf文件,编辑记录,保存文件就可以。

现在/etc/resolv.conf文件仍然存在,但它是由systemd-resolved服务控制的符号链接,不应手动对其进行编辑。

systemd-resolved是为本地服务和应用程序提供DNS名称解析的服务,可以使用Netplan进行配置,Netplan是Ubuntu 22.04的默认网络管理工具。

Netplan配置文件存储在/etc/netplan目录。您可能会在此目录中找到一个或两个YAML文件。

各个安装程序的文件名可能不同。通常,该文件名为01-netcfg.yaml或50-cloud-init.yaml,但在您的系统中,可能会有所不同。

这些文件使您可以配置网络接口,我们通常称为网卡,包括IP地址,网关,DNS域名服务器等。

要设置DNS,请使用你喜欢的文本编辑器编辑文件,在本教程中我们将使用vim编辑文件。

sudo vim /etc/netplan/01-network-manager-all.yaml

network:
  version: 2
  renderer: NetworkManager
  ethernets:
    ens3:
      dhcp4: true
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

注意,你必须修改本教程中接口名称ens3为你的计算机接口名称。然后使用您的首选DNS更改nameservers的IP地址。

例如如果您想使用Cloudflare的DNS服务器,则可以将nameservers的addresses行更改为。

DNS服务器IP地址必须用逗号分隔,如果该nameservers字段不存在,请将nameservers添加到接口名称字段下。

      nameservers:
          addresses: [1.1.1.1, 1.0.0.1]

编辑Yaml文件时,请确保您遵循YAML代码缩进标准。如果配置中存在语法错误,Netplan将无法解析该文件。完成后,保存文件并退出vim。

然后运行命令sudo netplan apply应用更改。Netplan将为systemd-resolved的服务生成配置文件/run/systemd/resolve/resolv.conf。

此外,还有一些应用程序依然使用/etc/resolv.conf的配置文件的DNS地址进行域名的解释,因此你还需要修改/etc/resolv.conf文件。

要修改此文件我们只需要将/run/systemd/resolve/resolv.conf软链接到/etc/resolv.con即可。

运行命令sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf。

sudo netplan apply
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Ubuntu 22.04 验证DNS设置

要验证是否正确设置DNS地址,请运行命令systemd-resolve --status | grep 'DNS Servers' -A2或者命令dig www.myfreax.com。

systemd-resolve -status命令打印很多信息。我们使用grep命令来过滤DNS Servers字符串。

sudo systemd-resolve --status | grep 'DNS Servers' -A2
         DNS Servers: 1.1.1.1
                      1.0.0.1

这里需要注意的是,如果你的Ubuntu 22.04带有桌面环境,请一定使用桌面环境的网络设置来修改DNS的IP地址。

如果你想使用命令的方式修改DNS地址,可能会不如你所愿。当你在终端运行命令dig www.myfreax.com的时候。

你将会在dig命令的结果看到应答的服务器永远是;; SERVER: 127.0.0.1#53(127.0.0.1)或者是你的网关地址;; SERVER: 192.168.1.1#53(192.168.1.1)。

dig www.myfreax.com
; <<>> DiG 9.16.1-Ubuntu <<>> www.myfreax.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 451
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.myfreax.com.       IN  A

;; ANSWER SECTION:
www.myfreax.com.    300 IN  A   43.457.68.101

;; Query time: 119 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Dec 01 19:14:33 HKT 2022
;; MSG SIZE  rcvd: 60

结论

Netplan是Ubuntu 22.04的默认网络管理工具,替代之前的Ubuntu版本中用于配置网络的/etc/resolv.conf和/etc/network/interfaces配置文件。

#GNU_Linux #Ubunt #Dig #DNS

References

Obsidian 多设备同步方案整理

同步方案大致有下面这几种:

  • obsidian-livesync(插件):自托管在线同步,支持实时同步,社区活跃,使用自建 CouchDB 数据库存放数据;
  • remotely-save(插件):支持S3 (Amazon S3/Cloudflare R2/Backblaze B2/…)、Dropbox、webdav (NextCloud/InfiniCLOUD/Synology/…)、OneDrive 等数据源。
  • obsidian git(插件):集成 git,主要是 git 做版本管理的,用起来不是很方便。
  • obsidian-sync(官方同步):官方方案,无需多言,每月4$。

对比表格

claude 对以上方案的对比如下表:

特性 官方同步 LiveSync Remotely Save Git
价格 $4/月 免费 免费 免费
配置难度 简单 较复杂 中等 复杂
实时同步 ✓ ✓ × ×
版本历史 ✓ ✓ × ✓
端到端加密 ✓ ✓ × ×
选择性同步 × ✓ ✓ ✓
移动端支持 完善 一般 一般 较差
稳定性 高 中 中 高
技术要求 低 中 低 高
自建服务器 × ✓ × ✓
冲突处理 自动 自动 手动 手动

注:

  • ✓ 表示支持
  • × 表示不支持
  • 评价标准为:高/中/低 或 完善/一般/较差

由 Claude 3.5 Sonnet 回答,大部分正确,供参考。

obsidian-livesync 方案

我目前在使用 obsidian-livesync ,因为可以自托管,无需支付 S3 的按量费用,用起来速度也很不错,约 4k 条笔记约1min上下。配置一次后生成 url,在其他设备只需 安装 obsidian、安装 obsidian-livesync 插件、再填写 url 即可,很方便。

实时同步体验也很好。

建议按照官方文档一步一步进行即可。

以下贴出我部署用到的 compose.yaml 供参考,注意替换其中的密码:

version: '3.8'

services:
  couchdb:
    image: couchdb:3.4.2
    container_name: couchdb-for-ols
    environment:
      - COUCHDB_USER=admin
      - COUCHDB_PASSWORD=xxxxxxxxx
        #- hostname=ocdb.xxxx.com
    restart: unless-stopped
    volumes:
      - ./data/couchdb-data:/opt/couchdb/data
      - ./data/couchdb-etc:/opt/couchdb/etc/local.d
    ports:
      - "5984:5984"

执行后执行以下命令初始化数据库:

export hostname=localhost:5984
export username=admin     #Please change as you like.
export password=xxxxxxxxx #Please change as you like
curl -s https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/couchdb/couchdb-init.sh | bash

References

查找文件所属 rpm 安装包的方法

我来介绍几种在 RPM 系统中查找文件所属包的方法:

  1. 对于已安装的文件,使用 rpm -qf 命令:

    rpm -qf /path/to/file
  2. 使用 dnf provides 命令(适用于已安装或未安装的文件):

    dnf provides /path/to/file
  3. 使用 yum provides 命令(与 dnf provides 类似):

    yum provides /path/to/file

举个实际例子:

# 比如要查找 ls 命令属于哪个包
rpm -qf /bin/ls
# 输出: coreutils-8.32-30.el9.x86_64

# 或者使用 dnf
dnf provides /bin/ls

几点说明:

  • rpm -qf 只能查询已经安装的文件
  • dnf provides 和 yum provides 可以查询未安装的文件
  • 如果不确定文件的完整路径,可以使用通配符,如:
    dnf provides */ls

这些命令在系统维护和故障排查时非常有用,特别是当需要知道某个文件来自哪个软件包时。

Kubespray 部署生产级 k8s 集群

kubespray 是基于 ansible 开发的一套 K8s 生命周期管理软件,由 k8s 官方 sig 维护。

遇到问题多读文档,搞清楚命令意味着什么再操作。

部署方法

获取部署程序

# 从 kubespray 官方仓库拉取
git clone --depth=1 https://github.com/kubernetes-sigs/kubespray.git
# 切换到 v2.26.0 版本,不同版本对应支持不同 k8s 版本,根据需要切换
git checkout v2.26.0

# 进入部署程序目录
cd kubespray

# 创建 python 虚拟环境,激活,并安装依赖
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r  requirements.txt

定义部署节点信息

# 从集群配置模板拷贝一份
cp -rfp inventory/sample inventory/mycluster

# 定义节点 IP 清单,将 IP 更换为自己节点的 IP
declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

# 根据需要调整节点角色
inventory/mycluster/hosts.yaml

执行以上命令后会在生成一份节点角色清单在 inventory/mycluster/hosts.yaml 路径下,可以根据需要调整,如调整希望作为 master 的节点、运行 etcd 的节点、作为 worker 的节点等。

定义部署 集群信息

根据需要配置集群:

  • inventory/mycluster/group_vars/all/*.yml
  • inventory/mycluster/group_vars/k8s-cluster/*.yml

可以定义部署的 K8s 版本、使用的容器运行时、CNI、Ingress 等内容,具体看注释。

开始部署

# 可选,清理旧集群,若怀疑有残留可以运行这个清理,也可跳过
ansible-playbook -i inventory/mycluster/hosts.yaml  --become --become-user=root reset.yml

# 开始部署
ansible-playbook -i inventory/mycluster/hosts.yaml  --become --become-user=root cluster.yml

若调整了集群配置,重新运行部署即可。

reset.yml 亦可用于销毁集群,谨慎操作.

扩容

扩容貌似再次执行一次部署命令也可,也可运行例如下面的命令,供参考。

ansible-playbook \
  -i inventory/mycluster/inventory.ini \
  --private-key=id_rsa \
  --user=root -b \
  scale.yml

缩容

使用以下命令运行 remote-node.yml 即可,将 node 变量指向希望移除的节点,命令供参考。

ansible-playbook \
  -i inventory/mycluster/inventory.ini \
  --private-key=id_rsa \
  --user=ubuntu -b \
  --extra-vars "node=node1,node2" \
  remove-node.yml

--extra-vars 里写要移出的节点名列表,如果节点已经卡死,无法通过 SSH 登录,可以在 --extra-vars 加个 reset_nodes=false 的选项,跳过第二个步骤。

References

#Kubernetes #Kubespray

OpenWRT 软件源整理

软件源整理

官方镜像站

  1. OpenWRT官方下载站点:
  • URL: https://downloads.openwrt.org/
  • 这是 OpenWRT的主站点,提供所有官方版本的固件和软件包。该站点是获取最新稳定版、开发版(snapshot)和历史版本的主要来源。
  1. OpenWRT官方GitHub仓库:
  • URL: https://github.com/openwrt/openwrt
  • 虽然主要用于代码存储和开发,但也提供了一些资源和文档链接。

国内镜像站

  1. 清华大学开源软件镜像站:
  • URL: https://mirrors.tuna.tsinghua.edu.cn/openwrt
  • 提供了OpenWRT各个版本的镜像,非常稳定和快速。
  1. 中科大开源镜像站:
  • URL: https://mirrors.ustc.edu.cn/openwrt
  • 也是一个非常可靠的镜像源,提供OpenWRT的各个版本。
  1. 阿里云开源镜像站:
  • URL: https://mirrors.aliyun.com/openwrt
  • 提供稳定的OpenWRT镜像下载服务。
  1. 重庆大学开源镜像站:
  • URL: https://mirrors.cqu.edu.cn/openwrt/
  • 同样是一个可以选择的国内镜像源。
  1. 南京大学开源镜像站:
  • URL: https://mirror.nju.edu.cn/openwrt/
  • 提供了OpenWRT的多版本支持。
  1. 上海交通大学开源镜像站:
  • URL: https://mirror.sjtu.edu.cn/openwrt/
  • 提供稳定的开源软件镜像服务。
  1. 兰州大学开源镜像站:
  • URL: https://mirror.lzu.edu.cn/openwrt/
  • 提供多个开源项目的镜像下载。界面有点意思。
  1. 浙江大学开源镜像站:
  • URL: https://mirrors.zju.edu.cn/openwrt/
  • 提供多种开源软件项目的镜像。

个人镜像站

  1. OpenWRT.AI软件仓库:
  • URL: https://dl.openwrt.ai/
  • Kiddin9的自建软件仓库,目前只支持OpenWRT 23.05版本。

如何选择和使用镜像站

在OpenWRT路由器上配置官方软件源通常不需要额外操作,因为默认情况下,OpenWRT已经配置了官方软件源。只需运行opkg update命令以确保软件包列表是最新的。

要使用这些镜像源,您需要修改OpenWRT路由器上的,可以查看 /etc/opkg/customfeeds.conf 文件,确保根据您所使用的OpenWRT版本和设备架构进行正确配置。

配置示例

src/gz openwrt_core https://mirror.bjtu.edu.cn/openwrt/releases/
<version>/targets/<target>/packages
src/gz openwrt_base https://mirror.bjtu.edu.cn/openwrt/releases/
<version>/packages/<architecture>/base
src/gz openwrt_luci https://mirror.bjtu.edu.cn/openwrt/releases/
<version>/packages/<architecture>/luci
src/gz openwrt_packages https://mirror.bjtu.edu.cn/openwrt/releases/
<version>/packages/<architecture>/packages
src/gz openwrt_routing https://mirror.bjtu.edu.cn/openwrt/releases/
<version>/packages/<architecture>/routing
src/gz openwrt_telephony https://mirror.bjtu.edu.cn/openwrt/releases/
<version>/packages/<architecture>/telephony

将上述内容中的https://mirror.bjtu.edu.cn/openwrt/替换为你想要使用的OpenWRT软件源地址,同时注意后面的`

`为版本号,需要修改为你OpenWRT的版本号,“ 为系统架构,需要修改为你对应的系统架构,例如`X86_64` #### 命令行替换方法 或者通过命令行方式进行修改,格式为`s,[原来的软件源地址],[替换的软件源地址],g` “`plain sed -e ‘s,https://downloads.openwrt.org,https://mirror.bjtu.edu.cn/openwrt,g’ \ -e ‘s,https://downloads.openwrt.org,https://mirror.bjtu.edu.cn/openwrt,g’ \ -i.bak /etc/opkg/customfeeds.conf “` Plain text 替换完成后通过`opkg update`进行更新。 #### 注意事项 OpenWRT官方版软件源并不一定完全匹配第三方定植后的固件,例如esir、Leon大佬等定制的固件,可能存在库不全或兼容问题。同时官方版本软件源提供的`k-mod-*.ipk` 软件包也可能存在无法直接安装的情况。 如果你是一个新手,或者只想将OpenWRT系统配置起来养老,那么推荐使用[ImmortalWRT](https://github.com/immortalwrt/immortalwrt),在软件源支持方面可能会更好一些,同时也可以自定义配置国内软件源[immoralwrt-opkg-replace-edu-mirror](https://www.dolingou.com/article/immoralwrt-opkg-replace-edu-mirror) ## References * [🖥️OpenWRT 软件源整理](https://www.dolingou.com/article/Compilation-of-OpenWRT-Software-Sources)

镜像操作神器 skopeo 用法总结

skopeo 是一个命令行工具,可对容器镜像和容器存储进行操作。 在没有dockerd的环境下,使用 skopeo 操作镜像是非常方便的。

安装

包管理器

# RHEL / CentOS Stream ≥ 8
sudo dnf install skopeo

# RHEL/CentOS ≤ 7.x
yum install skopeo

# openSUSE:
sudo zypper install skopeo

# alpine:
sudo apk add skopeo

# macOS:
brew install skopeo

# ArchLinux
sudo pacman -S skopeo

其他系统见 安装文档

编译安装

git clone https://github.com/containers/skopeo skopeo
cd !$
git checkout v1.0.0
make binary-static DISABLE_CGO=1
cp skopeo /usr/local/bin/

使用

在使用 skopeo 之前,我们首先要知道在命令行中镜像的格式

需要注意的是,这几种镜像的名字,对应着镜像存在的方式,不同存在的方式对镜像的 layer 处理的方式也不一样,比如 docker:// 这种方式是存在 registry 上的,docker-daemon: 是存在本地 docker pull 下来的,再比如 docker-archive 是通过 docker save 出来的镜像。同一个镜像有这几种存在的方式就像水有气体、液体、固体一样。可以这样去理解,他们表述的都是同一个镜像,只不过是存在的方式不一样而已。

IMAGE NAMES example
containers-storage: containers-storage:
dir: dir:/PATH
docker:// docker://k8s.gcr.io/kube-apiserver:v1.17.5
docker-daemon: docker-daemon:alpine:latest
docker-archive: docker-archive:alpine.tar (docker save)
oci: oci:alpine:latest

命令选项

# skopeo --help
NAME:
   skopeo - Various operations with container images and container image registries

USAGE:
   skopeo [global options] command [command options] [arguments...]

VERSION:
   0.1.37

COMMANDS:
     copy               Copy an IMAGE-NAME from one location to another
     inspect            Inspect image IMAGE-NAME
     delete             Delete image IMAGE-NAME
     manifest-digest    Compute a manifest digest of a file
     standalone-sign    Create a signature using local files
     standalone-verify  Verify a signature using local files
     help, h            Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug                  enable debug output
   --policy value           Path to a trust policy file
   --insecure-policy        run the tool without any policy check
   --registries.d DIR       use registry configuration files in DIR (e.g. for container signature storage)
   --override-arch ARCH     use ARCH instead of the architecture of the machine for choosing images
   --override-os OS         use OS instead of the running OS for choosing images
   --command-timeout value  timeout for the command execution (default: 0s)
   --help, -h               show help
   --version, -v            print the version

可以看到 skopeo 的功能很简单:

  • copy:复制一个镜像从 A 到 B,这里的 A 和 B 可以为本地 docker 镜像或者 registry 上的镜像。
  • inspect:查看一个镜像的 manifest 火车 image config 详细信息
  • delete:删除一个镜像,可以是本地 docker 镜像或者 registry 上的镜像
  • list-tags:列出一个 registry 上某个镜像的所有 tag
  • login:登录到某个 registry,和 docker login 类似
  • logout: 退出已经登录到某个 registry 的 auth 信息,和 docker logout 类似
  • manifest-digest、standalone-sign、standalone-verify 这三个用的不多
  • sync:同步一个镜像从 A 到 B,感觉和 copy 一样,但 sync 支持的参数更多,功能更强大

获取镜像的信息

skopeo 可以在不用下载镜像的情况下,获取镜像信息

# skopeo inspect docker://docker.io/centos
{
    "Name": "docker.io/library/centos",
    "Digest": "sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700",
    "RepoTags": [
        "5.11",
        "5",
        "6.10",
        "6.6",
        "6.7",
        "6.8",
        "6.9",
        "6",
        "7.0.1406",
        "7.1.1503",
        "7.2.1511",
        "7.3.1611",
        "7.4.1708",
        "7.5.1804",
        "7.6.1810",
        "7.7.1908",
        "7",
        "8.1.1911",
        "8",
        "centos5.11",
        "centos5",
        "centos6.10",
        "centos6.6",
        "centos6.7",
        "centos6.8",
        "centos6.9",
        "centos6",
        "centos7.0.1406",
        "centos7.1.1503",
        "centos7.2.1511",
        "centos7.3.1611",
        "centos7.4.1708",
        "centos7.5.1804",
        "centos7.6.1810",
        "centos7.7.1908",
        "centos7",
        "centos8.1.1911",
        "centos8",
        "latest"
    ],
    "Created": "2020-01-18T00:26:46.850750902Z",
    "DockerVersion": "18.06.1-ce",
    "Labels": {
        "org.label-schema.build-date": "20200114",
        "org.label-schema.license": "GPLv2",
        "org.label-schema.name": "CentOS Base Image",
        "org.label-schema.schema-version": "1.0",
        "org.label-schema.vendor": "CentOS",
        "org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
        "org.opencontainers.image.licenses": "GPL-2.0-only",
        "org.opencontainers.image.title": "CentOS Base Image",
        "org.opencontainers.image.vendor": "CentOS"
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Layers": [
        "sha256:8a29a15cefaeccf6545f7ecf11298f9672d2f0cdaf9e357a95133ac3ad3e1f07"
    ]
}

docker://: 是使用 Docker Registry HTTP API V2 进行连接远端 docker.io: 远程仓库 centos: 镜像名称

也可以获取本地dockerd的镜像信息

# skopeo inspect docker-daemon:ubuntu:latest
{
    "Name": "docker.io/library/ubuntu",
    "Digest": "sha256:004d05bd520c5c386fb8322d6081f4de567a9417e1ba8e5071663d7811992c88",
    "RepoTags": [],
    "Created": "2020-03-20T19:20:22.835345724Z",
    "DockerVersion": "18.09.7",
    "Labels": null,
    "Architecture": "amd64",
    "Os": "linux",
    "Layers": [
        "sha256:c8be1b8f4d60d99c281fc2db75e0f56df42a83ad2f0b091621ce19357e19d853",
        "sha256:977183d4e9995d9cd5ffdfc0f29e911ec9de777bcb0f507895daa1068477f76f",
        "sha256:6597da2e2e52f4d438ad49a14ca79324f130a9ea08745505aa174a8db51cb79d",
        "sha256:16542a8fc3be1bfaff6ed1daa7922e7c3b47b6c3a8d98b7fca58b9517bb99b75"
    ]
}

docker-daemon: docker守护镜像的镜像 ubuntu:latest: 本地镜像的名称

拷贝镜像

注意一下,这里的 location 就是指的上面提到的 IMAGE NAMES ,也就是说 skopeo copy src dest 可以有 6*6=36 种组合!比如我可以将一个镜像从一个 registry 复制到另一个 registry,skopeo copy docker://IMAGE_NAME docker://IMAGE_NAME,再强调一遍,一定要注意 IMAGE_NAME 的命名的格式。

在不使用 docker 的情况下从远端下载镜像

# skopeo --insecure-policy copy docker://nginx:1.17.6 docker-archive:/tmp/nginx.tar
Getting image source signatures
Copying blob 8ec398bc0356 done
Copying blob 465560073b6f done
Copying blob f473f9fd0a8c done
Copying config f7bb5701a3 done
Writing manifest to image destination
Storing signatures
# ls -alh  /tmp/nginx.tar 
-rw-r--r-- 1 root root 125M 4月  13 15:22 /tmp/nginx.tar

--insecure-policy: 用于忽略安全策略配置文件 docker://nginx:1.17.6: 该命令将会直接通过 http 下载目标镜像 docker-archive: 存储为 /tmp/nginx.tar,此文件可以直接通过 docker load 命令导入

相应的,可以将下载的文件导入到本地

# skopeo copy docker-archive:/tmp/nginx.tar docker-daemon:nginx:latest
Getting image source signatures
Copying blob 556c5fb0d91b done
Copying blob 49434cc20e95 done
Copying blob 75248c0d5438 done
Copying config f7bb5701a3 done
Writing manifest to image destination
Storing signatures

# docker images nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f7bb5701a33c        3 months ago        126MB

也可以将镜像下载到指定目录

# skopeo copy docker://busybox:latest dir:/tmp/busybox
Getting image source signatures
Copying blob 0669b0daf1fb done
Copying config 83aa35aa1c done
Writing manifest to image destination
Storing signatures

# ls -alh /tmp/busybox/
总用量 760K
drwxr-xr-x   2 root root  186 4月  13 15:26 .
drwxrwxrwt. 12 root root 4.0K 4月  13 15:25 ..
-rw-r--r--   1 root root 743K 4月  13 15:26 0669b0daf1fba90642d105f3bc2c94365c5282155a33cc65ac946347a90d90d1
-rw-r--r--   1 root root 1.5K 4月  13 15:26 83aa35aa1c79e4b6957e018da6e322bfca92bf3b4696a211b42502543c242d6f
-rw-r--r--   1 root root  527 4月  13 15:26 manifest.json
-rw-r--r--   1 root root   33 4月  13 15:25 version

或者从指定目录导入到本地

# skopeo copy dir:/tmp/busybox docker-daemon:busybox:latest
Getting image source signatures
Copying blob 0669b0daf1fb done
Copying config 83aa35aa1c done
Writing manifest to image destination
Storing signatures
# docker images busybox
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        4 weeks ago         1.22MB

其他命令

skopeo --debug copy docker-archive:/dev/stdin containers-storage:foo < /tmp/nginx.tar

删除镜像

skopeo delete docker://localhost:5000/nginx:latest

认证文件

认证文件默认存放在 $HOME/.docker/config.json

文件内容

{
    "auths": {
        "myregistrydomain.com:5000": {
            "auth": "dGVzdHVzZXI6dGVzdHBhc3N3b3Jk",
            "email": "stuf@ex.cm"
        }
    }
}

其他参数

# 跳过源地址的 tls
skopeo copy docker://192.168.25.8:5000/library/registry:latest  oci-archive:registry-latest.tar --src-tls-verify=false

# 跳过验证 tls
skopeo list-tags --tls-verify=false docker://dockerio.vkvmsg1.skybyte.me/library/registry
# 注意这里 dockerio 的顶级镜像自行补全 library 前缀

References

#Docker #Containerd #Kubernetes

开源项目管理软件对比总结

以下是 Kanboard、Wekan、Taiga、OpenProject 和 Redmine 这五个软件的对比表格:

功能/属性 Kanboard Wekan Taiga OpenProject Redmine
软件类型 项目管理 项目管理 项目管理及敏捷开发 项目管理及协作 项目管理
开源 是 是 是 是 是
界面语言 多语言支持 多语言支持 多语言支持 多语言支持 多语言支持
主要功能 看板、任务管理、时间跟踪 看板、任务管理 敏捷管理、Scrum、Kanban 甘特图、时间跟踪、资源管理 问题跟踪、甘特图、日历
安装方式 自托管、Docker 自托管、Docker 自托管、云托管、Docker 自托管、云托管、Docker 自托管、云托管、Docker
集成功能 少量插件、API API、与其他系统集成 GitHub、GitLab、Slack 等 多种插件、API 丰富的插件与API支持
适用团队规模 小型到中型 小型到中型 中型到大型,可扩展 小型到大型 小型到大型
界面友好性 简单直观 简单直观 现代但稍复杂 功能丰富但可能更复杂 简单直观,但界面略显陈旧
社区活跃度 中等 高 高 高 高
移动应用支持 无 无 第三方应用或网页 无官方移动应用 无官方移动应用
特别支持功能 强调简单性和看板视图 实时协作和活动流 支持敏捷项目管理流程 适合多种项目管理方法 自定义字段、复杂权限管理

Redmine 是一个久经考验的项目管理和问题跟踪工具,以其强大的可扩展性和插件系统而著称。它适合那些需要高度定制化和强大问题跟踪功能的团队。

Linux 使用 rinetd 实现端口转发重定向

工具介绍

linux 下简单好用的工具 rinetd,实现端口映射 / 转发 / 重定向。

用于有效地将连接从一个 IP 地址 / 端口组合重定向到另一 IP 地址 / 端口组合。在操作虚拟服务器、防火墙等时很有用。

Rinetd 是单一过程的服务器,它处理任何数量的连接到在配置文件 etc/rinetd 中指定的地址 / 端口对。尽管 rinetd 使用非闭锁 I/O 运行作为一个单一过程,它可能重定向很多连接而不对这台机器增加额外的负担。

官网地址:http://www.boutell.com/rinetd

软件安装

方法一:压缩包

wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar zxvf rinetd.tar.gz
make
make install

方法二:apt-get

apt-cache search rinetd
apt-get install rinetd -y

软件配置

配置文件格式:

[Source Address] [Source Port] [Destination Address] [Destination Port]
源地址 源端口 目的地址 目的端口

在每一单独的行中指定每个要转发的端口。源地址和目的地址都可以是主机名或 IP 地址,IP 地址 0.0.0.0 将 rinetd 绑定到任何可用的本地 IP 地址上。

例如:

vi /etc/rinetd.conf
0.0.0.0 8080 172.19.94.3 8080
0.0.0.0 2222 192.168.0.103 3389
1.2.3.4 80     192.168.0.10 80

说明一下(0.0.0.0 表示本机绑定所有可用地址)

  • 将所有发往本机 8080 端口的请求转发到 172.19.94.3 的 8080 端口
  • 将所有发往本机 2222 端口的请求转发到 192.168.0.103 的 3389 端口
  • 将所有发往 1.2.3.4 的 80 端口请求转发到 192.168.0.10 的 80 端口

使用 systemd 管理:

systemctl status rinetd

注意事项

  1. rinetd.conf 中绑定的本机端口必须没有被其它程序占用。
  2. 运行 rinetd 的系统防火墙应该打开绑定的本机端口。

例如:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1111 -jACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -jACCEPT

References

mysql bin 日志过大处理方法

我来帮您解决 MySQL binlog 文件占用空间过大的问题。以下是几个处理方案:

  1. 清理旧的 binlog 文件
    
    -- 查看当前的 binlog 文件列表
    SHOW BINARY LOGS;

— 手动删除指定日期之前的 binlog PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

— 或者删除指定文件之前的所有日志 PURGE BINARY LOGS TO ‘mysql-bin.000123’;


2. **设置 binlog 自动清理策略**
```sql
-- 设置 binlog 保留天数(比如保留7天)
SET GLOBAL expire_logs_days = 7;

-- MySQL 8.0之后使用以下命令
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天 = 7*24*60*60秒
  1. 修改配置文件优化 在 my.cnf 或 my.ini 中添加:
    
    # 设置 binlog 过期时间(天)
    expire_logs_days = 7

MySQL 8.0+ 使用

binlog_expire_logs_seconds = 604800

设置单个 binlog 文件的最大值(默认1G)

max_binlog_size = 100M



建议采取的步骤:

1. 首先备份重要数据
2. 检查是否真的需要 binlog(如果不需要复制功能,可以考虑关闭)
3. 设置合理的过期时间
4. 定期监控 binlog 空间使用情况

注意事项:
- 清理前确保相关的从库已经同步完成
- 不要删除正在使用的 binlog 文件
- 建议在业务低峰期进行清理
- 可以考虑将 binlog 存放在独立的大容量磁盘上

如果您只是临时需要清理空间,使用 `PURGE BINARY LOGS` 是最快的方法。但从长远来看,建议同时设置自动过期策略,避免再次出现空间占用过大的情况。

# References
* [Mysql binlog日志太多,占用大量磁盘空间该如何正确处理](https://www.cnblogs.com/yanling-coder/p/12733096.html)

#MySQL