主頁 >  其他 > 有狀態軟體如何在 k8s 上快速擴容甚至自動擴容

有狀態軟體如何在 k8s 上快速擴容甚至自動擴容

2022-12-07 14:00:10 其他

概述

在傳統的虛機/物理機環境里, 如果我們想要對一個有狀態應用擴容, 我們需要做哪些步驟?

  1. 申請虛機/物理機
  2. 安裝依賴
  3. 下載安裝包
  4. 按規范配置主機名, hosts
  5. 配置網路: 包括域名, DNS, 虛 ip, 防火墻...
  6. 配置監控

今天虛機環境上出現了問題, 是因為 RabbitMQ 資源不足. 手動擴容的程序中花費了較長的時間.

但是在 K8S 上, 有狀態應用的擴容就很簡單, YAML 里改一下replicas副本數, 等不到 1min 就擴容完畢.

當然, 最基本的: 下鏡像, 啟動 pod(相當于上邊的前 3 步), 就不必多提. 那么, 還有哪些因素, 讓有狀態應用可以在 k8s 上快速擴容甚至自動擴容呢?

原因就是這兩點:

  1. peer discovery +peer discovery 的 相關實作(通過 hostname, dns, k8s api 或其他)
  2. 可觀察性 + 自動伸縮

我們今天選擇幾個典型的有狀態應用, 一一梳理下:

  1. Eureka
  2. Nacos
  3. Redis
  4. RabbitMQ
  5. Kafka
  6. TiDB

K8S 上有狀態應用擴容

在 Kubernetes 上, 有狀態應用快速擴容甚至自動擴容很容易. 這得益于 Kubernetes 優秀的設計以及良好的生態. Kubernetes 就像是一個云原生時代的作業系統. 它自身就具有:

  1. 自動化工具;
  2. 內部服務發現 + 負載均衡
  3. 內部 DNS
  4. 和 Prometheus 整合
  5. 統一的宣告式 API
  6. 標準, 開源的生態環境.

所以, 需要擴容, 一個 yaml 搞定全部. 包括上邊提到的: 下載, 安裝, 存盤配置, 節點發現, 加入集群, 監控配置...

Eureka 擴容

eureka

?? 備注:

有狀態擴容第一層:

StatefulSet + Headless Service

eureka 的擴容在 K8S 有狀態應用中是最簡單的, 就是:

headless service + statefulset

Eureka 要擴容, 只要 eureka 實體彼此能相互發現就可以. headless service 在這種情況下就派上用場了, 就是讓彼此發現.

Eureka 的一個完整集群 yaml, 如下:詳細說明如下:

apiVersion: v1
kind: Service
metadata:
  name: eureka
  namespace: ms
spec:
  clusterIP: None
  ports:
    - name: eureka
      port: 8888
  selector:
    project: ms
    app: eureka
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: eureka
  namespace: ms
spec:
  serviceName: eureka
  replicas: 3
  selector:
    matchLabels:
      project: ms
      app: eureka
  template:
    metadata:
      labels:
        project: ms
        app: eureka
    spec:
      terminationGracePeriodSeconds: 10   
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
        - name: eureka
          image: registry.example.com/kubernetes/eureka:latest
          ports:
            - protocol: TCP
              containerPort: 8888
          env:
            - name: APP_NAME
              value: "eureka"
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: APP_OPTS
              value: "
                     --eureka.instance.hostname=${POD_NAME}.${APP_NAME}
                     --registerWithEureka=true
                     --fetchRegistry=true
                     --eureka.instance.preferIpAddress=false
                     --eureka.client.serviceUrl.defaultZone=http://eureka-0.${APP_NAME}:8888/eureka/,http://eureka-1.${APP_NAME}:8888/eureka/,http://eureka-2.${APP_NAME}:8888/eureka/
  1. 配置名為eureka的 Service
  2. 在名為eureka的 statefulset 配置下,共 3 個 eureka 副本, 每個 eureka 的 HOSTNAME 為: ${POD_NAME}.${SERVICE_NAME}. 如: eureka-0.eureka
  3. 彼此通過--registerWithEureka=true --fetchRegistry=true --eureka.instance.preferIpAddress=false --eureka.client.serviceUrl.defaultZone=http://eureka-0.${APP_NAME}:8888/eureka/,http://eureka-1.${APP_NAME}:8888/eureka/,http://eureka-2.${APP_NAME}:8888/eureka/通過 HOSTNAME 相互注冊, 完成了集群的創建.

那么, 如果要快速擴容到 5 個:

  1. 調整 StatefulSet: replicas: 5
  2. 在環境變數APP_OPTS中加入新增的 2 個副本 hostname: http://eureka-3.${APP_NAME}:8888/eureka/,http://eureka-4.${APP_NAME}:8888/eureka/

即可完成.

Headless Service

有時不需要或不想要負載均衡,以及單獨的 Service IP, 遇到這種情況,可以通過指定 Cluster IP(spec.clusterIP)的值為 None 來創建 Headless Service,

您可以使用無頭 Service 與其他服務發現機制進行介面,而不必與 Kubernetes 的實作捆綁在一起,

對這無頭 Service 并不會分配 Cluster IP,kube-proxy 不會處理它們, 而且平臺也不會為它們進行負載均衡和路由, DNS 如何實作自動配置,依賴于 Service 是否定義了選擇算符,

Nacos

nacos

?? 備注:

有狀態擴容第二層:

StatefulSet + Headless Service + Init Container(自動化發現) + PVC

相比 Eureka, nacos 通過一個init container,(這個 init container, 就是一個自動化的 peer discovery 腳本.) , 實作了一行命令快速擴容:

kubectl scale sts nacos --replicas=3

腳本鏈接為: https://github.com/nacos-group/nacos-k8s/tree/master/plugin/peer

擴容的相關自動化操作為:

  1. 從 Headless Service 自動發現所有的 replicas 的 HOSTNAME;
  2. 并將 HOSTNAME 寫入到: ${CLUSTER_CONF} 這個檔案下.
  3. ${CLUSTER_CONF}這個檔案就是 nacos 集群的所有 member 資訊. 將新寫入 HOSTNAME 的實體加入到 nacos 集群中.

在這里, 通過 Headless Service 和 PV/PVC(存盤 nacos 插件或其他資料),實作了對 Pod 的拓撲狀態和存盤狀態的維護,從而讓用戶可以在 Kubernetes 上運行有狀態的應用,

然而 Statefullset 只能提供受限的管理,通過 StatefulSet 我們還是需要撰寫復雜的腳本(如 nacos 的peer-finder相關腳本), 通過判斷節點編號來區別節點的關系和拓撲,需要關心具體的部署作業,

RabbitMQ

rabbitmq

?? 備注:

有狀態擴容第三層:

StatefulSet + Headless Service + 插件(自動化發現和監控) + PVC

RabbitMQ 的集群可以參考這邊官方檔案: Cluster Formation and Peer Discovery

這里提到的, 動態的發現機制需要依賴外部的服務, 如: DNS, API(AWS 或 K8S).

對于 Kubernetes, 使用的動態發現機制是基于rabbitmq-peer-discovery-k8s插件 實作的.

通過這種機制,節點可以使用一組配置的值從 Kubernetes API 端點獲取其對等方的串列:URI 模式,主機,埠以及令牌和證書路徑,

另外, rabbitmq 鏡像也默認集成了監控的插件 - rabbitmq_prometheus.

當然, 通過Helm Chart也能一鍵部署和擴容.

Helm Chart

一句話概括, Helm 之于 Kubernetes, 相當于 yum 之于 centos. 解決了依賴的問題. 將部署 rabbitmq 這么復雜的軟體所需要的一大堆 yaml, 通過引數化抽象出必要的引數(并且提供默認引數)來快速部署.

Redis

redis

?? 備注:

有狀態擴容第四層:

通過 Operator 統一編排和管理:

Deployment(哨兵) + StatefulSet + Headless Service + Sidecar Container(監控) + PVC

這里以 UCloud 開源的: redis-operator 為例. 它是基于 哨兵模式 的 redis 集群.

于之前的 StatefulSet + Headless 不同, 這里用到了一項新的 K8S 技術: operator.

Operator 原理

?? 說明:

解釋 Operator 不得不提 Kubernetes 中兩個最具價值的理念:“宣告式 API” 和 “控制器模式”,“宣告式 API”的核心原理就是當用戶向 Kubernetes 提交了一個 API 物件的描述之后,Kubernetes 會負責為你保證整個集群里各項資源的狀態,都與你的 API 物件描述的需求相一致,Kubernetes 通過啟動一種叫做“控制器模式”的無限回圈,WATCH 這些 API 物件的變化,不斷檢查,然后調諧,最后確保整個集群的狀態與這個 API 物件的描述一致,

比如 Kubernetes 自帶的控制器:Deployment,如果我們想在 Kubernetes 中部署雙副本的 Nginx 服務,那么我們就定義一個 repicas 為 2 的 Deployment 物件,Deployment 控制器 WATCH 到我們的物件后,通過控制回圈,最侄訓幫我們在 Kubernetes 啟動兩個 Pod,

Operator 是同樣的道理,以我們的 Redis Operator 為例,為了實作 Operator,我們首先需要將自定義物件的說明注冊到 Kubernetes 中,這個物件的說明就叫 CustomResourceDefinition(CRD),它用于描述我們 Operator 控制的應用:redis 集群,這一步是為了讓 Kubernetes 能夠認識我們應用,然后需要實作自定義控制器去 WATCH 用戶提交的 redis 集群實體,這樣當用戶告訴 Kubernetes 我想要一個 redis 集群實體后,Redis Operator 就能夠通過控制回圈執行調諧邏輯達到用戶定義狀態,

簡單說, operator 可以翻譯為: 運維人(操作員) . 就是將高級原廠運維專家多年的經驗, 濃縮為一個: operator. 那么, 我們所有的 運維打工人 就不需要再苦哈哈的"從零開始搭建 xxx 集群", 而是通過這個可擴展、可重復、標準化、甚至全生命周期運維管理的operator, 來完成復雜軟體的安裝,擴容,監控, 備份甚至故障恢復,

Redis Operator

使用 Redis Operator 我們可以很方便的起一個哨兵模式的集群,集群只有一個 Master 節點,多個 Slave 節點,假如指定 Redis 集群的 size 為 3,那么 Redis Operator 就會幫我們啟動一個 Master 節點,兩個 Salve 節點,同時啟動三個 Sentinel 節點來管理 Redis 集群:

redis operator 哨兵架構

Redis Operator 通過 Statefulset 管理 Redis 節點,通過 Deployment 來管理 Sentinel 節點,這比管理裸 Pod 要容易,節省實作成本,同時創建一個 Service 指向所有的哨兵節點,通過 Service 對客戶端提供查詢 Master、Slave 節點的服務,最終,Redis Operator 控制回圈會調諧集群的狀態,設定集群的拓撲,讓所有的 Sentinel 監控同一個 Master 節點,監控相同的 Salve 節點,Redis Operator 除了會 WATCH 實體的創建、更新、洗掉事件,還會定時檢測已有的集群的健康狀態,實時把集群的狀態記錄到 spec.status.conditions 中.

同時, 還提供了快速持久化, 監控, 自動化 redis 集群配置的能力. 只需一個 yaml 即可實作:

apiVersion: redis.kun/v1beta1
kind: RedisCluster
metadata:
  name: redis
spec:
  config:  # redis集群配置
    maxmemory: 1gb
    maxmemory-policy: allkeys-lru
  password: sfdfghc56s  # redis密碼配置
  resources:  # redis資源配置
    limits:
      cpu: '1'
      memory: 1536Mi
    requests:
      cpu: 250m
      memory: 1Gi
  size: 3  # redis副本數配置
  storage:  # 持久化存盤配置
    keepAfterDeletion: true
    persistentVolumeClaim:
      metadata:
        name: redis
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 5Gi
        storageClassName: nfs
        volumeMode: Filesystem
  sentinel:   # 哨兵配置
    image: 'redis:5.0.4-alpine'     
  exporter:  # 啟用監控
    enabled: true 

要擴容也很簡單, 將上邊的size: 3按需調整即可. 調整后, 自動申請資源, 擴容, 加存盤, 改 redis 配置, 加入 redis 集群, 并且自動添加監控.

Kafka

strimzi

?? 備注:

有狀態擴容第五層:

通過 Operator 統一編排和管理多個有狀態組件的:

StatefulSet + Headless Service + ... + 監控

這里以 Strimzi 為例 - Strimzi Overview guide (0.20.0). 這是一個 Kafka 的 Operator.

提供了 Apache Kafka 組件以通過 Strimzi 發行版部署到 Kubernetes, Kafka 組件通常以集群的形式運行以提高可用性,

包含 Kafka 組件的典型部署可能包括:

  • Kafka 代理節點集群集群
  • ZooKeeper - ZooKeeper 實體的集群
  • Kafka Connect 集群用于外部資料連接
  • Kafka MirrorMaker 集群可在第二個集群中鏡像 Kafka 集群
  • Kafka Exporter 提取其他 Kafka 指標資料以進行監控
  • Kafka Bridge 向 Kafka 集群發出基于 HTTP 的請求

Kafka 的組件架構比較復雜, 具體如下:

img

通過 Operator, 一個 YAML 即可完成一套復雜的部署:

  • 資源請求(CPU /記憶體)
  • 用于最大和最小記憶體分配的 JVM 選項
  • Listeners (和身份驗證)
  • 認證
  • 存盤
  • Rack awareness
  • 監控指標
apiVersion: kafka.strimzi.io/v1beta1
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    replicas: 3
    version: 0.20.0
    resources:
      requests:
        memory: 64Gi
        cpu: "8"
      limits:
        memory: 64Gi
        cpu: "12"
    jvmOptions:
      -Xms: 8192m
      -Xmx: 8192m
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
        useServiceDnsDomain: true
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external
        port: 9094
        type: route
        tls: true
        configuration:
          brokerCertChainAndKey:
            secretName: my-secret
            certificate: my-certificate.crt
            key: my-key.key
    authorization:
      type: simple
    config:
      auto.create.topics.enable: "false"
      offsets.topic.replication.factor: 3
      transaction.state.log.replication.factor: 3
      transaction.state.log.min.isr: 2
      ssl.cipher.suites: "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" (17)
      ssl.enabled.protocols: "TLSv1.2"
      ssl.protocol: "TLSv1.2"
    storage: 
      type: persistent-claim
      size: 10000Gi
    rack:
      topologyKey: topology.kubernetes.io/zone
    metrics:
      lowercaseOutputName: true
      rules:
      # Special cases and very specific rules
      - pattern : kafka.server<type=(.+), name=(.+), clientId=(.+), topic=(.+), partition=(.*)><>Value
        name: kafka_server_$1_$2
        type: GAUGE
        labels:
          clientId: "$3"
          topic: "$4"
          partition: "$5"
        # ...
  zookeeper:
    replicas: 3
    resources:
      requests:
        memory: 8Gi
        cpu: "2"
      limits:
        memory: 8Gi
        cpu: "2"
    jvmOptions:
      -Xms: 4096m
      -Xmx: 4096m
    storage:
      type: persistent-claim
      size: 1000Gi
    metrics:
      # ...
  entityOperator:
    topicOperator:
      resources:
        requests:
          memory: 512Mi
          cpu: "1"
        limits:
          memory: 512Mi
          cpu: "1"
    userOperator:
      resources:
        requests:
          memory: 512Mi
          cpu: "1"
        limits:
          memory: 512Mi
          cpu: "1"
  kafkaExporter:
    # ...
  cruiseControl:
    # ...

當然, 由于 Kafka 的特殊性, 如果要將新增的 brokers 添加到現有集群, 還需要重新磁區, 這里邊涉及的更多操作詳見: Scaling Clusters - Using Strimzi

TiDB

tidb

?? 備注:

有狀態擴容第六層:

通過 Operator 統一編排和管理多個有狀態組件的:

StatefulSet + Headless Service + ... + 監控 + TidbClusterAutoScaler(類似 HPA 的實作)

甚至能做到備份和災難恢復.

TiDB 更進一步, 可以實作 有狀態應用自動擴容.

具體見這里: Enable TidbCluster Auto-scaling | PingCAP Docs

Kubernetes 提供了Horizontal Pod Autoscaler ,這是一種基于 CPU 利用率的原生 API, TiDB 4.0 基于 Kubernetes,實作了彈性調度機制,

只需要啟用此功能即可使用:

features:
  - AutoScaling=true

TiDB 實作了一個TidbClusterAutoScaler CR 物件用于控制 TiDB 集群中自動縮放的行為, 如果您使用過Horizontal Pod Autoscaler ,大概是您熟悉 TidbClusterAutoScaler 概念, 以下是 TiKV 中的自動縮放示例,

apiVersion: pingcap.com/v1alpha1
kind: TidbClusterAutoScaler
metadata:
  name: auto-scaling-demo
spec:
  cluster:
    name: auto-scaling-demo
    namespace: default
  monitor:
    name: auto-scaling-demo
    namespace: default
  tikv:
    minReplicas: 3
    maxReplicas: 4
    metrics:
      - type: "Resource"
        resource:
          name: "cpu"
          target:
            type: "Utilization"
            averageUtilization: 80

需要指出的是: 需要向TidbClusterAutoScaler 提供指標收集和查詢(監控)服務,因為它通過指標收集組件捕獲資源使用情況, monitor 屬性參考TidbMonitor 物件(其實就是自動化地配置 TiDB 的 prometheus 監控和展示等), 有關更多資訊,請參見使用TidbMonitor監視TiDB群集

總結

通過 6 個有狀態軟體, 我們見識到了層層遞進的 K8S 上有狀態應用的快速擴容甚至是自動擴容:

  1. 最簡單實作: StatefulSet + Headless Service -- Eureka
  2. 腳本/Init Container 自動化實作: StatefulSet + Headless Service + Init Container(自動化發現) + PVC -- Nacos
  3. 通過插件實作擴容和監控:StatefulSet + Headless Service + 插件(自動化發現和監控) + PVC -- RabbitMQ
  4. 通過 Operator 統一編排和管理: -- Redis
  5. 對于復雜有狀態, 是需要通過 Operator 統一編排和管理多個有狀態組件的: -- Kafka
  6. 通過 Operator 統一編排和管理多個有狀態組件的: -- TiDB

?????? 解放開發和運維打工人, 是時候在 K8S 上部署有狀態軟體了! ??????

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術博客 EWhisper.cn 撰寫.

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539418.html

標籤:其他

上一篇:快來給你的寵物視頻加個表情特效吧

下一篇:如何在Windows AD域中駐留ACL后門

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more