当前位置: 首页 > news >正文

OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

《OpenShift / RHEL / DevSecOps 汇总目录》
本文适合 OpenShift 4.11 及其以上版本。

文章目录

  • 在离线环境中用 OpenShift 准备 Mirror Registry
    • 环境说明
    • 向隔离环境复制镜像
      • 准备节点环境
        • bastion 节点操作
        • support 节点操作
      • 网络完全隔离环境-复制镜像
        • bastion 节点操作
        • support 节点操作
      • 网络部分隔离环境-复制镜像
        • bastion 节点操作
    • 切换 Catalog Source
    • 更新 Operator 列表
  • oc-mirror 命令说明
    • 列出已有 release 版本
    • 查看 operator 列表
    • 初始化 imageset config 文件
    • 下载 Image
    • 检查 Image 是否有更新
  • 参考

在离线环境中用 OpenShift 准备 Mirror Registry

环境说明

bastion 节点support 节点
作用可以访问互联网,但不可以访问 OpenShift 集群,用来下载离线的容器 Image不能访问互联网,但可以访问 OpenShift 集群,用来运行 mirror registry 服务
配置RHEL8/1vcpu/4GB 250GB (根据需要调整)RHEL8/2vcpu/8GB 500GB (根据需要调整)

向隔离环境复制镜像

向隔离环境复制容器镜像可以分为 “网络完全隔离环境” 和 “网络部分隔离环境” 两种场景。无论是哪种场景,都先按以下说明准备 bastion 和 support 节点环境。

准备节点环境

  1. 先在两个节点中执行以下命令,其中为 SUPPORT_HOSTNAME 设置了完整的全域名。
yum install podman rsync glibc -y
export SUPPORT_HOSTNAME=<SUPPORT-NODE-FQDN>
export OCP_VER_S=4.16
export OCP_VER_L=4.16.4
export MIRROR_DATA_PATH=/data/ocp4/mirror-data
export MIRROR_REGISTRY_PATH=/data/ocp4/mirror-registry
export COMMAND_PATH=/data/ocp4/oc
mkdir -p $MIRROR_DATA_PATH $MIRROR_REGISTRY_PATH $COMMAND_PATH
bastion 节点操作
  1. 下载 mirror-registry 软件,oc 客户端和 oc-mirror 插件。
curl -L -o $MIRROR_REGISTRY_PATH/mirror-registry.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/mirror-registry/latest/mirror-registry.tar.gz## OCP 4.14 及其以前版本
curl -L -o $COMMAND_PATH/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/openshift-client-linux.tar.gz
## OCP 4.15 及其以后版本
curl -L -o $COMMAND_PATH/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/openshift-client-linux-amd64-rhel8.tar.gz  
tar -xzf $COMMAND_PATH/oc.tar.gz -C $COMMAND_PATH occurl -L -o $COMMAND_PATH/oc-mirror.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/oc-mirror.tar.gz
tar -xzf $COMMAND_PATH/oc-mirror.tar.gz -C $COMMAND_PATH
chmod +x $COMMAND_PATH/oc-mirrorrm -f $COMMAND_PATH/oc.tar.gz $COMMAND_PATH/oc-mirror.tar.gz
  1. 下载用来从 registry.redhat.io、quay.io 等官方网站下载镜像的 pull-secret 。
mkdir $HOME/.docker
curl -L -o $HOME/.docker/config.json https://gitee.com/dawnskyliu/ocp/raw/master/pull-secret.json
  1. 将以上下载的文件从 bastion 节点传到 support 节点对应目录。
rsync -avP $MIRROR_REGISTRY_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_REGISTRY_PATH
rsync -avP $COMMAND_PATH/* root@$SUPPORT_HOSTNAME:$COMMAND_PATH
support 节点操作
  1. 创建 mirror registry 运行环境,默认软件将安装在 $HOME/quay-install 目录下。完成后可以看到 mirror registry 的访问地址,可以用浏览器访问该地址。
$ tar -xzvf $MIRROR_REGISTRY_PATH/mirror-registry.tar.gz -C $MIRROR_REGISTRY_PATH
$ cd $MIRROR_REGISTRY_PATH && ./mirror-registry install --initUser quayadmin --initPassword PASSWORD
。。。。
PLAY RECAP *****************************************************************************************************************************
lab-user@ip-10-0-50-115.us-east-2.compute.internal : ok=55   changed=35   unreachable=0    failed=0    skipped=16   rescued=0    ignored=0INFO[2024-08-01 11:38:05] Quay installed successfully, config data is stored in ~/quay-install
INFO[2024-08-01 11:38:05] Quay is available at https://ip-10-0-50-115.us-east-2.compute.internal:8443 with credentials (quayadmin, PASSWORD)
  1. 让 support 系统信任 mirror registry 的自签名 TLS 证书。
cp -v $HOME/quay-install/quay-rootCA/rootCA.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust
  1. 确认可以登录 mirror registry,然后查看生成的默认认证文件。
$ podman login $SUPPORT_HOSTNAME:8443 -u quayadmin -p PASSWORD
$ more $XDG_RUNTIME_DIR/containers/auth.json
{"auths": {"ip-10-0-50-115.us-east-2.compute.internal:8443": {"auth": "cXVheWFkbWluOlBBU1NXT1JE"}}
}

网络完全隔离环境-复制镜像

完全隔离环境是指 bastion 和 support 节点之间的网络无法直接连通的情况,这样只能先在 bastion 节点用 oc-mirror 命令将容器 Image 下载到文件系统中,然后再将离线文件传到 support 节点,最后再在 support 节点中用 oc-mirror 命令将这些 Image 从文件导入到运行在 support 节点的 mirror registry 里。

bastion 节点操作
  1. 创建 imageset-config.yaml 文件,它定义了将在 mirror registry 中存储的的 OpenShift 发行版、Operator 和其他独立镜像。如果需要增加其他 Image,可以向以下文件追加内容即可。说明:可参考下节使用 oc-mirror 命令获得 OpenShift 和 Operator 的版本信息。
cat << EOF > $MIRROR_DATA_PATH/imageset-config-1.yaml
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v1alpha2
storageConfig:local:path: $MIRROR_DATA_PATH
mirror:platform:channels:- name: stable-$OCP_VER_Stype: ocpminVersion: $OCP_VER_LmaxVersion: $OCP_VER_Loperators:- catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_Spackages:- name: web-terminalchannels:- name: fastadditionalImages:- name: registry.redhat.io/rhel8/support-toolshelm: {}
EOF
  1. 将 Image 离线文件下载到 bastion 节点本地,最后会看到生成 mirror_seq1_000000.tar 文件的提示。
$COMMAND_PATH/oc-mirror --config $MIRROR_DATA_PATH/imageset-config-1.yaml file://$MIRROR_DATA_PATH
  1. 将离线文件复制到被隔离的 support 节点。
rsync -avP $MIRROR_DATA_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH
support 节点操作
  1. 将离线 Image 文件导入 mirror registry。
$ cd $MIRROR_DATA_PATH && $COMMAND_PATH/oc-mirror --from=./mirror_seq1_000000.tar docker://$SUPPORT_HOSTNAME:8443
。。。
Wrote release signatures to oc-mirror-workspace/results-1722514691
Rendering catalog image "ip-10-0-50-115.us-east-2.compute.internal:8443/redhat/redhat-operator-index:v4.14" with file-based catalog
Writing image mapping to oc-mirror-workspace/results-1722514691/mapping.txt
Writing CatalogSource manifests to oc-mirror-workspace/results-1722514691
Writing ICSP manifests to oc-mirror-workspace/results-1722514691

网络部分隔离环境-复制镜像

部分隔离环境是指 bastion 和 support 节点之间的网络可以直接连通的情况,这样可以直接在 bastion 节点用 oc-mirror 命令下载 Image 并同时传入运行在 support 节点上的 mirror registry 里,在这个过程中 Image 无需落地到 bastion 节点的存储中。

bastion 节点操作
  1. 将访问 support 节点上 mirror registry 的认证信息写入用来保存 pull-secret 的 config.json 文件。
podman login -u quayadmin -p PASSWORD $SUPPORT_HOSTNAME:8443 --authfile $HOME/.docker/config.json
  1. 此时可通过 config.json 同时访问外部 registry 和内部的 mirror registry(如下面的 ip-10-0-50-115.us-east-2.compute.internal:8443)。
$ cat $HOME/.docker/config.json
{"auths": {"cloud.openshift.com": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfOGI1MGUwNjBiNWYwNDAzMGIxM2YwNjBlMjRhYzQzZWU6UEtHNlpWVTlPNzhRS0ZGS1UzTTA0SkpZWFNEOTBBSUgzU0JMN1RQUFhTWlRGWFY3UzBDUzBEUDZBU0xITVlHMA=="},"ip-10-0-50-115.us-east-2.compute.internal:8443": {"auth": "cXVheWFkbWluOlBBU1NXT1JE"},"quay.io": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfOGI1MGUwNjBiNWYwNDAzMGIxM2YwNjBlMjRhYzQzZWU6UEtHNlpWVTlPNzhRS0ZGS1UzTTA0SkpZWFNEOTBBSUgzU0JMN1RQUFhTWlRGWFY3UzBDUzBEUDZBU0xITVlHMA=="},"registry.connect.redhat.com": {"auth": "fHVoYy1wb29sLWY1ZjAwNDllLTQwNzktNDJkZi05YzA3LTUzODVjM2UyZGE5NTpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSm1aV0l5TW1Ga09ETmxORFUwT0dKa09XUTVaR1JpTmpRME1tSTFaVEk1T0NKOS5TalV0VTJUYzVQWEw0UVZVS0U4NWpFaGNmajNzR1NmQWFmbTRGclVVR09UNWc3RlBOZHB4V2lFeTd4eVVRbmtTaTBxSERselcyczJlN3lhQzE0ODE4N05VUmFvZ0Q5UGptMWozWG9SUTBRY2R6c3VBdkNKcTY5dW9rQXU4MjU3T2tMQWNxWjJ5T3huS19LVXlIc01FZ2pLMXFtWWU4c0xfOE91UmV4Yk8weGlhNTZYSV9fdlc4cUNMZUZXRTdPQkMzSFJDcE5oRWRJeElYZEVPV3dMZnhIblN0ZFA3TVZaRTZveEowblZpckFyZUh5SV85bnU2aDFTSm5fa2pvTW5vM3l5MU1KdVk4MkNoY1JFa0VsUkRaNDMxRUo0R0lUM1YtRGxyNVdRNHhUcG15M3V2TDdFQXQ1cTlwZldDdUNiNWRLXzdwR2dMbkRmOWtRb3k1U053dS13TDI0UEFta2J6b1ZWV0FDclY4WFhGZ2cyTTBoRS1OVkExdGlvLUlLelFRX2ZlWm53cVpLZWEwek1HRzVtY3lKTzlsYlNGRHE3X0Q1TnpDandMVzhOY3RRYzJTRVVrMnBkWjd1eWdqQ1N3dWpNbTVmRWNLcVp5eWh4UTlGMDhSanMyZTd2Vm44enFwQWEzNWlhb2V1U0RtVVhpa0xfZzZ6VDA5VzlWRHExM2JDeXR4eVAzUFJhdExNUGlIcXpjZ0NZd0dJcTl5a3FIMXd3X0RzdDRtcEpUUl85QlphVVRZN0NQQjg5a3Z2SzFWQTM3RWVtTnl3YlZOR1FIcDA5NGJvcmwtZk8zNTIteGFhaHY5TEg2dDlwTUsxWmRTT2RIR21PQXZEUmc0NkV3T0RIY0tBX1B0eFZOYTVUbjVuLXNGVUlJYkl0eC1DcDdSUXVGaFo4QndMMA=="},"registry.redhat.io": {"auth": "fHVoYy1wb29sLWY1ZjAwNDllLTQwNzktNDJkZi05YzA3LTUzODVjM2UyZGE5NTpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSm1aV0l5TW1Ga09ETmxORFUwT0dKa09XUTVaR1JpTmpRME1tSTFaVEk1T0NKOS5TalV0VTJUYzVQWEw0UVZVS0U4NWpFaGNmajNzR1NmQWFmbTRGclVVR09UNWc3RlBOZHB4V2lFeTd4eVVRbmtTaTBxSERselcyczJlN3lhQzE0ODE4N05VUmFvZ0Q5UGptMWozWG9SUTBRY2R6c3VBdkNKcTY5dW9rQXU4MjU3T2tMQWNxWjJ5T3huS19LVXlIc01FZ2pLMXFtWWU4c0xfOE91UmV4Yk8weGlhNTZYSV9fdlc4cUNMZUZXRTdPQkMzSFJDcE5oRWRJeElYZEVPV3dMZnhIblN0ZFA3TVZaRTZveEowblZpckFyZUh5SV85bnU2aDFTSm5fa2pvTW5vM3l5MU1KdVk4MkNoY1JFa0VsUkRaNDMxRUo0R0lUM1YtRGxyNVdRNHhUcG15M3V2TDdFQXQ1cTlwZldDdUNiNWRLXzdwR2dMbkRmOWtRb3k1U053dS13TDI0UEFta2J6b1ZWV0FDclY4WFhGZ2cyTTBoRS1OVkExdGlvLUlLelFRX2ZlWm53cVpLZWEwek1HRzVtY3lKTzlsYlNGRHE3X0Q1TnpDandMVzhOY3RRYzJTRVVrMnBkWjd1eWdqQ1N3dWpNbTVmRWNLcVp5eWh4UTlGMDhSanMyZTd2Vm44enFwQWEzNWlhb2V1U0RtVVhpa0xfZzZ6VDA5VzlWRHExM2JDeXR4eVAzUFJhdExNUGlIcXpjZ0NZd0dJcTl5a3FIMXd3X0RzdDRtcEpUUl85QlphVVRZN0NQQjg5a3Z2SzFWQTM3RWVtTnl3YlZOR1FIcDA5NGJvcmwtZk8zNTIteGFhaHY5TEg2dDlwTUsxWmRTT2RIR21PQXZEUmc0NkV3T0RIY0tBX1B0eFZOYTVUbjVuLXNGVUlJYkl0eC1DcDdSUXVGaFo4QndMMA=="}}
}
  1. 生成以下 imageset-config-2.yaml 文件。它定义了将在 mirror registry 中存储的的 OpenShift 发行版、Operator 和其他独立镜像。如果需要增加新的 Image,向文件追加内容即可。
$ cat << EOF > $MIRROR_DATA_PATH/imageset-config-2.yaml
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v1alpha2
storageConfig:registry:imageURL: $SUPPORT_HOSTNAME:8443/mirror/metadataskipTLS: false
mirror:platform:channels:- name: stable-$OCP_VER_Stype: ocpminVersion: $OCP_VER_LmaxVersion: $OCP_VER_Loperators:- catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_Spackages:- name: web-terminalchannels:- name: fastadditionalImages:- name: registry.redhat.io/rhel8/support-toolshelm: {}
EOF
  1. 根据 imageset-config-2.yaml 下载镜像,并将镜像直接推送到 support 节点上的 mirror registry 中。
$ cd $MIRROR_DATA_PATH && $COMMAND_PATH/oc-mirror --config ./imageset-config-2.yaml docker://$SUPPORT_HOSTNAME:8443
。。。
Writing image mapping to oc-mirror-workspace/results-1722516790/mapping.txt
Writing CatalogSource manifests to oc-mirror-workspace/results-1722516790
Writing ICSP manifests to oc-mirror-workspace/results-1722516790
deleting directory /tmp/render-unpack-1928395028
deleting directory /tmp/imageset-catalog-registry-3569095946
  1. 将同步结果 oc-mirror-workspace/result* 文件夹复制到能够访问 OpenShift 集群的 support 节点。
rsync -avP $MIRROR_DATA_PATH/oc-mirror-workspace/result* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH/oc-mirror-workspace

切换 Catalog Source

在可以访问到 OpenShift 集群的 support 节点上执行:

  1. 在安装好的 OpenShift 离线集群中需要关闭其缺省自带的 catalog source。
$ oc get CatalogSource -n openshift-marketplace
NAME                  DISPLAY               TYPE   PUBLISHER   AGE
certified-operators   Certified Operators   grpc   Red Hat     28m
community-operators   Community Operators   grpc   Red Hat     28m
redhat-marketplace    Red Hat Marketplace   grpc   Red Hat     28m
redhat-operators      Red Hat Operators     grpc   Red Hat     28m$ oc patch OperatorHub cluster --type merge -p '{"spec": {"disableAllDefaultSources": true}}'

在这里插入图片描述

  1. 编辑 oc-mirror-workspace/result*/catalogSource-cs-redhat-operator-index.yaml 文件,添加以下内容(每 3 分钟自动更新 Operator 列表),然后创建 CatalogSource 对象,这样就启用了自己的 catalog source。注意:由于 oc - mirror 每次在 results-XXXXX 目录生成的 catalogSource-cs-redhat-operator-index.yaml 文件内容都一样,因此以下命令只需要执行一次即可。
cat << EOF >> $MIRROR_DATA_PATH/oc-mirror-workspace/results-XXXXX/catalogSource-cs-redhat-operator-index.yamldisplayName: Disconnected Red Hat Catalogpublisher: MeupdateStrategy:registryPoll:interval: 3m
EOF oc create -f $MIRROR_DATA_PATH/oc-mirror-workspace/results-XXXXX/catalogSource-cs-redhat-operator-index.yaml

更新 Operator 列表

每次有新的 OpenShift 发行版、新的 Operator 或新的 Image 同步到 mirror registry 后,如果没有为 CatalogSource 配置上一步的 updateStrategy 自动更新策略,则还需要在可以访问到 OpenShift 集群的节点上执行以下命令:

  1. 添加 ImageContentSourcePolicy 配置。
oc apply -f oc-mirror-workspace/results-XXXXX/imageContentSourcePolicy.yaml
  1. 查看运行 cs-redhat-operator-index 的 Pod 更新情况。
oc get pod -n openshift-marketplace -w
  1. 确认新的 Operator 已出现在 OperatorHub 中,例如 vertical-pod-autoscaler 是新追加的 Operator。
$ oc get packagemanifest -n openshift-marketplace
NAME                    CATALOG   AGE
web-terminal                      2m36s
devworkspace-operator             2m36s
vertical-pod-autoscaler           2m36s

oc-mirror 命令说明

oc-mirror 插件会使用名为 imageset-config 的配置文件,该文件定义了镜像注册表的内容。oc-mirror 的两个主要输出是镜像注册表有效载荷(称为图像集)和元数据文件(用于存储先前生成的图像集的信息)。在这里插入图片描述

列出已有 release 版本

列出 OpenShift 发行版本,缺省会使用 default channel。

oc-mirror list releases
oc-mirror list releases --version=4.16

查看 operator 列表

oc-mirror list operators --catalogs --version=4.14
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.14 > redhat-operator.out
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.14--package=openshift-pipelines-operator-rh
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v--package=openshift-pipelines-operator-rh --channel=stable

初始化 imageset config 文件

oc-mirror init

下载 Image

适用于网络完全隔离环境:

oc-mirror --config imageset-config.yaml file:///path/to/archives
oc-mirror --from /path/to/archives docker://$SUPPORT_HOSTNAME:8443

适用于网络部分隔离环境:

oc-mirror --config imageset-config.yaml docker://$SUPPORT_HOSTNAME:8443

检查 Image 是否有更新

oc-mirror list updates --config imageset-config.yaml

参考

https://www.redhat.com/en/blog/mirroring-openshift-registries-the-easy-way
https://www.redhat.com/en/blog/how-oc-mirror-will-help-you-reduce-container-management-complexity
https://www.redhat.com/en/blog/introducing-mirror-registry-for-red-hat-openshift
https://two-oes.medium.com/deploying-a-single-operator-on-openshift-disconnected-22e01b44a5d1
https://medium.com/@santivelazquez/how-to-install-operators-in-openshift-on-an-air-gapped-environment-oc-mirror-480204e06ac6
https://naps-product-sa.github.io/ocp4-disconnected-workshop/modules/index.html
https://danielchg.github.io/posts/oc-mirror/
https://access.redhat.com/solutions/7047539
https://access.redhat.com/solutions/6994677
https://github.com/openshift/oc-mirror/blob/main/docs/usage.md
https://people.redhat.com/mskinner/rhug/q4.2022/Edge-with-OC-Mirror.pdf
https://medium.com/@abhichandra1998/installing-operators-in-a-disconnected-openshift-cluster-129af21cd904
https://docs.openshift.com/container-platform/4.16/operators/admin/olm-managing-custom-catalogs.html#olm-creating-catalog-from-index_olm-managing-custom-catalogs
https://shonpaz.medium.com/dealing-with-air-gapped-environments-just-got-much-easier-bab6b76e44f2
https://developers.redhat.com/articles/2024/07/23/how-get-red-hat-openshift-operators-information-without-oc-mirror-plug

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用npm全局安装typescript
  • Java 并发编程:一文了解 synchronized 的使用
  • JMeter接口测试-5.JMeter高级使用
  • 大模型学习笔记 - InstructGPT中的微调与对齐
  • AI测试入门:认识RAG(检索增强生成)
  • pip‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • Unity 资源之 Break Items - Toon VFX破碎物品与卡通硬币动画分享
  • 码蹄集部分题目(2024OJ赛7.31-8.4;树状数组+并查集)
  • 8.3,8.4总结
  • 人像修复-图章仿制工具
  • 【zookeeper 第七篇章】集群搭建 本文章不具体展示搭建过程 后期会单独出一篇文章编写集群搭建
  • 基于Springboot的个人博客系统
  • Stable-Diffusion1.5
  • GitHub Revert Merge Commit的现象观察和对PR的思考
  • 传输层_计算机网络
  • 分享的文章《人生如棋》
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Apache的基本使用
  • axios 和 cookie 的那些事
  • ComponentOne 2017 V2版本正式发布
  • Golang-长连接-状态推送
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • input实现文字超出省略号功能
  • PermissionScope Swift4 兼容问题
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • VuePress 静态网站生成
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前言-如何学习区块链
  • 如何编写一个可升级的智能合约
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 用mpvue开发微信小程序
  • 再次简单明了总结flex布局,一看就懂...
  • 回归生活:清理微信公众号
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 通过调用文摘列表API获取文摘
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • # Kafka_深入探秘者(2):kafka 生产者
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # 安徽锐锋科技IDMS系统简介
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (6)添加vue-cookie
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三)SvelteKit教程:layout 文件
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 物件導向與老子思想 (OO)