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

24.云原生ArgoCD高级之数据加密seale sealed

云原生专栏大纲

文章目录

    • 数据加密之seale sealed
    • Bitnami Sealed Secrets介绍
    • Bitnami Sealed Secrets工作流程
    • 安装sealed-secrets和kubeseal
      • 安装sealed-secrets-controller
      • 安装kubeseal
      • 通过kubeseal将sealed-secrets公钥拿出来
      • 通过kubeseal加密secrets
      • 替换kustomize下secret为加密secret
      • 创建argocd应用测试
      • 备份公钥私钥容灾处理

数据加密之seale sealed

kustomize项目中secret.yaml中DB配置只是简单加密存在安全问题,两种解决方案:

  1. secret.yaml不要暴露到项目中,运维人员提前在kubesphere中创建;

secret不跟项目绑定在k8s上不好管理,使用kubesphere中的保密字典能解决这个问题

  1. 暴露出secret.yaml需加密

image.png
参考secret加密管理方案,选择使用Bitnami Sealed Secrets

Bitnami Sealed Secrets介绍

Bitnami Sealed Secrets 是一个用于加密和管理敏感信息的工具,它是基于 Kubernetes 的 Sealed Secrets 控制器。Sealed Secrets 可以安全地存储和传输敏感的密钥、密码、API 密钥等信息,确保这些信息在存储和传输过程中不会被泄露。
下面是 Bitnami Sealed Secrets 的一些主要特点和工作原理:

  1. 加密敏感信息:Bitnami Sealed Secrets 使用公钥/私钥加密方案,将敏感信息加密为 Sealed Secrets 对象。只有持有私钥的人才能解密和读取这些信息。
  2. GitOps 集成:Sealed Secrets 可以与 GitOps 工作流程集成,使敏感信息的管理更加自动化和可追踪。您可以将加密的 Sealed Secrets 对象存储在 Git 存储库中,将其作为代码的一部分进行版本控制和协作。
  3. 密钥管理:Bitnami Sealed Secrets 提供了密钥管理工具,用于生成和管理公钥/私钥对。这些密钥对用于加密和解密 Sealed Secrets 对象。
  4. 控制器和解封工具:Bitnami Sealed Secrets 包含一个 Kubernetes 控制器,用于将 Sealed Secrets 对象解密为原始的 Secret 对象。解封工具可用于在非 Kubernetes 环境中解密 Sealed Secrets 对象。

使用 Bitnami Sealed Secrets,您可以更安全地管理和传输敏感信息,同时保持操作的自动化和可追踪性。它适用于需要在 Kubernetes 环境中存储和使用敏感信息的场景,如密码、API 密钥、数据库凭据等。通过加密和密钥管理,Bitnami Sealed Secrets 提供了一种可靠的方式来保护敏感信息,并确保只有授权的人员能够访问和使用这些信息。

Bitnami Sealed Secrets工作流程

image.png
Bitnami Sealed Secrets 的工作流程如下:

  1. 生成密钥对:首先,您需要生成公钥/私钥对,用于加密和解密敏感信息。这可以通过 Bitnami Sealed Secrets 提供的密钥管理工具完成。生成的公钥将用于加密敏感信息,并将其存储为 Sealed Secrets 对象。
  2. 加密敏感信息:使用生成的公钥,您可以将敏感信息加密为 Sealed Secrets 对象。这可以通过将敏感信息转换为 Kubernetes Secret 对象,然后使用 Sealed Secrets 控制器将其加密为 Sealed Secrets 对象来实现。
  3. 存储 Sealed Secrets 对象:加密后的 Sealed Secrets 对象可以存储在 Git 存储库中,作为代码的一部分进行版本控制和协作。在存储库中,Sealed Secrets 对象将被视为不可读的密文。
  4. 部署 Sealed Secrets 控制器:在 Kubernetes 集群中部署 Sealed Secrets 控制器。该控制器将负责监视并解密存储在 Sealed Secrets 对象中的敏感信息,并将其转换为原始的 Kubernetes Secret 对象。
  5. 解密敏感信息:一旦 Sealed Secrets 控制器在集群中运行,它将自动解密 Sealed Secrets 对象,并将其转换为原始的 Secret 对象。这样,其他应用程序和服务就可以使用这些解密后的敏感信息,如密码、API 密钥等。

通过这个工作流程,Bitnami Sealed Secrets 提供了一种安全的方式来管理和使用敏感信息。敏感信息在存储和传输过程中都是加密的,只有在运行 Sealed Secrets 控制器的 Kubernetes 集群中才能被解密和使用。这样可以保护敏感信息免受未经授权的访问和泄露。同时,使用 GitOps 工作流程,可以将加密的 Sealed Secrets 对象与代码一起进行版本控制和协作,提高开发团队的效率和安全性。

安装sealed-secrets和kubeseal

选择版本:https://github.com/bitnami-labs/sealed-secrets/releases 下载如下文件
image.png

安装sealed-secrets-controller

介绍两种部署方式:
方式1:选择版本:https://github.com/bitnami-labs/sealed-secrets/releases

kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml# 修改文件中镜像地址
# 将image: docker.io/bitnami/sealed-secrets-controller:0.25.0
# 修改为ghcr.io/bitnami-labs/sealed-secrets-controller:0.25.0
# 参考https://github.com/bitnami-labs/sealed-secrets/pkgs/container/sealed-secrets-controller

安装后再kubesphere系统组件中会出现如下信息:
image.png
并生成保密字典信息:
image.png
方式2:在kubesphere中通过应用仓库部署
image.png
image.png
image.png

安装kubeseal

# -0 kubeseal将下载文件保存问当前目录下kubeseal
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/kubeseal-linux-amd64 -0 kubesealmv kubeseal /usr/local/bin/kubeseal
# 验证
kubeseal --version

Kubeseal 是一个用于创建和管理 Sealed Secrets 的工具,它是 Bitnami Sealed Secrets 的一部分。Kubeseal 通过与 Kubernetes API 交互,可以生成 Sealed Secrets 对象并将其加密为密文,以便安全地存储和传输敏感信息。
下面是 Kubeseal 的一些主要特点和用法:

  1. 生成 Sealed Secrets 对象:使用 Kubeseal,您可以从现有的 Kubernetes Secret 对象生成 Sealed Secrets 对象。这可以通过运行命令行工具来完成,工具会将 Secret 对象的内容加密并生成相应的 Sealed Secrets 对象。
  2. 加密敏感信息:Kubeseal 使用 Sealed Secrets 控制器的公钥来加密敏感信息。在生成 Sealed Secrets 对象时,Kubeseal 会自动获取集群中的 Sealed Secrets 控制器的公钥,并使用该公钥对敏感信息进行加密。
  3. 密钥管理:Kubeseal 可以与密钥管理工具集成,用于生成和管理 Sealed Secrets 控制器所需的公钥/私钥对。这些密钥对用于加密和解密 Sealed Secrets 对象。
  4. GitOps 集成:Kubeseal 可以与 GitOps 工作流程集成,使生成的 Sealed Secrets 对象可以与代码一起进行版本控制和协作。您可以将生成的 Sealed Secrets 对象存储在 Git 存储库中,确保敏感信息的安全性和可追踪性。

使用 Kubeseal,您可以更方便地创建和管理 Sealed Secrets 对象,将敏感信息加密为密文,并确保只有在运行 Sealed Secrets 控制器的 Kubernetes 集群中才能解密和使用这些信息。它简化了 Sealed Secrets 的生成过程,并提供了与密钥管理和 GitOps 的集成,使敏感信息的管理更加自动化和可靠。

通过kubeseal将sealed-secrets公钥拿出来

可以通过kubesphere查看保密字典或者通过k8s命令查看拷贝出来,手动操作可能会出错,推荐使用kubeseal将公钥拿出来

# 备份公钥
kubeseal --fetch-cert > public-cert.pem

将公钥拷贝到argocd-in-action测试项目argocd-in-action下

通过kubeseal加密secrets

https://github.com/ppsite/argocd-in-action

  1. secret.yaml如下:
apiVersion: v1
kind: Secret
metadata:name: db-connectionnamespace: flask-demo
type: Opaque
data:DB_NAME: ZGVtbw==DB_USERNAME: cm9vdA==DB_PASSWORD: cGFzc3dvcmQ=DB_HOST: MTI3LjAuMC4xDB_PORT: OTUyNw==

DB明文内容如下:
image.png

  1. 加密secret.yaml
kubeseal --format=yaml --cert ./public-cert.pem < secret.yaml > secret-sealed.yaml

这个命令使用了 kubeseal 工具,它是一个用于密钥管理和加密 Kubernetes Secrets 的工具。让我们逐步解释这个命令的每个部分:

  • kubeseal: 这是执行密钥管理和加密操作的命令。
  • –format=yaml: 这个选项指定输出的格式为 YAML。它告诉 kubeseal 命令将密封(sealed)的 Secret 输出为 YAML 格式。
  • –cert .public-cert.pem: 这个选项指定了用于密封操作的公钥证书文件。./public-cert.pem 是公钥证书的文件路径。密封操作使用公钥来加密 Secrets。
  • < secret.yaml: 这个符号 < 表示将 secret.yaml 文件作为输入传递给 kubeseal 命令。secret.yaml 是包含要密封的 Secret 数据的文件。
  • secret-sealed.yaml: 这个符号 > 表示将 kubeseal 命令的输出重定向到 secret-sealed.yaml 文件中。secret-sealed.yaml 是生成的密封(sealed)的 Secret 数据的输出文件。

综合来说,这个命令的作用是将 secret.yaml 文件中的 Secret 数据进行加密,并将加密后的结果保存到 secret-sealed.yaml 文件中。加密操作使用了 kubeseal 命令所指定的公钥证书文件(.public-cert.pem)。密封(sealed)的 Secret 数据可以安全地存储或传输,只有拥有相应私钥的人才能解密并访问其中的数据。这样可以确保在 Kubernetes 集群中管理敏感信息时的安全性。

替换kustomize下secret为加密secret

  1. 查看secret-sealed.yaml文件,发现DB配置已经加密:
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:creationTimestamp: nullname: db-connectionnamespace: flask-demo
spec:encryptedData:DB_HOST: AgCzkIzXN9kxF/2+hShvPr+ic7cnxt5kbMtkaPbUe+d3Hvo87y3F2/MV2s8jn/OQmw5F05YkLa9o3mU4ilVLqeyFPl6uATyrkYPm9k7Qc+0e8TwWf3/LvFayMHKdbv0cT3nd8vc43+pD/37o8sY8DWTQ1bb9ffSwsoyue9mOrs5tSXtCxcR8AubXSaC+8lzCHnObTCe4JDUMjc838fhmA8Uub6T0csBhiiBGI9DHJT+87RtgDjHYrc6A90Vx35eGfrlLuCGwlPe4gsshUB0n6BaBpBjSzBhrOiH9z5bY1yLk5NnNzKp/Pk+hdVOrsg74R3yoXF0mqmoa152jWwgR7R1rDCmBe5oN0i+EeSrbBa6jujR4M5yJXmDbNrgnC1yhrN+w/fC9w51QAwQQGxY8VWw6A8vJVvyUSPaWWSzbsw/a0lbDnUcC7AdeZ2bXAnY8/BKDNskJ17lO0ReaB2AImXpEjXq+KZPQABCEj6epxRa3zOKurpAewVcmWwbPtlgjySH4nGzc9TDrCjHy4epBPtp0niIWIfnOV3HndsE9OdETYOQtITZQu/s6wmvQbt7g5pP7d6uf6S/c7cfZW1ZXzjg9vHzea56rvp5wPs19A8kvl9ArYOvgDxUu0EKV5KDpjHJr6G5ZCpBZxDbirHN0pTcSbxVir3apQ9I8Pi8pKCZbNyejX31WGzyh1KfIoe394sjnxm+Hf4Ui4JI=DB_NAME: AgCErq9kQOue3LKVOIYrxosypAWPrN7cxrysiIgK6jVORTH/bWj06XP7MBAYaawvzX3zG4ovh52fHzXlNmyT1cwvosxSIyPRB+pKfOiD7VvzV0k1TG9Yux2rxOS3RamNLnwnChbYsUFcq/oy9ImqdHwcNlI6jTrTp/zOB4sX8SOtfKJPmXY+FwHovHgP0zY9PG/XF0G7E1PH3jQbJDTUI/aer7ZCRLT45u2H0aIGfNJ60U3xw341TyDN/stY7nJHue3eEpPcz7DI+sIwkbQN/PV+i4R2gUkO92BzP62b32pbrFuJ8ouSUyHhIUGliRRcaeNMNlIxWN8E+gB31M3OG77ULfBRQAG3jOrpHaoVDSEj1TiYiSYcyqYSVnsL5OsQdc3sVunlBqi68U3RiYJ3tiW88BW4AJAozJPzihjMDn3kJ3qmPAp+9UaWnFLuydMG55pPaN+HrWuOMtuhChqze4xs3ryU+7AYplBM7Qi/auMipq7qxiwm8gQBLIylmIHDWrEjcD+y93Nv9lAXYkA3hYKg2wKW2ntMvSd2N+rCCwrSmlpRhSX47eLFEeqIdHpjN0or4m+R7kj8zonE2rTmCxp7axZhoucHcU/XbHRcbufitwTismZw36XyC3wSpNy9urfsOkAt2KfDGZWKGUpWANO8QEuST9N7ORVvRG4Rw7sDzcdFmZUEoyFKibHgVr0GNgQLZ3GUDB_PASSWORD: AgAoeg8lSHrL7KuXXE42a0yDTHBBaSkpgrfuudnaH7V0eHiIH1bjaM+vSl8wJdMUJ+QAcqPJ/QzvYjqU8vOH7JWwz28GzzBhtOV0/nOrtGREjNKEBqvjDvUDZdxU1AtQrvwivRhROd2F1TmvU77FQkL7nzclhVuIud3DOatZAcEAZNtuhVMtrqWkOP2H9RFgt4fbTGMvwtL1lj2TLXlKPKlSywAnMhrh5JCmkilEoPN1s9GJy6bVpgN355stYIlHaURi8bLy1DvtZrinBr2Eh9yk5HZTHto2TAvYfZl9PzkjV2upX14bX21+VPHwUSfYbdU9JG/M31BDJVIYxd54ue9fWiV3n/Df9/F+/dB9qlntsaOe8lMxJHr0/HRkGg2Bcqa2U5GDyn8aF+lNxaJJefI24hPPnzdU8LhQUJYa80n7wMNZQAK+7BReeVAg3OYGhtOwldOmMbAJMEH+aQ0sRapx7xgU7yqF8afdDEDsmv5p9ZBa5KAxqVoatlsWxqkAgvpkgycZGuAeEb4KZNltBqPAPPee//yaJkVXQ3LVrDftuYAoWoiHOcKdUc2f7bnBMC8tGz+fUL8Ipsjlo+NdkV58go2fg4neG0XGuIY5vv6362ZtD8hlFPIZsjE+v3jDChZr8d2YHHgm7Rd947UVHwoOGJ/bs+Se56CEF6UQblsjk01PbXZ7NBXGMEWUHD8p/bKyDkAEB2DCLg==DB_PORT: AgBwjV6sMLMVPCXiphwIatStoYc0MeqghB3ewQ3OpnO+Q/Qzuf9dR4eWqWYmwoOgwEo9FdJTA/vRNhy087ZYA3lsCjdfFvqlcdo5JkDyWszs0rfYNsoqrr0R6AP+41M6JEtdaJN5GNWAZXfWLA6jK4/nvG8tlXW6eg7FS9egLjHlbO/6+lh2Z2tqOFwh9Ifmw4Cb6JKOHgd7NXCW5U9UV9PO9uxP44JFaJwOIeNpSzcTswn5RZqrfaCSzhvXvgnjB7XDwoM9dn0tvBg8bC2dfIoMcSHvQUBVxSqt0DLdDr+de0e1E3zUvjofZ0DAs2CSAXyyxjy6p3nglyvKo0D6GPizEEOpOVFv/9+eehp+TwcezOHjlE8WZRlC5NT9hD7qCu9xXfNRG/oDI1ayn76WjOcq0yK4Gm13NzKvZTlolwEYs+jgCF7c9lFeG3uezGdVY2tLCYe98YzXhdXEejkOcBi0NGa6IQeqjBRfRPOfPyKwIfZKJgyi9SpTfPrO+dGc9AthIh7SxOqKoTzIuQNdvG8DxoahFYWuxzFq2jOwIOcFrp5Vu8Nb1aFnf9BWeKV/3w34MpNl6TDnZSzxgLO5pDu2qnbgMDH4ZWDru2Mg9VAzPDiSBrFJwbO7cIWRihoM4NZDXFsiFsS+eV+hN1/x4xPJJdbAlAKlNOnoEqjjPIngeTkiz37ShBFgiLoWlZzlFY27ZDaaDB_USERNAME: AgAMmJwduaDQh3tVitC1qU6Cf1NvhO4mFW8b/42JlGieEeIEiqOqVXctqlZwYcTwSBt/nu2qWq+5VMA25sGfQwS1z7k5oQPKZFoWcl4KlMhnSIZiBkdinPiqneoKBmrYiCs7lFDj4hY4yGwzSpE1zepjAUUfaW+poHAWFn/WN2bGqcgqXPkQlbCcRQa/lH50k/Ddup2SrQB/YkpAfbT9Rp1ST308UnxwJbs5bki6alAar807BaoCfANrnAJRvDGel2SzLAyNb66o7k6on6Ceh9cRGG1tv4YVdQcrbnF1E1r5qxJumQtID0/FSezbFFeS6ukawopdilt8ymGvM/l/p2O8Spaa6UyGnvlSt96PPSpHH7LBX5Ji7O2bxauaTSxQadIYEfqg/uuHDWvfHMIVYCR41knV1GwKiVdyzlCshIXmW4XaqUEf3mDT3ckLm8liGDl9NS42VteEcI52n7dV5/YbksOiAkQq5JZQRwAR9mOY8USQ/SVm42ZZ8q4LMYw5PGrgGG4pZTlM+AjzfA++ebhKqjMVTt0q+Mznfo6xeXKIvnlkvcOYLmBlxEW+hz2wXNmvWrVbs9WKGshR2LSU+Ktxhv8HVXMFRxIWKVjyGxtdw58X6sef1sWSmaVzQFTrZ0yl/KFCjK0O8n5qk9CrUWB95QofOMoEz4BRcePLQYgPXnp10U+IqpSCPQVXmUqSgSjdjlj+template:metadata:creationTimestamp: nullname: db-connectionnamespace: flask-demotype: Opaque
  1. 替换argocd-in-action测试项目kustomize下的secret.yaml为secret-sealed.yaml

image.png

创建argocd应用测试

image.png
发现SealedSecret创建失败,点击进入查看具体原因,提示资源已经存在
image.png
修改secret-sealed.yaml下db-connection名称,删除flask-demo名称空间,重新同步:
image.png
提示没有秘钥可以解密,查看sealed-secrets-controlled日志:

 Error updating flask-demo/db-connection-secret-sealed, giving up: no key could decrypt secret (DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME)E0122 09:10:20.514766       1 controller.go:277] no key could decrypt secret (DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME)Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"flask-demo", Name:"db-connection-secret-sealed", UID:"b6e760eb-8260-4e90-b2ac-56d439f59216", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"11922787", FieldPath:""}): type: 'Warning' reason: 'ErrUnsealFailed' Failed to unseal: no key could decrypt secret (DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME)

备份公钥私钥容灾处理

  1. 备份私钥
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > private.key
  • kubectl: Kubernetes 命令行工具,用于与 Kubernetes 集群进行交互。
  • get secret: 获取 Kubernetes 集群中的 Secret 资源。
  • -n kube-system: 指定命令在 kube-system 命名空间中执行,即获取 kube-system 命名空间下的 Secret。
  • -l sealedsecrets.bitnami.com/sealed-secrets-key: 使用标签选择器,只返回具有指定标签的 Secret。这里的标签是 sealedsecrets.bitnami.com/sealed-secrets-key。
  • -o yaml: 指定输出格式为 YAML。将获取的 Secret 资源以 YAML 格式打印到标准输出。
  • private.key: 将标准输出的内容重定向到 private.key 文件中。这将把 YAML 输出保存到名为 private.key 的文件中。

因此,该命令的作用是获取位于 kube-system 命名空间下,具有标签 sealedsecrets.bitnami.com/sealed-secrets-key 的 Secret 资源,并将其以 YAML 格式保存到名为 private.key 的文件中。这个文件可能包含密钥或其他敏感信息,用于后续操作或配置。

  1. 模拟灾难:卸载sealed-secrets-controller
kubectl delete -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml

上述操作不会删除secrets

  1. 恢复
# 先导入私钥
kubetl apply -f private.key
# 重建sealed-secrets-controller
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml

相关文章:

24.云原生ArgoCD高级之数据加密seale sealed

云原生专栏大纲 文章目录 数据加密之seale sealedBitnami Sealed Secrets介绍Bitnami Sealed Secrets工作流程安装sealed-secrets和kubeseal安装sealed-secrets-controller安装kubeseal通过kubeseal将sealed-secrets公钥拿出来通过kubeseal加密secrets替换kustomize下secret为…...

线性代数:线性方程组

目录 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理...

标准的排序组合-算法

题目 有若干个字母&#xff0c;要求计算出长度为4的所有可能得组合 解题 排序组合最适用的就是回溯了&#xff0c;建议大家本地debug一层一层的看能好理解点 private static void getResult(List<String> source, Stack<String> temp, int curLength, int maxL…...

2402C++,C++递归取各种节点名字

参考 explicit FindNamedClassVisitor(ASTContext *Context) : Context(Context) {}元<类 T>极 动作(T&e){串 ae->getQualifiedNameAsString();d.加(a);中 真;} bool VisitCXXRecordDecl(CXXRecordDecl *e) {中 动作(e);} bool VisitFunctionDecl(FunctionDecl*e…...

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(三)

1.QSet: toList 中的toList 函数已不存在&#xff0c;遇到xx->toList改成直接用&#xff0c;如下&#xff1a; 2.开源QWT 图形库中QwtDial中的 setPenWidth 变成 setPenWidthF函数。 3.QDateTime 中无setTime_t 改为了setSecsSinceEpoch函数。 4.QRegExp 类已不存在 可以用Q…...

Logstash 7.7.1版本安装系统梳理

前言 上一篇文章介绍了 《ElasticSearch7.7.1集群搭建 & Kibana安装》&#xff0c;今天说一下 Logstash的安卓和配置&#xff1b; Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化…...

4. sass实用函数归纳

4. sass实用函数归纳 字符串函数 1、quote(string) 给字符串添加引号 quote(xiaoming) // "xiaoming"2、unquote(string) 移除字符串的引号 unquote("xiaoming") // xiaoming3、str-index(string, substring) 返回 substring 子字符串第一次在 stri…...

《元梦之星》赛季更新带来“新”内容,为何却被玩家集体声讨?

前段时间&#xff0c;《元梦之星》迎来了“山海奇遇”赛季的重磅更新&#xff0c;诸多“新”内容的上线吸引了很多玩家们的关注&#xff0c;然而在新版本开启之后没有多&#xff0c;新玩法新时装甚至是游戏中的新改动都引起了不少玩家的不满。 在新赛季开启之后&#xff0c;玩家…...

故障诊断 | 一文解决,CNN-SVM卷积神经网络-支持向量机组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-SVM卷积神经网络-支持向量机组合模型的故障诊断(Matlab) 模型描述 卷积神经网络(Convolutional Neural Network,CNN)和支持向量机(Support Vector Machine,SVM)是两种常用的机器学习算法,它们在不同领域和任务中都表现出…...

菜鸡后端的前端学习记录-2

前言 记录一下看视频学习前端的的一些笔记&#xff0c;以前对Html、Js、CSS有一定的基础&#xff08;都认得&#xff0c;没用过&#xff09;&#xff0c;现在不想从头再来了&#xff0c;学学Vue框架&#xff0c;不定时更新&#xff0c;指不定什么时候就鸽了。。。。 忘了记一下…...

Layui + Echarts 5.0

Layui 怎么整合最新版本的 Echarts 5.0&#xff0c;Echarts 4 升级到 5后&#xff0c;有了很大改变&#xff0c;新的配置项4是无法兼容的&#xff0c;所以想要使用新的功能&#xff0c;都需要升级&#xff01; 新建一个echarts.js文件 layui.define(function (exports) {// 这…...

linux使用iptables禁用ip

iptables是什么&#xff1f; iptables 是一个强大的开源软件&#xff0c;它是 Linux 系统内核中 netfilter 包过滤框架的一部分&#xff0c;用来实现防火墙功能。iptables 提供了一种灵活的方式来控制和管理进出以及通过 Linux 计算机的网络流量。 前提 我在云服务器上用doc…...

安全防御第五次作业

拓扑图及要求如下&#xff1a; 实验注意点&#xff1a; 先配置双机热备&#xff0c;再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致双机热备时&#xff0c;请确保vrrp配置的虚拟IP与下面的ip在同一网段如果其中一台防火墙有过配置&#xff0c;最好清空或重启&…...

分库分表原则

分库分表原则 单表数据到达千万级别或者20存储空间 优化已经解决不了问题一 IO瓶颈导致性能问题 拆分策略 垂直分库 以表为依据&#xff0c;根据业务将不同的表拆分到不同库中&#xff0c;有点像微服务 垂直分表 以字段为依据&#xff0c;根据字段属性将不同字段拆分到不同…...

VUE PC端可拖动悬浮按钮

一、实现效果&#xff1a; 二、FloatButton.vue <template><div><div class"sssss"><div class"callback float" mousedown"down" touchstart"down" mousemove"move" touchmove"move" mous…...

opencv0014 索贝尔(sobel)算子

前面学习的滤波器主要是用来模糊图像&#xff0c;今天一起来了解关于边缘识别的滤波吧&#xff01;嘿嘿 边缘 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取&#xff0c;对象检测&#xff0c;模式识别等方面都有重要的作用。 人眼如…...

Redis简介和数据类型

简介 Redis是完全开源&#xff08;BSD许可&#xff09;的内存数据结构存储&#xff0c;是一个高性能的 key-value 数据库&#xff0c;用作数据库、缓存、消息代理和流式处理引擎。 Redis 提供数据结构&#xff0c;例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超…...

Day06-Linux下目录命令讲解及重要文件讲解

Day06-Linux下目录命令讲解及重要文件讲解 1. Linux目录文件1.1 Linux系统目录结构介绍1.1.1 Linux与Windows目录结构对比 1.2 重要的Linux配置文件介绍1.2.1 /etc系统初始化及设置相关重要文件1.2.2 /usr目录的重要知识介绍------应用程序目录1.2.3 /var目录下的路径知识-----…...

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种&#xff0c;包括&#xff1a;示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示&#xff0c;有&#xff1a;急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…...

PYTHON蓝桥杯——每日一练(简单题)

题目 求123...n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行&#xff0c;包括一个整数&#xff0c;表示123...n的值。 提示 说明&#xff1a;请注意这里的数据规模。 本题直接的想法是直接使用一个循环来累加&#xff0c;然而&#xff0c;当数据规模很大时&…...

【数据结构 01】栈

一、原理 栈通常从数据结构和内存空间两个角度解释&#xff0c;从数据结构的角度&#xff0c;栈是一种线性结构表&#xff0c;只允许在固定的一端进行插入和删除元素&#xff0c;从内存空间角度&#xff0c;操作系统为函数和变量分配的内存空间通常在栈区&#xff0c;但是无论…...

⑩电子产品拆解分析-家用无线遥控开关433Mhz

⑩电子产品拆解分析-家用无线遥控开关433Mhz 一、功能介绍二、电路分析以及器件作用1、433发射控制端2、433接收应答端三、Get到的点一、功能介绍 ①免布线随意贴,装上就能使用解决单线开关烦恼;②遥控配对简单,无线通讯距离长,信号可穿墙;二、电路分析以及器件作用 1、43…...

java之手动创建spring-boot-3项目

手动创建 基于springboot3 正确配置maven的前提下&#xff0c;创建一个空的项目 复制下面的pom文件&#xff0c;使用maven下载依赖即可 前提是maven配置的没问题 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…...

Linux--redhat9创建软件仓库

1.插入光盘&#xff0c;挂载镜像 模拟插入光盘: 点击:虚拟机-可移动设备-CD/DVD 设备状态全选&#xff0c;使用ISO影响文件选择当前版本镜像&#xff0c;点击确认。 2.输入: df -h 可以显示&#xff0c;默认/dev/sr0文件为光盘文件&#xff0c;挂载点为/run/media/root/镜像…...

[力扣 Hot100]Day20 旋转图像

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 出处 思路 旋转时每四个位置为一组进行swap操作&#xff0c;找好对…...

golang网络编程day5

golang网络编程day5 golang cookie实现记住我功能golang cookie实现购物车功能golang cookie CSRF防御应用golang sessiongolang session 用户身份验证应用golang session应用程序中的状态管理golang实现在线人数统计golang session购物车应用golang session用户个性化设置应用…...

Swagger学习使用

swagger升级导致访问ui页面地址不一样 方式一 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.3.RELEASE</version> </parent> <dependen…...

SpringBoot使用poi将word转换为PDF并且展示

1.前言 由于最近做了一个需求&#xff0c;界面上有一个按钮&#xff0c;点击按钮后将一个文件夹中的word文档显示在页面中&#xff0c;并且有一个下拉框可以选择不同的文档&#xff0c;选择文档可以显示该文档。这里我选择使用fr.opensagres.poi.xwpf.converter.pdf-gae依赖包…...

Java多线程--线程间的通信

文章目录 一、线程间的通信&#xff08;1&#xff09;为什么要处理线程间的通信&#xff08;2&#xff09;等待唤醒机制 二、案例&#xff08;1&#xff09;案例1、创建线程2、解决线程安全问题3、等待4、唤醒5、同步监视器 &#xff08;2&#xff09;调用wait和notify需注意的…...

vue + element 页面滚动计算百分比 + 节流函数

html&#xff1a; <el-progress :percentage"scrollValue"></el-progress> js&#xff1a; data() {return {scrollValue: 0,} }, mounted() {window.addEventListener(scroll, this.handleScroll) // 监听页面滚动 }, beforeDestroy() {window.remov…...