Kubernetes/삽질

[Jenkins] HelmRelease로 설치 시, curl: (60) SSL certificate problem: certificate has expired 에러

비번변경 2022. 3. 7. 19:11

간단한 배경 지식(?)

HelmRelease

Helm에서 release란 chart를 이용해 애플리케이션을 설치된 결과를 말한다.

그리고 release를 보다 더 편리하게 관리하기 위해 쿠버네티스 리소스처럼 취급하기 위한 시도가 있었고, 그 결과로 HelmRelease라는 리소스로 release를 관리할 수 있게 되었다.

참고 : https://coffeewhale.com/kubernetes/gitops/helm/2020/05/13/helm-operator/ 

 

Init Container (초기화 컨테이너)

Pod의 Runtime Container가 실행되기 전에 실행되는 컨테이너

이미지에 포함되지 않는 유틸리티, 설정 스크립트 등을 포함할 수 있다.

Pod는 하나 이상의 Init Container를 가질 수 있으며, Init Container가 여러 개인 경우에는 초기화 컨테이너 실행 순서대로 실행이 완료되어야 Runtime Container가 동작한다.

만약 Init Container가 정상적으로 완료되지 않으면, 즉 get 명령어로 확인한 status가 아래와 같으면 정상적으로 동작을 완료할 때까지 Pod를 반복 재시작한다.

Init:0/1 상태

 

Init Container 정보 확인

describe pod 명령에 init container 정보를 확인할 수 있다.

kubectl describe pod jenkins-dfef
Name:         jenkins-dfef
[.. 생략 ..]
Init Containers:
  copy-default-config:
    Container ID:  docker://95e3298740bcaed3c2adf832f41d346e563c92add728080cfdcfcac375e0254d
    Image:         jenkins/jenkins:2.235.1
    Image ID:      docker-pullable://jenkins/jenkins@sha256:1433deaac433ce20c534d8b87fcd0af3f25260f375f4ee6bdb41d70e1769d9ce
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      /var/jenkins_config/apply_config.sh
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Wed, 09 Dec 2020 23:41:28 +0530
      Finished:     Wed, 09 Dec 2020 23:41:29 +0530
    Ready:          False
    Restart Count:  9
    Limits:
      cpu:     2
      memory:  4Gi
    Requests:
      cpu:        50m
      memory:     256Mi
    Environment:  <none>
    Mounts:
      /usr/share/jenkins/ref/plugins from plugins (rw)
      /var/jenkins_config from jenkins-config (rw)
      /var/jenkins_home from jenkins-home (rw)
      /var/jenkins_plugins from plugin-dir (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from jenkins-token-ppfw7 (ro)

 

init Container 로그 확인

Runtime Container 로그 확인하는 것과 동일한 방법으로 init Container의 로그도 확인할 수 있다.

$ kubectl logs <POD_NAME> <INIT_CONTAINER_MAME>

 

 


 

 

돌아와서, 기존에 쿠버네티스 클러스터 환경에서 HelmRelease로 Jenkins를 설치해서 사용하고 있었다.

 

참고로 사용한 helm chart의 정보와 이미지 정보는 아래와 같다

 

다만 최근 쿠버네티스 클러스터에 해당하는 서버 전부 재부팅이 되었는데, 그 이후로 Jenkins가 정상적으로 동작하지 않고 있었다.

$ kubectl get pods | grep jenkins
NAME           READY   STATUS       RESTARTS      AGE
jenkins-dfef   0/1     Init:Error   2 (22s ago)   59s


$ kubectl get pods | grep jenkins
NAME           READY   STATUS                  RESTARTS      AGE
jenkins-dfef   0/1     Init:CrashLoopBackOff   2 (20s ago)   73s


$ kubectl describe pod jenkins-dfef
[.. 생략 ..]
 Type     Reason                  Age                From                                     Message
  ----     ------                  ----               ----                                     -------
  Warning  FailedScheduling        98s (x2 over 98s)  default-scheduler                        0/2 nodes are available: 2 pod has unbound immediate PersistentVolumeClaims.
  Normal   Scheduled               95s                default-scheduler                        Successfully assigned cicd/jenkins-0 to aks-pool01-30842998-vmss000001
  Normal   SuccessfulAttachVolume  84s                attachdetach-controller                  AttachVolume.Attach succeeded for volume "pvc-34fd8f17-ce39-425b-92a7-6d61b02e166f"
  Normal   Pulling                 23s (x4 over 74s)  kubelet, aks-pool01-30842998-vmss000001  Pulling image "jenkins/jenkins:2.235.1"
  Normal   Pulled                  22s (x4 over 74s)  kubelet, aks-pool01-30842998-vmss000001  Successfully pulled image "jenkins/jenkins:2.235.1"
  Normal   Created                 22s (x4 over 74s)  kubelet, aks-pool01-30842998-vmss000001  Created container init
  Normal   Started                 22s (x4 over 74s)  kubelet, aks-pool01-30842998-vmss000001  Started container init
  Warning  BackOff                 8s (x5 over 65s)   kubelet, aks-pool01-30842998-vmss000001  Back-off restarting failed container

 

 

초기화 컨테이너가 반복적으로 실패하고 있어 로그를 확인해보니 아래와 같았다.

$ kubectl logs jenkins-dfef copy-default-config
Creating initial locks...
Analyzing war /usr/share/jenkins/jenkins.war...
Registering preinstalled plugins...
Downloading plugins...
Downloading plugin: kubernetes-client-api from https://updates.jenkins.io/download/plugins/kubernetes-client-api/4.11.1/kubernetes-client-api.hpi
Downloading plugin: kubernetes from https://updates.jenkins.io/download/plugins/kubernetes/1.25.3/kubernetes.hpi
Downloading plugin: workflow-job from https://updates.jenkins.io/download/plugins/workflow-job/2.40/workflow-job.hpi
Downloading plugin: workflow-aggregator from https://updates.jenkins.io/download/plugins/workflow-aggregator/2.6/workflow-aggregator.hpi
Downloading plugin: credentials-binding from https://updates.jenkins.io/download/plugins/credentials-binding/1.24/credentials-binding.hpi
Downloading plugin: git from https://updates.jenkins.io/download/plugins/git/4.2.2/git.hpi
Downloading plugin: ldap from https://updates.jenkins.io/download/plugins/ldap/1.23/ldap.hpi
Downloading plugin: mailer from https://updates.jenkins.io/download/plugins/mailer/1.32.1/mailer.hpi
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

Jenkins의 경우에는 Plugin 설치 등을 Init Container에서 수행하는 것으로 보이는데, 어떤 이유에선지 인증서 만료 에러 메세지를 발생하면서 플러그인 설치를 실패하고 있었다.

구글링으로도 마땅한 해결책을 찾지 못하고 있다가, Jenkins 도커 이미지의 버전 문제일 수도 있다는 의견을 들었다.

 

따라서, jenkins helmRelease yaml 파일을 아래와 같이 수정하고 다시 배포했다. 기존 리소스를 삭제하진 않았다.

master:
[.. 생략 ..]
  # Used for label app.kubernetes.io/component
  componentName: "jenkins-master"
  image: "jenkins/jenkins"
  tag: "lts"
  imagePullPolicy: "Always"

 

HelmRelease 배포

kubectl apply -f /Helm/Release.yaml

 

HelmRelease 목록 확인

kubectl get helmrelease

 

Helm list로도 release의 상태를 확인할 수 있다.

 

이후 다시 Jenkins의 포드 상태를 확인하면 정상적으로 Running 상태가 된 것을 확인할 수 있었다.