久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Kubeless 函數部署遇到了問題怎么辦

200次閱讀
沒有評論

共計 6407 個字符,預計需要花費 17 分鐘才能閱讀完成。

這期內容當中丸趣 TV 小編將會給大家帶來有關 Kubeless 函數部署遇到了問題怎么辦,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

那么 在 Kubeless 中如何對函數進行 Debug 呢?下面將介紹在函數部署過程函數中可能的錯誤以及如何 Debug 來定位問題并解決問題。

環境說明

操作系統:macOS

Kubernetes 版本:v1.15.5

Kubeless 版本:v1.0.7

了解函數部署過程

部署出錯的原因可能有很多。要想學習如何成功調試函數,最重要的是要了解部署 Kubeless 函數的過程。

在本文中,我們假設你使用 kubeless CLI 工具部署函數。這種情況下,函數的部署過程如下:

kubeless CLI 讀取你給它的參數,并產生一個函數對象,將它提交給 Kubernetes API 服務器。

Kubeless 函數控制器檢測到一個新的 Function 被創建并讀取其內容。它從函數中生成這些:一個 ConfigMap 附帶函數代碼和依賴項,一個 Service 以便可以通過 HTTP 訪問該函數,一個附帶基礎鏡像的 Deployment,以及安裝和運行函數的所有必須步驟。知道這個順序非常重要,因為如果控制器無法創建 ConfigMap 或 Service,那么將永遠不會創建 Deployment。任何步驟失敗都會終止該過程。

一旦 Deployment 創建了一個你函數生成的 Pod,Pod 啟動的時候會動態讀取函數內容(在解析型語言的情況下)。

完成上述所有操作后,你就可以調用函數了。讓我們看看一些常見的錯誤以及如何解決它們。

kubeless function deploy 失敗

可能出現的第一個錯誤是我們賦予 kubeless function deploy 命令的參數錯誤。這些錯誤很容易 debug:

$ kubeless function deploy --runtime python2 --from-file test.py --handler test.hello hello
FATA[0000] Invalid runtime: python2. Supported runtimes are: ballerina0.981.0, dotnetcore2.0, dotnetcore2.1, dotnetcore2.2, dotnetcore3.1, go1.13, go1.14, java1.8, java11, nodejs6, nodejs8, nodejs10, nodejs12, php7.2, php7.3, python2.7, python3.4, python3.6, python3.7, ruby2.3, ruby2.4, ruby2.5, ruby2.6, jvm1.8, nodejs_distroless8, nodejsCE8, vertx1.8

從上面的報錯日志中我們可以看出 runtime 參數不對,應該將 python2 改為 python2.7。

kubeless function ls 返回 MISSING: Check controller logs”
在某些情況下,在 CLI 中進行的驗證不足以發現給定參數中的問題。如果是這種情況,該函數 Deployment 將永遠不會出現。要 debug 此類問題,必須檢查控制器日志中的錯誤是什么。要檢索這些日志,請執行:

$ kubeless function deploy hello --runtime python2.7 --from-file test.py --handler test,hello
INFO[0000] Deploying function... 
INFO[0000] Function hello submitted for deployment 
INFO[0000] Check the deployment status executing  kubeless function ls hello 
donghuideMBP:kubeless_demo donghui$ kubeless function ls hello
NAME NAMESPACE HANDLER RUNTIME DEPENDENCIES STATUS 
hello default test,hello python2.7 MISSING: Check controller logs
$ kubectl logs -n kubeless -l kubeless=controller
Error from server (BadRequest): a container name must be specified for pod kubeless-controller-manager-cd68f56c4-cjbnz, choose one of: [kubeless-function-controller http-trigger-controller cronjob-trigger-controller]
$ kubectl logs -n kubeless -l kubeless=controller -c kubeless-function-controller
time= 2020-10-01T01:38:42Z  level=info msg= Processing change to Function default/hello  pkg=function-controller
time= 2020-10-01T01:38:42Z  level=error msg= Function can not be created/updated: failed: incorrect handler format. It should be module_name.handler_name  pkg=function-controller

從日志中我們可以看到 handler 參數存在問題:我們應該將 test,hello 修改為 test.hello。

函數 pod crash

最常見的錯誤是發現 Deployment 成功生成了,但函數仍保持狀態 0/1 Not ready。這通常是由函數或我們指定的依賴項中的語法錯誤引起的。

如果我們的函數沒有啟動,我們應該檢查 pod 的狀態,命令如下:

$ kubectl get pods -l function=hello

函數 pod crash 之  
Init:CrashLoopBackOff

如果我們的函數因為 Init 錯誤而失敗,則可能意味著:

它無法檢索函數內容

它無法安裝依賴項

它無法編譯我們的函數(使用編譯型語言)

對于上述任何一種情況,我們應該首先確定哪個容器失敗了(因為每個步驟都在不同的容器中執行):

$ kubectl get pods -l function=hello
NAME READY STATUS RESTARTS AGE
hello-b46455654-v2bs9 0/1 Init:CrashLoopBackOff 5 5m2s
$ kubectl get pods -l function=hello -o yaml
 name: install
 ready: false
 restartCount: 5
...

從上面我們可以看到,容器 install 就是有問題的容器。根據運行時間,還將顯示容器的日志,因此我們可以直接發現問題。不幸的是,事實并非如此,因此讓我們手動檢索 install 容器的日志:

$ kubectl logs hello-b46455654-v2bs9 -c install --previous
/kubeless/requirements.txt: OK
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
WARNING: The directory  /.cache/pip  or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo s -H flag.
ERROR: Could not find a version that satisfies the requirement jenkinsapi-2020 (from -r /kubeless/requirements.txt (line 1)) (from versions: none)
ERROR: No matching distribution found for jenkinsapi-2020 (from -r /kubeless/requirements.txt (line 1))
WARNING: You are using pip version 20.0.2; however, version 20.2.3 is available.
You should consider upgrading via the  /usr/local/bin/python -m pip install --upgrade pip  command.

現在我們可以發現問題是我們 requirements.txt 中模塊名不對,應該將 jenkinsapi-2020 改為 jenkinsapi。

函數 pod crash 之  
CrashLoopBackOff

在 Pod 保持該狀態的情況下,我們應該檢索運行時容器的日志:

$ kubectl logs -l function=hello
Traceback (most recent call last):
 File  /kubeless.py , line 17, in  module 
  /kubeless/%s.py  % os.getenv(MOD_NAME))
 File  /kubeless/test.py , line 1
 import requests123
 ^
SyntaxError: invalid syntax

我們可以看到我們有一個語法錯誤:import requests123,應該修改為:import requests。

函數返回 Internal Server Error”

在某些情況下,pod 不會 crash,但是函數返回錯誤:

$ kubectl get pods -l function=hello
NAME READY STATUS RESTARTS AGE
hello-c6946586b-thb8b 1/1 Running 0 29s
$ kubeless function call hello --data  {username :  test} 
ERRO[0000] 
FATA[0000] an error on the server ( !DOCTYPE HTML PUBLIC \ -//IETF//DTD HTML 2.0//EN\ 
  html 
  head 
  title Error: 500 Internal Server Error /title 
  style type=\ text/css\ 
 html {background-color: #eee; font-family: sans;}
 body {background-color: #fff; border: 1px solid #ddd;
 padding: 15px; margin: 15px;}
 pre {background-color: #eee; border: 1px solid #ddd; padding: 5px;}
  /style 
  /head 
  body 
  h2 Error: 500 Internal Server Error /h2 
  p Sorry, the requested URL  tt #039;http://kubernetes.docker.internal:6443/ /tt 
 caused an error: /p 
  pre Internal Server Error /pre 
  /body 
  /html ) has prevented the request from succeeding

這通常意味著該函數在語法上是正確的,但存在錯誤。再次檢查問題,我們應該檢查函數日志:

$ kubectl logs -l function=hello
 File  /usr/local/lib/python2.7/dist-packages/bottle.py , line 862, in _handle
 return route.call(**args)
 File  /usr/local/lib/python2.7/dist-packages/bottle.py , line 1740, in wrapper
 rv = callback(*a, **ka)
 File  /kubeless.py , line 91, in handler
 raise res
KeyError:  user 
{event-time :  2020-10-01T03:04:27Z ,  extensions : { request :  LocalRequest: POST http://kubernetes.docker.internal:6443/},  event-type :  application/json ,  event-namespace :  cli.kubeless.io ,  data : {u username : u test},  event-id :  fltxfHu2hF5M2TQ }
10.1.0.1 - - [01/Oct/2020:03:04:27 +0000]  POST / HTTP/1.1  500 758    kubeless/v0.0.0 (darwin/amd64) kubernetes/$Format  0/23723
10.1.0.1 - - [01/Oct/2020:03:04:57 +0000]  GET /healthz HTTP/1.1  200 2    kube-probe/1.15  0/142

查看引起錯誤的函數代碼:

def hello(event, context):
 print event
 return event[data][user][name

這里將 event[data][user][name]  改為 event[data][username]   即可。

上述就是丸趣 TV 小編為大家分享的 Kubeless 函數部署遇到了問題怎么辦了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計6407字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南汇区| 胶南市| 关岭| 河津市| 定襄县| 金门县| 宁阳县| 元氏县| 龙里县| 衡南县| 怀柔区| 宜宾县| 垣曲县| 大渡口区| 哈尔滨市| 浑源县| 博兴县| 离岛区| 万载县| 瑞丽市| 蓬莱市| 延长县| 临潭县| 虞城县| 都江堰市| 香河县| 双辽市| 蒙自县| 武穴市| 班玛县| 峨山| 礼泉县| 那曲县| 合山市| 弋阳县| 探索| 桃园市| 鹤庆县| 烟台市| 博罗县| 龙胜|