主頁 >  其他 > 超長可視化指南!帶你理清K8S部署的故障排查思路,讓bug無處遁形

超長可視化指南!帶你理清K8S部署的故障排查思路,讓bug無處遁形

2020-09-15 03:01:15 其他

本文將幫助你厘清在Kubernetes中除錯 deployment的思路,下圖是完整的故障排查思路,如果你想獲得更清晰的圖片,請在公眾號后臺(RancherLabs)回復“troubleshooting”,

當你希望在Kubernetes中部署一個應用程式,你通常需要定義三個組件:

  • Deployment——這是創建名為Pods的應用程式副本的方法

  • Serivce——內部負載均衡器,將流量路由到Pods

  • Ingress——可以描述流量如何從集群外部流向Service

接下來,我們通過圖片快速回顧一下,

在Kubernetes中,你的應用程式通過兩層負載均衡器暴露:內部和外部,

內部負載均衡器稱為Service,而外部負載均衡器則稱為Ingress,

Pod未直接部署,因此,Deployment創建Pod并監視它們,

假設你想部署一個簡單的Hello World應用程式,那么對于此類應用程式,其YAML檔案與以下類似:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    track: canary
spec:
  selector:
    matchLabels:
      any-name: my-app
  template:
    metadata:
      labels:
        any-name: my-app
    spec:
      containers:
      - name: cont1
        image: learnk8s/app:1.0.0
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    name: app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
    paths:
    - backend:
        serviceName: app
        servicePort: 80
      path: /

這個定義很長,容易忽略組件之間的相互關系,

例如:

  • 你什么時候應該使用80埠,什么時候使用埠8080?

  • 你是否應該為每個服務創建一個新埠,以免它們沖突?

  • 標簽(label)名稱重要嗎?是否應該每一處都一樣?

在進行debug之前,我們先來回顧一下這三個組件之間的關系如何,

首先,我們從Deployment和Service開始,

連接Deployment和Service

實際上,Deployment和Service根本沒有連接,相反,該Service直接指向Pod,并完全跳過Deployment,所以,你應該關注的是Pod和Service是如何與彼此關聯的,你應該記住三件事:

  1. Service selector至少與Pod的一個標簽匹配

  2. Serivce targetPort應該與Pod內的容器的containerPort相匹配

  3. Serviceport可以是任何數字,多個Service可以使用同一個埠,因為它們已經被分配了不同的IP地址

以下圖片總結了如何連接埠:

考慮由Service暴露的pod

當你創建一個pod,你應該在你的Pod中為每個容器定義埠containerPort

當你創建一個Service時,你能夠定義一個port和一個targetPort,但你應該將哪一個連接到容器呢?

targetPortcontainerPort應該能夠匹配

如果你的容器暴露埠3000,那么targetPort應該與該數字相匹配,

如果你查看了YAML,標簽與portstargerPort應該匹配:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    track: canary
spec:
  selector:
    matchLabels:
      any-name: my-app
  template:
    metadata:
      labels:
        any-name: my-app
    spec:
      containers:
      - name: cont1
        image: learnk8s/app:1.0.0
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    any-name: my-app

那么在Deployment頂部的track: canary標簽呢?也應該匹配嗎?

那個標簽屬于deployment,并且Service selector不使用它來路由流量,換言之,你可以安全地將其移除或者給它分配不同的值,

那么matchLabelsselector呢?它需要與Pod標簽匹配并且Deployment使用它來跟蹤Pod,

假設你做了一個正確的更改,你應該如何測驗它呢?你可以使用以下命令檢查Pod是否擁有正確的標簽:

kubectl get pods --show-labels

或者如果你有屬于多個應用程式的Pod:

kubectl get pods --selector any-name=my-app --show-labels

其中any-name=my-app是標簽any-name: my-app,依舊存在問題?你也可以連接到Pod,你可以在kubectl中使用命令port-forward連接到Serivce并測驗連接,

kubectl port-forward service/<service name> 3000:80

其中:

  • service/<service name>是serivce的名稱——在當前YAML中,是“my-service”,

  • 3000是你希望在你的電腦上打開的埠

  • 80是Service在port欄位中暴露的埠

如果你能夠連接,那么設定就是正確的,如果你無法連接,你很有可能弄錯了標簽或者埠未匹配,

連接Service和Ingress

暴露應用程式的下一步是配置Ingress,Ingress必須知道如何檢索Service,然后檢索Pod并將流量路由到它們,Ingress通過名稱和暴露的埠來檢索正確的Service,

在Ingress和Service中應該匹配兩件事:

  1. Ingress的servicePort應該與Service的port匹配

  2. Ingress的serviceName應該與Service的name相匹配

以下圖片將總結如何連接埠:

你已經知道該服務暴露了一個埠

Ingress有一個名為servicePort的欄位,

Serviceport和IngressservicePort應該相匹配

如果你決定分配埠80給該service,你應該同時更改servicePort為80

實際操作中,你需要查看這些命令列:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    any-name: my-app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
    paths:
    - backend:
        serviceName: my-service
        servicePort: 80
      path: /

你應該如何測驗Ingress是否正常運行呢?你可以使用和之前相同的策略,即kubectl port-forward,但不是連接到service,而是連接到Ingress controller,

首先,使用以下命令為Ingress controller檢索Pod名稱:

kubectl get pods --all-namespaces
NAMESPACE   NAME                              READY STATUS
kube-system coredns-5644d7b6d9-jn7cq          1/1   Running
kube-system etcd-minikube                     1/1   Running
kube-system kube-apiserver-minikube           1/1   Running
kube-system kube-controller-manager-minikube  1/1   Running
kube-system kube-proxy-zvf2h                  1/1   Running
kube-system kube-scheduler-minikube           1/1   Running
kube-system nginx-ingress-controller-6fc5bcc  1/1   Running

驗證Ingress Pod(可能在不同的命名空間)并且描述它以檢索埠:

kubectl describe pod nginx-ingress-controller-6fc5bcc \
 --namespace kube-system \
 | grep Ports
Ports:         80/TCP, 443/TCP, 18080/TCP

最后,連接到Pod:

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

此時,每次你在你的電腦上訪問埠3000,請求就會被轉發到在Ingress controller Pod上的埠80,

如果你訪問 http://localhost:3000 ,你應該能找到提供網頁的應用程式,

簡單回顧一下

現在,我們來快速回顧一下什么埠和標簽需要匹配:

  1. Service selector應該匹配Pod的標簽

  2. ServicetargerPort應該匹配在Pod內容器的containerPort

  3. Service 埠可以是任意數字,多個Service可以使用同個埠,因為它們已經分配了不同的IP地址

  4. Ingress的servicePort應該匹配在Service中的port

  5. Service的名稱應該匹配在Ingress中的serviceName的欄位

了解如何構造YAML只是開始,那么,出了問題時會有什么表現?Pod可能無法啟動,或者直接崩潰,

3步排查K8S Deployment故障

在我們深入研究有故障的deployment之前,必須有一個明確定義的模型,以了解Kubernetes的作業方式,

既然在每個deployment中都有那三個組件,你應該從底層開始按順序除錯它們,

  1. 你應該確保你的Pod正在運行

  2. 著重關注使Service將流量路由到Pod

  3. 檢查Ingress是否正確配置

你應該從底層開始排查Deployment故障,首先,檢查Pod是否準備就緒并且正在運行

如果Pod已經準備就緒,你需要檢查Service是否可以將流量分配到Pod,

最后你應該檢查Service和Ingress之間的連接,

1、 故障排查Pod

在大多數情況下,問題出現在Pod本身,所以你應該確保Pod正在運行并準備就緒,應該如何檢查呢?

kubectl get pods
NAME                    READY STATUS            RESTARTS  AGE
app1                    0/1   ImagePullBackOff  0         47h
app2                    0/1   Error             0         47h
app3-76f9fcd46b-xbv4k   1/1   Running           1         47h

以上部分,只有最后一個Pod是正在運行并且準備就緒的,而前兩個Pod既沒有Running也沒有Ready,那么,你應該如何定位是什么出了問題呢?

這里有4個十分有用的命令可以幫助你排查Pod的故障:

  • kubectl logs <pod name>能夠幫助檢索Pod的容器日志

  • kubectl describe pod <pod name>能夠有效地檢索與Pod相關的事件串列

  • kubectl get pod <pod name>對于提取存盤在Kubernetes中的Pod的YAML定義十分有用

  • kubectl exec -ti <pod name> bash可以用于在Pod其中一個容器中運行一個互動式命令

你應該使用哪一個呢?實際上,沒有一種命令是萬能的,你可以根據實際情況結合使用,

常見的Pod錯誤

Pod可能會出現啟動和運行時的錯誤,

啟動錯誤包括:

  • ImagePullBackoff

  • ImageInspectError

  • ErrImagePull

  • ErrImageNeverPull

  • RegistryUnavailable

  • InvalidImageName

運行時錯誤包括:

  • CrashLoopBackOff

  • RunContainerError

  • KillContainerError

  • VerifyNonRootError

  • RunInitContainerError

  • CreatePodSandboxError

  • ConfigPodSandboxError

  • KillPodSandboxError

  • SetupNetworkError

  • TeardownNetworkError

這些錯誤中,有些比其他錯誤更為常見,以下是最常見的錯誤以及如何修復它們:

ImagePullBackOff

當Kubernetes無法檢索Pod其中之一的容器鏡像時,將出現此錯誤,

有三種常見原因:

  • 鏡像名稱無效——例如,你錯誤拼寫名稱或鏡像不存在

  • 你給這一鏡像指定了一個不存在的tag

  • 你所檢索的鏡像是私有倉庫的,并且Kubernetes沒有訪問它的憑據

前兩個原因可以通過更正鏡像名稱和tag解決,最后一個,你需要將憑據添加到“Secret”中的私有鏡像倉庫中,并在Pod中參考它,

官方檔案可以讓你更加清楚:

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

CrashLoopBackOff

如果容器無法啟動,Kubernetes狀態將顯示CrashLoopBackOff訊息,

通常情況下,容器在以下場景中無法啟動:

  • 應用程式中存在錯誤,導致無法啟動

  • 你錯誤配置了容器

    https://stackoverflow.com/questions/41604499/my-kubernetes-pods-keep-crashing-with-crashloopbackoff-but-i-cant-find-any-lo

  • Liveness探針失敗次數太多

你應該嘗試并檢索該容器的日志以確定出現故障的原因,

如果由于你的容器重啟過快而無法查看日志,你可以使用以下命令:

kubectl logs <pod-name> --previous

它將從之前的容器中列印錯誤資訊,

RunContainerError

容器不能啟動時出現錯誤,甚至在容器內的應用程式啟動之前就無法啟動,

這個問題通常由于錯誤配置導致的,如:

  • 安裝一個不存在的volume,如ConfigMap或Secret

  • 將只讀volume安裝為可讀寫

你應該使用kubectl describe pod <pod-name>來收集和分析錯誤,

Pod處于Pending狀態

當你創建一個Pod時,Pod保持在Pending狀態,這是為什么呢?假設你的調度組件運行了解,那么有以下幾個原因:

  • 集群沒有足夠的資源來運行Pod,如CPU和記憶體

  • 當前命名空間有一個ResourceQuota物件并且所創建的Pod會使該命名空間超過資源額度

  • Pod與一個Pending狀態的PersistentVolumeClaim系結,

那么,最好的選擇是使用命令kubectl describe檢查事件:

kubectl describe pod <pod name>

對于由于ResourceQuotas造成的錯誤,可以使用以下方法檢查集群的日志:

kubectl get events --sort-by=.metadata.creationTimestamp

Pod不處于Ready狀態

如果Pod正在運行但是不Ready,這意味著Readiness探針出現故障,當Readiness探針出現故障時,Pod無法附加到Service上,并且流量無法轉發到實體上,

Readiness探針故障是特定于應用程式的錯誤,因此使用kubectl describe來檢查事件部分,以驗證錯誤,

2、 排查Service故障

如果你的Pod正在運行并且準備就緒,但是你依舊無法接收來自應用程式的回應,你應該檢查Service是否配置正確,

Service旨在根據pod的標簽將流量路由到Pod,所以第一件事,你需要檢查Service target多少個Pod,可以通過檢查Service中的Endpoint來完成此步驟:

kubectl describe service  <service-name>  |  grep Endpoints

一個endpoint是一對```,并且當Service(至少)target一個pod時,至少有一對,

如果“Endpoint”部分是空的,那么有兩種解釋:

  1. 任何正在運行的Pod沒有正確的label(提示:你需要檢查以下你是否在正確的命名空間內)

  2. 在Service的selector標簽中有錯別字

如果你看到了endpoint串列,但依舊無法訪問你的應用程式,那么你的Service中的targetPort可能是罪魁禍首,

你應該怎么測驗Service?無論Service型別是什么,都可以使用kubectl port-forward連接到它:

kubectl port-forward service/<service-name> 3000:80

其中:

  • ```是Service的名稱

  • 3000是你想要在電腦上打開的埠

  • 80是由Service暴露的埠

3、 排查Ingress故障

如果你走到了這個部分,這意味著:

  • Pod正在運行并且準備就緒

  • Service可以分發流量給Pod

但你依舊無法接收app的回應,那么這很有可能是Ingress配置出現錯誤,

由于使用的Ingress controller是集群中的第三方組件,那么根據Ingress controller的型別會由不同的除錯技術,但是在深入研究Ingress特定的工具之前,你可以使用一些簡單的方法檢查,

Ingress使用serviceNameservicePort連接Service,你應該檢查那些是否正確配置,你可以使用以下命令檢查Ingress是否正確配置:

kubectl describe ingress <ingress-name>

如果Backend列是空的,那么配置中肯定存在錯誤,

如果你能在Backend列中看到endpoint,但依舊無法訪問應用程式,那么可能是以下問題:

  • 你將Ingress暴露于公網的方式

  • 你將集群暴露于公網的方式

你可以通過直接連接到Ingress Pod將基礎設施問題與Ingress隔離開來,

首先,為你的Ingress Controller檢索Pod(可能位于不同的命名空間中):

kubectl get pods --all-namespaces
NAMESPACE   NAME                              READY STATUS
kube-system coredns-5644d7b6d9-jn7cq          1/1   Running
kube-system etcd-minikube                     1/1   Running
kube-system kube-apiserver-minikube           1/1   Running
kube-system kube-controller-manager-minikube  1/1   Running
kube-system kube-proxy-zvf2h                  1/1   Running
kube-system kube-scheduler-minikube           1/1   Running
kube-system nginx-ingress-controller-6fc5bcc  1/1   Running

描述它以檢索埠:

kubectl describe pod nginx-ingress-controller-6fc5bcc
 --namespace kube-system \
 | grep Ports

最后,連接到Pod:

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

此時,每次你在電腦上訪問埠3000,請求將會轉發到Pod上的埠80,

那么,現在能夠正常運行了嗎?

如果正常作業,問題就出在基礎設施,你應該檢查流量如何路由到你的集群,

如果無法正常作業,問題就在Ingress controller,你應該除錯Ingress,

如果仍然無法使Ingress controller正常作業,則應該開始對其進行除錯,市場有許多不同版本的Ingress controller,比較流行的包括Nginx、HAProxy、Traefik等,

你應該查閱Ingress controller的檔案以查找故障排查指南,

既然Ingress Nginx是最流行的Ingress controller,那么在下一個部分我們將介紹一些相關的技巧,

除錯Ingress Nginx

Ingress-nginx有kubectl的官方插件,你可以訪問以下網址查看:

https://kubernetes.github.io/ingress-nginx/kubectl-plugin/

你可以使用kubectl ingress-nginx來進行以下操作:

  • 檢查日志、Backend、證書等

  • 連接到Ingress

  • 檢查當前的配置

你還可以嘗試以下三個命令:

  • kubectl ingress-nginx lint這是用來檢查nginx.conf

  • kubectl ingress-nginx backend來檢查Backend(與kubectl describe ingress <ingress-name>類似)

  • kubectl ingress-nginx logs來檢查日志

請注意,你需要使用--namespace <name>來指定正確的命名空間,

總 結

如果你毫無頭緒,那么在Kubernetes中進行故障排除可能是一項艱巨的任務,

你應該永遠記住以從下至上的順序解決問題:現檢查Pod,然后向上移動堆疊至Service和Ingress,

而本文中的debug技術在其他地方也是通用的,例如:

  • 出現故障的Jobs和CronJobs

  • StatefulSets和DaemonSets

希望大家都沒有bug!

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

標籤:其他

上一篇:實體演示:如何在Kubernetes上大規模運行CI/CD

下一篇:Kubernetes(十四) CI/CD(2)

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