k8s常見面試題2

k8s常見面試題2

  • 安全與權限
    • RBAC配置
    • 如何保護 Kubernetes 集群的 API Server?
    • 如何管理集群中的敏感信息(如密碼、密鑰)?
    • 如何限制容器的權限(如使用 SecurityContext)?
    • 如何防止容器逃逸(Container Escape)?
  • 存儲管理
    • PV和 PVC的區別是什么?
    • 如何動態分配存儲資源(StorageClass)?
    • 如何實現跨節點的共享存儲?
  • 網絡與服務發現
    • Service類型
    • 如何實現跨集群的服務發現?
    • 如何配置 Kubernetes 的網絡策略(NetworkPolicy)
    • 如何實現外部流量訪問集群內部服務
  • 架構設計
    • 如何優化 Kubernetes 集群的資源利用率?
    • 如何實現多租戶的 Kubernetes 集群?
    • 如何設計跨地域的 Kubernetes 集群?
    • 高可用集群設計
  • 工具與生態
    • Helm用途
  • 場景題示例
    • 高并發微服務架構
    • 如何實現 Kubernetes 集群的自動化運維?
    • 如何應對 Kubernetes 集群的突發流量?
    • 如何設計一個跨云平臺的 Kubernetes 集群?
  • 開放性問題
    • 遇到的最大挑戰
    • 如何提升 Kubernetes 集群的安全性

安全與權限

RBAC配置

如何實現 Kubernetes 的 RBAC 權限控制?

  • 創建Role定義權限(如訪問Pod、Service)。
  • 創建RoleBinding將Role綁定到用戶/組。
  • 示例:授權用戶讀取Pod信息:
  ```yamlapiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: {namespace: default, name: pod-reader}rules:- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]

如何保護 Kubernetes 集群的 API Server?

  • 保護 API Server 需要啟用 RBAC 限制權限
  • 配置身份認證(如 TLS、OIDC),開啟 API 審計日志,禁用匿名訪問
  • 并結合網絡策略限制 API Server 訪問來源。
kubectl create rolebinding user-binding --clusterrole=view --user=user@example.com --namespace=default  # 啟用 RBAC(基于角色的訪問控制)

啟用 API Server 認證和授權

  • 使用 TLS 證書、OIDC(OpenID Connect)或 ServiceAccount 進行認證。
  • 配置 --authorization-mode=RBAC,Node 確保 API 請求經過權限檢查。

開啟 API Server 審計日志
通過 --audit-policy-file=/etc/kubernetes/audit-policy.yaml 開啟審計

apiVersion: audit.k8s.io/v1
kind: Policy
rules:- level: RequestResponse

限制匿名訪問:禁用 --anonymous-auth,防止未授權請求訪問 API Server。

啟用網絡策略(NetworkPolicy):限制 API Server 只能被特定 IP 或 Pod 訪問。

如何管理集群中的敏感信息(如密碼、密鑰)?

  • 推薦使用 Kubernetes Secret 存儲敏感數據,并啟用加密存儲或外部 KMS 保護 Secret,避免明文存儲。
  • 同時,使用 RBAC 限制 Secret 訪問權限。
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=pass123  #使用 Secret 存儲 Base64 編碼的敏感數據。

使用 envFrom 掛載 Secret

envFrom:- secretRef:name: db-secret

啟用加密存儲(EncryptionConfig)
通過 --encryption-provider-config=/etc/kubernetes/encryption-config.yaml 加密 Secret 數據。

kind: EncryptionConfig
resources:- resources: ["secrets"]providers:- aescbc:keys:- name: key1secret: <base64-encoded-secret>

最小化 Secret 訪問權限:使用 RBAC 限制 Secret 訪問

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: secret-reader
rules:- apiGroups: [""]resources: ["secrets"]verbs: ["get"]

如何限制容器的權限(如使用 SecurityContext)?

  • 使用 securityContext 限制容器權限,例如 runAsNonRoot 禁止 root 運行
  • privileged: false 防止特權模式
  • readOnlyRootFilesystem: true 只讀根文件系統
  • 并最小化 Linux Capabilities。
securityContext:runAsUser: 1000runAsGroup: 3000allowPrivilegeEscalation: false    #運行非 root 用戶privileged: false     #禁止特權模式(Privileged Mode)readOnlyRootFilesystem: true   #使用 readOnlyRootFilesystemcapabilities:    #最小化 Linux Capabilitiesdrop:- ALL  

使用 PodSecurityPolicy(PSP)或 PodSecurity Admission(PSA)
通過 PSP/PSA 統一限制容器權限:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: restricted
spec:privileged: falserunAsUser:rule: MustRunAsNonRoot

如何防止容器逃逸(Container Escape)?

  • 防止容器逃逸需啟用 seccomp 過濾系統調用
  • 禁止 hostPID、hostNetwork 訪問宿主機資源,限制宿主機文件系統掛載
  • 并使用 AppArmor 或 SELinux 進行訪問控制。

存儲管理

PV和 PVC的區別是什么?

  • PV 是管理員預先配置的存儲資源,表示物理存儲資源(如 NFS、Ceph、EBS)。
  • PVC 是用戶對存儲的申請。由 Pod 請求存儲,類似于云計算中的存儲申請
  • 當 PVC 申請滿足 PV 的條件時,Kubernetes 自動綁定 PV 和 PVC,Pod 通過 PVC 訪問存儲。

綁定關系

  • PVC 申請存儲 → K8s 綁定可用 PV → Pod 使用 PVC
  • kubectl get pv / kubectl get pvc 查看綁定狀態。

如何動態分配存儲資源(StorageClass)?

  • StorageClass 允許 Kubernetes 動態創建 PV,無需管理員手動配置。
  • PVC 申請存儲時,StorageClass 通過存儲插件(如 AWS EBS、Ceph)自動創建 PV,并綁定 PVC。
  • StorageClass:動態創建PV(如按需創建云存儲)。

如何實現跨節點的共享存儲?

  • 可以使用 NFS、CephFS、GlusterFS 或 AWS EFS 等分布式存儲系統
  • 并配置 ReadWriteMany (RWX) 模式
  • 使多個 Pod 在不同節點上共享同一個存儲卷。

網絡與服務發現

Service類型

Kubernetes 中的 Service 類型有哪些?各自的使用場景?

  • ClusterIP:默認類型,集群內部訪問。
  • NodePort:通過節點端口暴露服務。
  • LoadBalancer:云平臺提供外部負載均衡器。
  • ExternalName:通過CNAME指向外部服務。

如何實現跨集群的服務發現?

  • 實現跨集群的服務發現可以采用 Kubernetes 聯邦(Federation)或多集群服務 API(MCS API)。
  • 聯邦提供跨集群的統一管理和服務發現能力,而 MCS API 定義了一套輕量級的 API,實現服務的跨集群注冊和發現

使用 Kubernetes 聯邦(Federation):

  • 概念: Kubernetes 聯邦提供了跨多個集群的統一管理和服務發現能力。
  • 實現: 通過在各個集群中部署聯邦控制平面,實現資源的同步和服務的跨集群發現。
  • 優勢: 提供自動配置 DNS 服務以及在所有集群后端上進行負載均衡的能力。

使用多集群服務 API(MCS API):

  • 概念: MCS API 定義了一套輕量級的 API,實現服務的跨集群注冊和發現。
  • 實現: 通過在集群間導出和導入服務,使服務在多個集群間共享。
  • 優勢: 能夠像訪問本地服務一樣訪問其他集群的服務。

如何配置 Kubernetes 的網絡策略(NetworkPolicy)

  • 配置 NetworkPolicy 需要創建一個 YAML 文件,使用 podSelector 選擇目標 Pod,并定義相應的 ingress 和/或 egress 規則。然后,通過 kubectl apply -f 命令將其應用到集群中,以控制 Pod 之間以及與外部的網絡流量。

理解 NetworkPolicy:

  • 概念: NetworkPolicy 是一種資源對象,用于定義 Pod 之間以及 Pod 與外部之間的網絡流量控制規則。
  • 作用: 通過指定規則,控制哪些流量可以進出特定的 Pod,從而提高集群的安全性。

配置步驟:

  • 定義策略: 創建 NetworkPolicy YAML 文件,指定 podSelector 選擇目標 Pod,配置 ingress 和/或 egress 規則。
  • 應用策略: 使用 kubectl apply -f 命令將策略應用到集群中。

如何實現外部流量訪問集群內部服務

  • 要使外部流量訪問集群內部服務,可以使用 Service 的 NodePort 類型,將服務暴露在每個節點的特定端口上;
  • 在支持的云環境中,使用 LoadBalancer 類型,自動配置云提供商的負載均衡器;
  • 或者使用 Ingress 資源,定義 HTTP/HTTPS 路由規則,通過域名和路徑將外部流量引導到內部服務。

架構設計

如何優化 Kubernetes 集群的資源利用率?

通過合理設置容器的資源請求和限制,結合自動水平擴縮容(HPA)和節點自動伸縮機制,并使用監控工具實時分析資源使用情況,可以有效優化 Kubernetes 集群的資源利用率

  • 合理設置資源請求和限制:為每個容器配置適當的 requests 和 limits,確保資源分配精確,避免資源浪費或爭搶。
  • 使用自動水平擴縮容(HPA):根據應用負載,自動調整 Pod 數量,確保在高負載時擴展,低負載時收縮。
  • 節點自動伸縮:配置集群的節點自動伸縮,根據整體資源需求動態添加或移除節點。
  • 監控和分析:利用監控工具(如 Prometheus 和 Grafana)實時監測資源使用情況,識別瓶頸并進行優化。

如何實現多租戶的 Kubernetes 集群?

可以通過為每個租戶創建獨立的命名空間,結合 RBAC 和網絡策略實現資源和網絡隔離。對于需要更強隔離的場景,可采用虛擬控制平面方案。此外,設置資源配額確保各租戶公平使用資源。

  • 命名空間隔離:為每個租戶創建獨立的命名空間,結合 RBAC(基于角色的訪問控制)和網絡策略,確保資源和網絡的隔離。
  • 虛擬控制平面:為每個租戶提供獨立的虛擬控制平面,實現更強的隔離和自主性。
  • 資源配額:為不同租戶設置資源配額,確保資源的公平分配,防止單個租戶過度消耗資源。

如何設計跨地域的 Kubernetes 集群?

通過在不同地域部署多個 Kubernetes 集群,結合服務網格或全球負載均衡器實現服務發現和流量管理,采用數據同步機制確保數據一致性,并使用多集群管理工具實現統一管理。

  • 多集群部署:在不同地域部署多個 Kubernetes 集群,確保本地化的高可用性和低延遲。
  • 服務發現和流量管理:使用服務網格(如 Istio)或全球負載均衡器,實現跨集群的服務發現和流量路由。
  • 數據同步:采用數據庫的主從復制或數據同步機制,確保各地域間的數據一致性。
  • 統一管理:使用 Kubernetes 聯邦(Federation)或多集群管理工具,實現跨集群的統一管理和配置。

高可用集群設計

如何設計高可用的 Kubernetes 集群?

  • 多Master節點,使用負載均衡(如HAProxy)暴露API Server。
  • etcd集群部署為奇數節點(3/5個),跨故障域分布。
  • Worker節點跨可用區(AZ)部署。

工具與生態

你使用過哪些 Kubernetes 相關的工具(如 Helm、Prometheus、Istio 等)?

Helm用途

  • Helm 是 Kubernetes 的包管理工具,通過定義 Chart 來描述應用的 Kubernetes 資源,提供應用的打包、安裝、升級和回滾等功能,簡化了應用的部署和管理。

常用命令:

helm install <release-name> <chart-name>  # 部署應用
helm upgrade --install                     # 更新或安裝
helm rollback <release-name> <revision>    # 回滾

場景題示例

高并發微服務架構

如何設計一個支持高并發、高可用的微服務架構?

  • 使用DeploymentHPA自動擴縮容。
  • 通過**Service Mesh(如Istio)**管理流量(金絲雀發布、熔斷)。
  • 數據庫使用StatefulSet,搭配持久化存儲。

如何實現 Kubernetes 集群的自動化運維?

通過使用基礎設施即代碼工具實現集群的自動化部署,采用 GitOps 工作流管理配置變更,利用 Operator 模式自動化應用運維,并結合監控與告警系統,全面實現 Kubernetes 集群的自動化運維。

  • 基礎設施即代碼(Infrastructure as Code,IaC):使用工具如 Terraform 或 Ansible 編寫集群和相關資源的配置腳本,實現集群的自動化部署和管理。
  • GitOps 工作流:采用 GitOps 方法,將集群的聲明性配置存儲在版本控制系統中,通過持續集成/持續部署(CI/CD)管道自動應用配置更改。
  • Operator 模式:開發或使用現有的 Kubernetes Operator,自動管理復雜的應用程序和服務的生命周期,包括部署、升級和故障恢復。
  • 監控與告警:集成 Prometheus 和 Grafana 等監控工具,實時監測集群狀態,并設置告警規則,及時響應異常情況。

如何應對 Kubernetes 集群的突發流量?

通過配置水平 Pod 自動伸縮和集群自動伸縮,結合彈性負載均衡策略,以及在應用層面實施緩存和限流機制,可以有效應對 Kubernetes 集群的突發流量。

  • 水平 Pod 自動伸縮(Horizontal Pod Autoscaler,HPA):根據指標(如 CPU 使用率)自動調整 Pod 的副本數量,以應對負載變化。
  • 集群自動伸縮(Cluster Autoscaler):當集群資源不足以調度新的 Pod 時,自動增加節點;當資源空閑時,自動移除多余的節點。
  • 彈性負載均衡:配置服務的負載均衡策略,確保流量均勻分布,防止單點過載。
  • 緩存和限流:在應用層面實現緩存機制,減少對后端服務的壓力;設置限流策略,防止突發流量導致系統過載。

如何設計一個跨云平臺的 Kubernetes 集群?

在不同云平臺上部署獨立的 Kubernetes 集群,使用多集群管理工具進行統一管理,通過網絡互通方案確保服務通信,配置統一的認證與授權機制,并通過 CI/CD 管道實現應用分發和數據同步,從而設計一個跨云平臺的 Kubernetes 集群。

  • 多集群管理:在不同云平臺上部署獨立的 Kubernetes 集群,使用工具如 Rancher、KubeSphere 或 Kubernetes 聯邦(Federation)進行統一管理。
  • 網絡互通:通過 VPN、專線或服務網格(如 Istio)實現不同云平臺之間的網絡連接,確保服務之間的通信。
  • 統一認證與授權:配置統一的身份認證和權限管理機制,確保跨集群的一致性和安全性。
  • 應用分發與數據同步:使用 CI/CD 管道實現應用的跨集群部署,采用數據庫同步或數據復制策略,確保數據一致性。

開放性問題

遇到的最大挑戰

你在 Kubernetes 運維中遇到的最大挑戰是什么?如何解決的?

  • 示例回答
  • 挑戰:集群網絡頻繁超時。
  • 排查:發現是CNI插件配置錯誤導致DNS解析失敗。
  • 解決:修正Calico配置,并優化CoreDNS副本數。

如何提升 Kubernetes 集群的安全性

  • 身份認證和權限管理:通過啟用 RBAC、結合 Open Policy Agent(OPA)等工具,精細化控制用戶和服務賬號的權限。
  • 安全審計與日志記錄:開啟 API 審計日志,及時發現異常操作和訪問行為。
  • 網絡策略與隔離:使用 NetworkPolicy 限制 Pod 間通信,減少攻擊面。
  • 加密與密鑰管理:對存儲在集群中的敏感數據(如 Secrets)進行加密,同時使用外部密鑰管理系統(KMS)。
  • 容器運行時安全:采用 Seccomp、AppArmor 或 SELinux 等安全機制,限制容器權限,防止容器逃逸。
  • 定期安全掃描與漏洞修補:利用安全掃描工具定期檢查鏡像、依賴和集群配置,及時更新補丁。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/69258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/69258.shtml
英文地址,請注明出處:http://en.pswp.cn/web/69258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flutter安卓打包簽名

flutter安卓打包簽名 1.創建簽名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一個用于管理密鑰和證書的命令行工具&#xff0c;通常與 Java 開發工具包 (JDK) 一起使用。my-release-…

React - jsx 語法

在 React 中&#xff0c;JSX&#xff08;JavaScript XML&#xff09;是一種語法擴展&#xff0c;它允許開發者在 JavaScript 代碼中使用類似 HTML 的語法。JSX 提升了代碼的可讀性和可維護性&#xff0c;使得編寫和構建用戶界面更加直觀。它被廣泛應用于 React 組件的定義。 一…

intra-mart實現簡易登錄頁面筆記

一、前言 最近在學習intra-mart框架&#xff0c;在此總結下筆記。 intra-mart是一個前后端不分離的框架&#xff0c;開發時主要用的就是xml、html、js這幾個文件&#xff1b; xml文件當做配置文件&#xff0c;html當做前端頁面文件&#xff0c;js當做后端文件&#xff08;js里…

Linux+Docer 容器化部署之 Shell 語法入門篇 【Shell 替代】

&#x1f380;&#x1f380;Shell語法入門篇 系列篇 &#x1f380;&#x1f380; LinuxDocer 容器化部署之 Shell 語法入門篇 【準備階段】LinuxDocer 容器化部署之 Shell 語法入門篇 【Shell變量】LinuxDocer 容器化部署之 Shell 語法入門篇 【Shell數組與函數】LinuxDocer 容…

Intellij IDEA如何查看當前文件的類

快捷鍵&#xff1a;CtrlF12&#xff0c;我個人感覺記快捷鍵很麻煩&#xff0c;知道具體的位置更簡單&#xff0c;如果忘了快捷鍵&#xff08;KeyMap&#xff09;看一下就記起來了&#xff0c;不需要再Google or Baidu or GPT啥的&#xff0c;位置&#xff1a;Navigate > Fi…

C++----繼承

一、繼承的基本概念 本質&#xff1a;代碼復用類關系建模&#xff08;是多態的基礎&#xff09; class Person { /*...*/ }; class Student : public Person { /*...*/ }; // public繼承 派生類繼承基類成員&#xff08;數據方法&#xff09;&#xff0c;可以通過監視窗口檢…

已驗證正常,Java輸入字符串生成PDF文件

Java輸入字符串生成PDF文件過程&#xff1a; 在Java開發中&#xff0c;如何將字符串轉換為 PDF 是一個常見的需求。網上找了很多例子都無法生成&#xff0c;經過多次嘗試&#xff0c;終于實現了&#xff0c;特此記錄一下。 1、引入pom.xml 添加所需的依賴 <dependency>&…

Mac M1 Comfyui 使用MMAudio遇到的問題解決?

問題1: AssertionError: Torch not compiled with CUDA enabled&#xff1f; 解決辦法&#xff1a;修改代碼以 CPU 運行 第一步&#xff1a;找到 /ComfyUI/custom_nodes/ComfyUI-MMAudio/mmaudio/ext/autoencoder/vae.py文件中的下面這兩行代碼 self.data_mean nn.Buffer(t…

從 .NET Framework 升級到 .NET 8 后 SignalR 問題處理與解決方案

隨著 .NET Framework 向 .NET 8 的遷移&#xff0c;許多開發者在使用 SignalR 時遇到了一些前后端連接、配置、調用等方面的問題。尤其是在處理 SignalR 實時通信功能時&#xff0c;升級后的一些兼容性問題可能導致應用程序無法正常工作。本文將介紹在從 .NET Framework 升級到…

2025.2.5——五、[網鼎杯 2020 青龍組]AreUSerialz 代碼審計|反序列化

題目來源&#xff1a;BUUCTF [網鼎杯 2020 青龍組]AreUSerialz 目錄 一、打開靶機&#xff0c;整理信息 二、解題思路 step 1&#xff1a;代碼審計 step 2&#xff1a;開始解題 突破protected訪問修飾符限制 三、小結 一、打開靶機&#xff0c;整理信息 直接得到一串ph…

Docker深度解析:安裝各大環境

安裝 Nginx 實現負載均衡&#xff1a; 掛載 nginx html 文件&#xff1a; 創建過載目錄&#xff1a; mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意&#xff1a;在掛載前需要對 conf/nginx.conf 文件進行編寫 worker_processes 1;events {worker_connections 1024; …

docker啟動報錯code=exited, status=1/FAILURE——問題排查

問題 在某臺centos7機器上&#xff0c;啟動docker服務 sudo systemctl start docker報下列錯誤&#xff1a; ● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: …

基于SpringBoot養老院平臺系統功能實現五

一、前言介紹&#xff1a; 1.1 項目摘要 隨著全球人口老齡化的不斷加劇&#xff0c;養老服務需求日益增長。特別是在中國&#xff0c;隨著經濟的快速發展和人民生活水平的提高&#xff0c;老年人口數量不斷增加&#xff0c;對養老服務的質量和效率提出了更高的要求。傳統的養…

PostGIS:使用shp2pgsql、pgsql2shp、OGR2OGR函數進行數據導入、導出

數據導入與導出函數 數據庫數據導入與導出可以通過多個函數完成&#xff0c;QGIS文檔介紹了3個函數&#xff1a; shp2pgsql、pgsql2shp、OGR2OGR&#xff0c;分別用于shp導入數據庫、數據庫文件導出為shp、數據轉換為多種數據格式。 &#xff08;1&#xff09;shp2pgsql 在l…

【AIGC魔童】DeepSeek v3推理部署:vLLM/SGLang/LMDeploy

【AIGC魔童】DeepSeek v3推理部署&#xff1a;vLLM/SGLang/LMDeploy &#xff08;1&#xff09;使用vLLM推理部署DeepSeek&#xff08;2&#xff09;使用SGLang推理部署DeepSeek&#xff08;3&#xff09;使用LMDeploy推理部署DeepSeek &#xff08;1&#xff09;使用vLLM推理部…

《AI “造臉術”:生成對抗網絡打造超真實虛擬人臉》

在科技飛速發展的當下&#xff0c;人工智能的浪潮席卷而來&#xff0c;其中生成對抗網絡&#xff08;GANs&#xff09;技術以其獨特的魅力&#xff0c;成為了生成高度真實感虛擬人臉的強大引擎。無論是影視制作中虛擬角色的塑造&#xff0c;還是游戲領域中多樣化角色形象的構建…

C語言的靈魂——指針(2)

前言&#xff1a;上期我們介紹了如何理解地址&#xff0c;內存&#xff0c;以及指針的一些基礎知識和運算&#xff1b;這期我們來介紹一下const修飾指針&#xff0c;野指針&#xff0c;assert斷言&#xff0c;指針的傳址調用。 上一篇指針&#xff08;1&#xff09; 文章目錄 一…

Android studio 創建aar包給Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么區別 aar 和 jar包 都是壓縮包&#xff0c;可以使用壓縮軟件打開 jar包 用于封裝 Java 類及其相關資源 aar 文件是專門為 Android 平臺設計的 &#xff0c;可以包含Android的專有內容&#xff0c;比如AndroidManifest.xml 文件 &#…

ASP.NET Core中Filter與Middleware的區別

中間件是ASP.NET Core這個基礎提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中間件提供的框架&#xff0c;而Filter屬于MVC中間件提供的功能。 區別 中間件可以處理所有的請求&#xff0c;而Filter只能處理對控制器的請求&#x…

基礎篇05-圖像直方圖操作

本節將簡要介紹Halcon中有關圖像直方圖操作的算子&#xff0c;重點介紹直方圖獲取和顯示兩類算子&#xff0c;以及直方圖均衡化處理算子。 目錄 1. 引言 2. 獲取并顯示直方圖 2.1 獲取&#xff08;灰度&#xff09;直方圖 (1) gray_histo算子 (2) gray_histo_abs算子 (3…