Kubernetes 지속 통합: java. nio. file. NoSuchFileException 오류 의 원인 에 대한 Jenkins
Kubernetes 를 사용 하여 응용 프로그램 을 관리 하고 자동화 배치 하기 위해 지도 자 는 몇 명의 동료 들 이 Kubernetes 군집 환경 을 만 들 었 다.그러나 복잡 도 를 줄 이기 위해 비공 식 추천 방식 을 채택 했다.
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 일간 의 조사 로 이 잘못된 것 에 대해 찾 을 수 있 는 자료 가 거의 없고 여러 가지 방법 을 시 도 했 지만 성과 가 없 었 습 니 다. 매우 힘 들 었 습 니 다.
원인.
이 잘못 에 대하 여 몇 가지 의문 이 있다.
이 문제 들 을 가지 고 공식 문서 인 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 서버 의 시작 admission - control 인 자 를 admission - control = ServiceAccount 으로 바 꾸 었 습 니 다.그리고 API Server 를 다시 시작 하고 Jenkins 의 Deployment (k8s 가 Jenkins Pod 를 재배 치 할 수 있 도록) 를 수정 합 니 다.이 어 새로운 배치 에 들 어간 젠 킨 스 포드 (container) 는 하느님 이 보우 하 시 며 디 렉 터 리 / var / run / secrets 와 관련 파일 을 생 성 하 셨 음 을 확인 했다.
Jenkins 를 재배 치 했 기 때문에 Jenkins 를 다시 설정 해 야 합 니 다 (Plugin 설치, k8s 클 라 우 드 설정, 상기 스 크 립 트 를 만 드 는 pipeline job)
job (item) 를 실행 하 였 습 니 다. 스 크 립 트 가 성공 적 으로 실행 되 었 습 니 다.문제 가 해결 되 었 다!
참고 문서
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.