摘要:嘗試運行腳本發生了的錯誤。錯誤信息接下來就是,天的調查,關于這個錯誤的能查到的資料幾乎沒有,也嘗試了很多方法,無果非常煎熬。問題解決了參考文檔初試使用完成持續構建與發布集群安全配置
背景
為了使用Kubernetes管理并自動化部署應用程序,領導"糾結"了幾個同事搭了一個Kubernetes集群環境。
不過,為了減少復雜度,采用了非官方推薦的方式:
API Server使用http方式
不使用Admission Controllers,即API Server啟動參數admission-control設為空
關于Admission Controllers的解釋,可以參照官方文檔
搭好k8s環境后,參考文檔 初試 Jenkins 使用 Kubernetes Plugin 完成持續構建與發布 部署了Jenkins Server。
嘗試運行pipeline腳本:
def label = "mypod-${UUID.randomUUID().toString()}" podTemplate(label: label, cloud: "kubernetes", containers: [ containerTemplate(name: "maven", image: "maven:3.3.9-jdk-8-alpine", ttyEnabled: true, command: "cat"), ]) { node(label) { stage("Get a Maven Project") { git "https://github.com/jenkins-docs/simple-java-maven-app.git" container("maven") { stage("Build a Maven project") { sh "mvn -B clean install" } } } } }
發生了java.nio.file.NoSuchFileException: /var/run/secrets/kubernetes.io/serviceaccount/namespace的錯誤。錯誤信息:
... > git checkout -f 0d85b7e1fd39bc6978511f92381aa10534ca4c1b > git branch -a -v --no-abbrev # timeout=10 > git checkout -b master 0d85b7e1fd39bc6978511f92381aa10534ca4c1b Commit message: "Amend README.md" First time build. Skipping changelog. [Pipeline] container [Pipeline] // container [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] End of Pipeline java.nio.file.NoSuchFileException: /var/run/secrets/kubernetes.io/serviceaccount/namespace at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ...
接下來就是2,3天的調查,關于這個錯誤的能查到的資料幾乎沒有,也嘗試了很多方法,無果... 非常煎熬。
原因關于這個錯誤,有幾個疑問
文件/var/run/secrets/kubernetes.io/serviceaccount/namespace有什么用
為什么Jenkins(Kubernetes Plugin)要去找這個文件
為什么這個文件不存在
帶著這些問題找到了官方文檔 Accessing Clusters,文檔中出現了這個文件的身姿。
Accessing the API from a Pod
When accessing the API from a pod, locating and authenticating to the apiserver are somewhat different.The recommended way to locate the apiserver within the pod is with the kubernetes.default.svc DNS name, which resolves to a Service IP which in turn will be routed to an apiserver.
The recommended way to authenticate to the apiserver is with a service account credential. By kube-system, a pod is associated with a service account, and a credential (token) for that service account is placed into the filesystem tree of each container in that pod, at /var/run/secrets/kubernetes.io/serviceaccount/token.
If available, a certificate bundle is placed into the filesystem tree of each container at/var/run/secrets/kubernetes.io/serviceaccount/ca.crt , and should be used to verify the serving certificate of the apiserver.
Finally, the default namespace to be used for namespaced API operations is placed in a file at /var/run/secrets/kubernetes.io/serviceaccount/namespace in each container.
那為什么我們搭建環境的container里沒有這個文件呢?就連目錄 /var/run/secrets 都沒有...
調查過程中,漸漸地把疑點定位到API Server的啟動參數 admission-control (1.10版本后被替換成 enable-admission-plugins)。官方推薦的設值有 ServiceAccount 但是搭環境的時候沒有設置,即設置為空。
于是,把API Server的啟動admission-control參數改成了 --admission-control=ServiceAccount。
然后,重啟API Server,修改Jenkins的Deployment(為了讓k8s重新部署Jenkins Pod)。
接著,進入新部署的Jenkins Pod(container)確認,上帝保佑,生成了目錄/var/run/secrets以及相關文件!
由于重新部署了Jenkins,需要重新設置Jenkins(安裝Plugin、設置k8s云、創建上述腳本的pipeline job)
運行job(item),腳本運行成功。問題解決了!
參考文檔jenkinsci/kubernetes-plugin
Accessing Clusters
初試 Jenkins 使用 Kubernetes Plugin 完成持續構建與發布
Using Admission Controllers
Configure Service Accounts for Pods
How to Set Up Scalable Jenkins on Top of a Kubernetes Cluster
Kubernetes集群安全配置
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32670.html
摘要:基于年底或年初沒有推廣的現狀,唯品會部門目前已經做了兩年的時間。唯品會現狀唯品會目前線上有一千多個域,每個域之間相互的依賴比較復雜,每次的部署發布困難。這是唯品會的架構,主要包含持續集成和持續部署。 數人云上海&深圳兩地容器之Mesos/K8S/Swarm三國演義的嘉賓精彩實錄第三更來啦。唯品會是數人云Meetup的老朋友,去年曾做過RPC服務框架和Mesos容器化的分享。本次分享中,...
本期目標 : 基于 Centos 7.6 , 封裝出一個可用于運行 php 項目的開箱即用鏡像本文不討論 dockerfile 語法 , 并且假設你懂得基本的類unix 操作系統常識并擁有類unix 運行環境 (包括但不限于安裝了mac 或 linux 的實體機 , 類unix虛擬機 , 安裝了 MinGW 或 CygWin 的 windows 機器) , 并且認為你懂得基本的 docker 操作...
本期目標 : 基于 Centos 7.6 , 封裝出一個可用于運行 php 項目的開箱即用鏡像本文不討論 dockerfile 語法 , 并且假設你懂得基本的類unix 操作系統常識并擁有類unix 運行環境 (包括但不限于安裝了mac 或 linux 的實體機 , 類unix虛擬機 , 安裝了 MinGW 或 CygWin 的 windows 機器) , 并且認為你懂得基本的 docker 操作...
本期目標 : 基于 Centos 7.6 , 封裝出一個可用于運行 php 項目的開箱即用鏡像本文不討論 dockerfile 語法 , 并且假設你懂得基本的類unix 操作系統常識并擁有類unix 運行環境 (包括但不限于安裝了mac 或 linux 的實體機 , 類unix虛擬機 , 安裝了 MinGW 或 CygWin 的 windows 機器) , 并且認為你懂得基本的 docker 操作...
摘要:的設計模式的設計模式以持續集成持續測試持續交付和持續部署為中心,自動化協作和持續監控是中使用的一些其他設計模式。持續集成持續集成是不斷地將源代碼集成到一個新的構建或發布的過程,源代碼可以在本地存儲中,也可以在或中。 showImg(https://segmentfault.com/img/remote/1460000010452455); 識別二維碼報名活動 8月19日,來自微軟、數人...
閱讀 2164·2023-04-26 00:43
閱讀 2685·2021-11-22 15:22
閱讀 3816·2021-11-11 16:55
閱讀 969·2021-11-04 16:06
閱讀 1787·2019-08-30 14:12
閱讀 999·2019-08-30 14:02
閱讀 3368·2019-08-29 17:05
閱讀 1417·2019-08-29 12:27