主頁 >  其他 > 如何接入 K8s 持久化存盤?K8s CSI 實作機制淺析

如何接入 K8s 持久化存盤?K8s CSI 實作機制淺析

2021-10-27 08:36:34 其他

作者

王成,騰訊云研發工程師,Kubernetes contributor,從事資料庫產品容器化、資源管控等作業,關注 Kubernetes、Go、云原生領域,

概述

進入 K8s 的世界,會發現有很多方便擴展的 Interface,包括 CSI, CNI, CRI 等,將這些介面抽象出來,是為了更好的提供開放、擴展、規范等能力,

K8s 持久化存盤經歷了從 in-tree Volume 到 CSI Plugin(out-of-tree) 的遷移,一方面是為了將 K8s 核心主干代碼與 Volume 相關代碼解耦,便于更好的維護;另一方面則是為了方便各大云廠商實作統一的介面,提供個性化的云存盤能力,以期達到云存盤生態圈的開放共贏,

本文將從持久卷 PV 的 創建(Create)、附著(Attach)、分離(Detach)、掛載(Mount)、卸載(Unmount)、洗掉(Delete) 等核心生命周期,對 CSI 實作機制進行了決議,

相關術語

Term Definition
CSI Container Storage Interface.
CNI Container Network Interface.
CRI Container Runtime Interface.
PV Persistent Volume.
PVC Persistent Volume Claim.
StorageClass Defined by provisioner(i.e. Storage Provider), to assemble Volume parameters as a resource object.
Volume A unit of storage that will be made available inside of a CO-managed container, via the CSI.
Block Volume A volume that will appear as a block device inside the container.
Mounted Volume A volume that will be mounted using the specified file system and appear as a directory inside the container.
CO Container Orchestration system, communicates with Plugins using CSI service RPCs.
SP Storage Provider, the vendor of a CSI plugin implementation.
RPC Remote Procedure Call.
Node A host where the user workload will be running, uniquely identifiable from the perspective of a Plugin by a node ID.
Plugin Aka “plugin implementation”, a gRPC endpoint that implements the CSI Services.
Plugin Supervisor Process that governs the lifecycle of a Plugin, MAY be the CO.
Workload The atomic unit of "work" scheduled by a CO. This MAY be a container or a collection of containers.

本文及后續相關文章都基于 K8s v1.22

流程概覽

PV 創建核心流程:

  • apiserver 創建 Pod,根據 PodSpec.Volumes 創建 Volume;
  • PVController 監聽到 PV informer,添加相關 Annotation(如 pv.kubernetes.io/provisioned-by),調諧實作 PVC/PV 的系結(Bound);
  • 判斷 StorageClass.volumeBindingModeWaitForFirstConsumer 則等待 Pod 調度到 Node 成功后再進行 PV 創建,Immediate 則立即呼叫 PV 創建邏輯,無需等待 Pod 調度;
  • external-provisioner 監聽到 PV informer, 呼叫 RPC-CreateVolume 創建 Volume;
  • AttachDetachController 將已經系結(Bound) 成功的 PVC/PV,經過 InTreeToCSITranslator 轉換器,由 CSIPlugin 內部邏輯實作 VolumeAttachment 資源型別的創建;
  • external-attacher 監聽到 VolumeAttachment informer,呼叫 RPC-ControllerPublishVolume 實作 AttachVolume;
  • kubelet reconcile 持續調諧:通過判斷 controllerAttachDetachEnabled || PluginIsAttachable 及當前 Volume 狀態進行 AttachVolume/MountVolume,最終實作將 Volume 掛載到 Pod 指定目錄中,供 Container 使用;

從 CSI 說起

CSI(Container Storage Interface) 是由來自 Kubernetes、Mesos、Docker 等社區 member 聯合制定的一個行業標準介面規范(https://github.com/container-storage-interface/spec),旨在將任意存盤系統暴露給容器化應用程式,

CSI 規范定義了存盤提供商實作 CSI 兼容的 Volume Plugin 的最小操作集和部署建議,CSI 規范的主要焦點是宣告 Volume Plugin 必須實作的介面,

先看一下 Volume 的生命周期:

   CreateVolume +------------+ DeleteVolume
 +------------->|  CREATED   +--------------+
 |              +---+----^---+              |
 |       Controller |    | Controller       v
+++         Publish |    | Unpublish       +++
|X|          Volume |    | Volume          | |
+-+             +---v----+---+             +-+
                | NODE_READY |
                +---+----^---+
               Node |    | Node
              Stage |    | Unstage
             Volume |    | Volume
                +---v----+---+
                |  VOL_READY |
                +---+----^---+
               Node |    | Node
            Publish |    | Unpublish
             Volume |    | Volume
                +---v----+---+
                | PUBLISHED  |
                +------------+

The lifecycle of a dynamically provisioned volume, from
creation to destruction, when the Node Plugin advertises the
STAGE_UNSTAGE_VOLUME capability.

從 Volume 生命周期可以看到,一塊持久卷要達到 Pod 可使用狀態,需要經歷以下階段:

CreateVolume -> ControllerPublishVolume -> NodeStageVolume -> NodePublishVolume

而當洗掉 Volume 的時候,會經過如下反向階段:

NodeUnpublishVolume -> NodeUnstageVolume -> ControllerUnpublishVolume -> DeleteVolume

上面流程的每個步驟,其實就對應了 CSI 提供的標準介面,云存盤廠商只需要按標準介面實作自己的云存盤插件,即可與 K8s 底層編排系統無縫銜接起來,提供多樣化的云存盤、備份、快照(snapshot)等能力,

多組件協同

為實作具有高擴展性、out-of-tree 的持久卷管理能力,在 K8s CSI 實作中,相關協同的組件有:

組件介紹

  • kube-controller-manager:K8s 資源控制器,主要通過 PVController, AttachDetach 實作持久卷的系結(Bound)/解綁(Unbound)、附著(Attach)/分離(Detach);
  • CSI-plugin:K8s 獨立拆分出來,實作 CSI 標準規范介面的邏輯控制與呼叫,是整個 CSI 控制邏輯的核心樞紐;
  • node-driver-registrar:是一個由官方 K8s sig 小組維護的輔助容器(sidecar),它使用 kubelet 插件注冊機制向 kubelet 注冊插件,需要請求 CSI 插件的 Identity 服務來獲取插件資訊;
  • external-provisioner:是一個由官方 K8s sig 小組維護的輔助容器(sidecar),主要功能是實作持久卷的創建(Create)、洗掉(Delete);
  • external-attacher:是一個由官方 K8s sig 小組維護的輔助容器(sidecar),主要功能是實作持久卷的附著(Attach)、分離(Detach);
  • external-snapshotter:是一個由官方 K8s sig 小組維護的輔助容器(sidecar),主要功能是實作持久卷的快照(VolumeSnapshot)、備份恢復等能力;
  • external-resizer:是一個由官方 K8s sig 小組維護的輔助容器(sidecar),主要功能是實作持久卷的彈性擴縮容,需要云廠商插件提供相應的能力;
  • kubelet:K8s 中運行在每個 Node 上的控制樞紐,主要功能是調諧節點上 Pod 與 Volume 的附著、掛載、監控探測上報等;
  • cloud-storage-provider:由各大云存盤廠商基于 CSI 標準介面實作的插件,包括 Identity 身份服務、Controller 控制器服務、Node 節點服務;

組件通信

由于 CSI plugin 的代碼在 K8s 中被認為是不可信的,因此 CSI Controller Server 和 External CSI SideCar、CSI Node Server 和 Kubelet 通過 Unix Socket 來通信,與云存盤廠商提供的 Storage Service 通過 gRPC(HTTP/2) 通信:

RPC 呼叫

從 CSI 標準規范可以看到,云存盤廠商想要無縫接入 K8s 容器編排系統,需要按規范實作相關介面,相關介面主要為:

  • Identity 身份服務:Node Plugin 和 Controller Plugin 都必須實作這些 RPC 集,協調 K8s 與 CSI 的版本資訊,負責對外暴露這個插件的資訊,
  • Controller 控制器服務:Controller Plugin 必須實作這些 RPC 集,創建以及管理 Volume,對應 K8s 中 attach/detach volume 操作,
  • Node 節點服務:Node Plugin 必須實作這些 RPC 集,將 Volume 存盤卷掛載到指定目錄中,對應 K8s 中的 mount/unmount volume 操作,

相關 RPC 介面功能如下:

創建/洗掉 PV

K8s 中持久卷 PV 的創建(Create)與洗掉(Delete),由 external-provisioner 組件實作,相關工程代碼在:【https://github.com/kubernetes-csi/external-provisioner】

首先,通過標準的 cmd 方式獲取命令列引數,執行 newController -> Run() 邏輯,相關代碼如下:

// external-provisioner/cmd/csi-provisioner/csi-provisioner.go
main() {
...
	// 初始化控制器,實作 Volume 創建/洗掉介面
	csiProvisioner := ctrl.NewCSIProvisioner(
		clientset,
		*operationTimeout,
		identity,
		*volumeNamePrefix,
		*volumeNameUUIDLength,
		grpcClient,
		snapClient,
		provisionerName,
		pluginCapabilities,
		controllerCapabilities,
		...
	)
	...
	// 真正的 ProvisionController,包裝了上面的 CSIProvisioner
	provisionController = controller.NewProvisionController(
		clientset,
		provisionerName,
		csiProvisioner,
		provisionerOptions...,
	)
	...
	run := func(ctx context.Context) {
		...
        // Run 運行起來
		provisionController.Run(ctx)
	}
}

接著,呼叫 PV 創建/洗掉流程:

PV 創建:runClaimWorker -> syncClaimHandler -> syncClaim -> provisionClaimOperation -> Provision -> CreateVolume
PV 洗掉:runVolumeWorker -> syncVolumeHandler -> syncVolume -> deleteVolumeOperation -> Delete -> DeleteVolume

由 sigs.k8s.io/sig-storage-lib-external-provisioner 抽象了相關介面:

// 通過 vendor 方式引入 sigs.k8s.io/sig-storage-lib-external-provisioner
// external-provisioner/vendor/sigs.k8s.io/sig-storage-lib-external-provisioner/v7/controller/volume.go
type Provisioner interface {
	// 呼叫 PRC CreateVolume 介面實作 PV 創建
	Provision(context.Context, ProvisionOptions) (*v1.PersistentVolume, ProvisioningState, error)
	// 呼叫 PRC DeleteVolume 介面實作 PV 洗掉
	Delete(context.Context, *v1.PersistentVolume) error
}

Controller 調諧

K8s 中與 PV 相關的控制器有 PVController、AttachDetachController,

PVController

PVController 通過在 PVC 添加相關 Annotation(如 pv.kubernetes.io/provisioned-by),由 external-provisioner 組件負責完成對應 PV 的創建/洗掉,然后 PVController 監測到 PV 創建成功的狀態,完成與 PVC 的系結(Bound),調諧(reconcile)任務完成,然后交給 AttachDetachController 控制器進行下一步邏輯處理,

值得一提的是,PVController 內部通過使用 local cache,高效實作了 PVC 與 PV 的狀態更新與系結事件處理,相當于在 K8s informer 機制之外,又自己維護了一個 local store 進行 Add/Update/Delete 事件處理,

首先,通過標準的 newController -> Run() 邏輯:

// kubernetes/pkg/controller/volume/persistentvolume/pv_controller_base.go
func NewController(p ControllerParameters) (*PersistentVolumeController, error) {
	...
	// 初始化 PVController
	controller := &PersistentVolumeController{
		volumes:                       newPersistentVolumeOrderedIndex(),
		claims:                        cache.NewStore(cache.DeletionHandlingMetaNamespaceKeyFunc),
		kubeClient:                    p.KubeClient,
		eventRecorder:                 eventRecorder,
		runningOperations:             goroutinemap.NewGoRoutineMap(true /* exponentialBackOffOnError */),
		cloud:                         p.Cloud,
		enableDynamicProvisioning:     p.EnableDynamicProvisioning,
		clusterName:                   p.ClusterName,
		createProvisionedPVRetryCount: createProvisionedPVRetryCount,
		createProvisionedPVInterval:   createProvisionedPVInterval,
		claimQueue:                    workqueue.NewNamed("claims"),
		volumeQueue:                   workqueue.NewNamed("volumes"),
		resyncPeriod:                  p.SyncPeriod,
		operationTimestamps:           metrics.NewOperationStartTimeCache(),
	}
	...
	// PV 增刪改事件監聽
	p.VolumeInformer.Informer().AddEventHandler(
		cache.ResourceEventHandlerFuncs{
			AddFunc:    func(obj interface{}) { controller.enqueueWork(controller.volumeQueue, obj) },
			UpdateFunc: func(oldObj, newObj interface{}) { controller.enqueueWork(controller.volumeQueue, newObj) },
			DeleteFunc: func(obj interface{}) { controller.enqueueWork(controller.volumeQueue, obj) },
		},
	)
	...
	// PVC 增刪改事件監聽
	p.ClaimInformer.Informer().AddEventHandler(
		cache.ResourceEventHandlerFuncs{
			AddFunc:    func(obj interface{}) { controller.enqueueWork(controller.claimQueue, obj) },
			UpdateFunc: func(oldObj, newObj interface{}) { controller.enqueueWork(controller.claimQueue, newObj) },
			DeleteFunc: func(obj interface{}) { controller.enqueueWork(controller.claimQueue, obj) },
		},
	)
	...
	return controller, nil
}

接著,呼叫 PVC/PV 系結/解綁邏輯:

PVC/PV 系結:claimWorker -> updateClaim -> syncClaim -> syncBoundClaim -> bind
PVC/PV 解綁:volumeWorker -> updateVolume -> syncVolume -> unbindVolume

AttachDetachController

AttachDetachController 將已經系結(Bound) 成功的 PVC/PV,內部經過 InTreeToCSITranslator 轉換器,實作由 in-tree 方式管理的 Volume 向 out-of-tree 方式管理的 CSI 插件模式轉換,

接著,由 CSIPlugin 內部邏輯實作 VolumeAttachment 資源型別的創建/洗掉,調諧(reconcile) 任務完成,然后交給 external-attacher 組件進行下一步邏輯處理,

相關核心代碼在 reconciler.Run() 中實作如下:

// kubernetes/pkg/controller/volume/attachdetach/reconciler/reconciler.go
func (rc *reconciler) reconcile() {

	// 先進行 DetachVolume,確保因 Pod 重新調度到其他節點的 Volume 提前分離(Detach)
	for _, attachedVolume := range rc.actualStateOfWorld.GetAttachedVolumes() {
		// 如果不在期望狀態的 Volume,則呼叫 DetachVolume 洗掉 VolumeAttachment 資源物件
		if !rc.desiredStateOfWorld.VolumeExists(
			attachedVolume.VolumeName, attachedVolume.NodeName) {
			...
			err = rc.attacherDetacher.DetachVolume(attachedVolume.AttachedVolume, verifySafeToDetach, rc.actualStateOfWorld)
			...
		}
	}
	// 呼叫 AttachVolume 創建 VolumeAttachment 資源物件
	rc.attachDesiredVolumes()
	...
}

附著/分離 Volume

K8s 中持久卷 PV 的附著(Attach)與分離(Detach),由 external-attacher 組件實作,相關工程代碼在:【https://github.com/kubernetes-csi/external-attacher】

external-attacher 組件觀察到由上一步 AttachDetachController 創建的 VolumeAttachment 物件,如果其 .spec.Attacher 中的 Driver name 指定的是自己同一 Pod 內的 CSI Plugin,則呼叫 CSI Plugin 的ControllerPublish 介面進行 Volume Attach,

首先,通過標準的 cmd 方式獲取命令列引數,執行 newController -> Run() 邏輯,相關代碼如下:

// external-attacher/cmd/csi-attacher/main.go
func main() {
    ...
    ctrl := controller.NewCSIAttachController(
		clientset,
		csiAttacher,
		handler,
		factory.Storage().V1().VolumeAttachments(),
		factory.Core().V1().PersistentVolumes(),
		workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax),
		workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax),
		supportsListVolumesPublishedNodes,
		*reconcileSync,
	)

	run := func(ctx context.Context) {
		stopCh := ctx.Done()
		factory.Start(stopCh)
		ctrl.Run(int(*workerThreads), stopCh)
	}
    ...
}

接著,呼叫 Volume 附著/分離邏輯:

Volume 附著(Attach):syncVA -> SyncNewOrUpdatedVolumeAttachment -> syncAttach -> csiAttach -> Attach -> ControllerPublishVolume
Volume 分離(Detach):syncVA -> SyncNewOrUpdatedVolumeAttachment -> syncDetach -> csiDetach -> Detach -> ControllerUnpublishVolume

kubelet 掛載/卸載 Volume

K8s 中持久卷 PV 的掛載(Mount)與卸載(Unmount),由 kubelet 組件實作,

kubelet 通過 VolumeManager 啟動 reconcile loop,當觀察到有新的使用 PersistentVolumeSource 為CSI 的 PV 的 Pod 調度到本節點上,于是呼叫 reconcile 函式進行 Attach/Detach/Mount/Unmount 相關邏輯處理,

// kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go
func (rc *reconciler) reconcile() {
	// 先進行 UnmountVolume,確保因 Pod 洗掉被重新 Attach 到其他 Pod 的 Volume 提前卸載(Unmount)
	rc.unmountVolumes()

	// 接著通過判斷 controllerAttachDetachEnabled || PluginIsAttachable 及當前 Volume 狀態
	// 進行 AttachVolume / MountVolume / ExpandInUseVolume
	rc.mountAttachVolumes()

	// 卸載(Unmount) 或分離(Detach) 不再需要(Pod 洗掉)的 Volume
	rc.unmountDetachDevices()
}

相關呼叫邏輯如下:

Volume 掛載(Mount):reconcile -> mountAttachVolumes -> MountVolume -> SetUp -> SetUpAt -> NodePublishVolume
Volume 卸載(Unmount):reconcile -> unmountVolumes -> UnmountVolume -> TearDown -> TearDownAt -> NodeUnpublishVolume

小結

本文通過分析 K8s 中持久卷 PV 的 創建(Create)、附著(Attach)、分離(Detach)、掛載(Mount)、卸載(Unmount)、洗掉(Delete) 等核心生命周期流程,對 CSI 實作機制進行了決議,通過原始碼、圖文方式說明了相關流程邏輯,以期更好的理解 K8s CSI 運行流程,

可以看到,K8s 以 CSI Plugin(out-of-tree) 插件方式開放存盤能力,一方面是為了將 K8s 核心主干代碼與 Volume 相關代碼解耦,便于更好的維護;另一方面在遵從 CSI 規范介面下,便于各大云廠商根據業務需求實作相關的介面,提供個性化的云存盤能力,以期達到云存盤生態圈的開放共贏,

PS: 更多內容請關注 k8s-club

相關資料

  1. CSI 規范
  2. Kubernetes 原始碼
  3. kubernetes-csi 原始碼
  4. kubernetes-sig-storage 原始碼
  5. K8s CSI 概念
  6. K8s CSI 介紹

關于我們

更多關于云原生的案例和知識,可關注同名【騰訊云原生】公眾號~

福利:

   ①公眾號后臺回復【手冊】,可獲得《騰訊云原生路線圖手冊》&《騰訊云原生最佳實踐》~

   ②公眾號后臺回復【系列】,可獲得《15個系列100+篇超實用云原生原創干貨合集》,包含Kubernetes 降本增效、K8s 性能優化實踐、最佳實踐等系列,

【騰訊云原生】云說新品、云研新術、云游新活、云賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!

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

標籤:其他

上一篇:2021測驗開發面試題大全及答案(包含測驗基礎|介面測驗|自動化測驗...),289頁

下一篇:FastAPI 學習之路(五十五)操作Redis

標籤雲
其他(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