Kubernetes 지속 통합: java. nio. file. NoSuchFileException 오류 의 원인 에 대한 Jenkins

배경
Kubernetes 를 사용 하여 응용 프로그램 을 관리 하고 자동화 배치 하기 위해 지도 자 는 몇 명의 동료 들 이 Kubernetes 군집 환경 을 만 들 었 다.그러나 복잡 도 를 줄 이기 위해 비공 식 추천 방식 을 채택 했다.
  • API Server 사용 http 방식
  • 은 Admission Controllers, 즉 API 서버 시작 매개 변수 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 서버 의 시작 admission - control 인 자 를 admission - control = ServiceAccount 으로 바 꾸 었 습 니 다.그리고 API Server 를 다시 시작 하고 Jenkins 의 Deployment (k8s 가 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 집단 안전 설정
  • 좋은 웹페이지 즐겨찾기