kubectl로 custom resource definition(crd) 제거 시 동작 안될 때

 

증상

helm 차트 삭제 시 특정 crd 계속 남아있음

kubectl delete 명령어로 특정 crd 제거해도 동작 안함

kubectl delete crd flinksessionjobs.flink.apache.org

 

 

원인

finalizer를 가진 custom resource가 "deadlock" 상태에 빠짐

 

** finalizer:  

CRD의 수명 주기를 관리하는 중요한 개념 중 하나.

kubernetes 오브젝트의 삭제 과정에서 수행되는 특별한 작업 정의.

삭제되기 전에 수행되어야 하는 추가적인 작업이나 정리 과정을 finalizer를 통해 지정.

 

 

해결

kubectl patch 명령어를 이용하여 해당 CRD의 finalizer 제거

kubectl patch crd/flinksessionjobs.flink.apache.org -p '{"metadata":{"finalizers":[]}}' --type=merge 
customresourcedefinition.apiextensions.k8s.io/flinksessionjobs.flink.apache.org patched (no change)


kubectl delete crd flinksessionjobs.flink.apache.org
warning: deleting cluster-scoped resources, not scoped to the provided namespace
customresourcedefinition.apiextensions.k8s.io "flinksessionjobs.flink.apache.org" deleted

 

 

제거 후 helm 차트 제거 시 정상 동작

'Kubernetes' 카테고리의 다른 글

K8S Jenkins 구축  (1) 2023.11.11

Jenkins에서 제공하는 helm chart를 이용하여 kubernetes 환경에서 Jenkins 및 agent 구축 및 운영

참고: https://github.com/jenkinsci/helm-charts/tree/main/charts/jenkins

 

 

 

1. Helm repository 추가 및 업데이트

helm repo add jenkins https://charts.jenkins.io
helm repo update

 

 

 

 

2. values.yaml 이용하여 jenkins 환경 설정

helm chart에서 제공하는 value 옵션을 참고하여 values.yaml 파일을 생성해 필요한 설정을 적용한다

value 옵션 참고: https://github.com/jenkinsci/helm-charts/blob/main/charts/jenkins/VALUES_SUMMARY.md

 

 

주요 설정 옵션

kubernetes 클러스터 관련

# For FQDN resolving of the controller service. Change this value to match your existing configuration.
# ref: https://github.com/kubernetes/dns/blob/master/docs/specification.md
clusterZone: "cluster.local"

# The URL of the Kubernetes API server
kubernetesURL: "https://kubernetes.default"

 

설치할 kubernetes의 클러스터의 도메인 및 API 서버 정보 적용

 

 

 

KST timezone 설정

controllers:
  containerEnv:
    - name: TZ
      value: "Asia/Seoul"
  initScripts: 
    - |
      System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Seoul')
      System.setProperty('user.timezone', 'Asia/Seoul')

 

jenkins의 default timezone이 UTC이기 때문에, KST 기준으로 변경하기 위해 위의 설정 필요

  • initScripts로 jenkins에 jvm 옵션을 적용하여 시스템 전체의 timezone을 Asia/Seoul(KST) 로 변경
  • 시스템 설정을 변경하더라도 job 생성 시 주기적 실행을 위해 Build periodically - Schedule에 crontab으로 정의 시 UTC 기준으로 동작하므로, KST 기준으로 동작하게 하려면 TZ=Asia/Seoul 추가 필요

  • containerEnv로 controller 환경변수에 TZ="Asia/Seoul"을 설정해줄 경우 Schedule crontab이 KST기준으로 동작하여 별도의 timezone 설정 필요 없음

 

 

 

agent 설정

agent:
  enabled: true
  defaultsProviderTemplate: ""
  # URL for connecting to the Jenkins controller
  jenkinsUrl:
  # connect to the specified host and port, instead of connecting directly to the Jenkins controller
  jenkinsTunnel:
  ...

agent 옵션의 enabled 설정을 true로 적용할 경우, job 실행 시 지정 옵션대로 agent pod이 동적으로 생성되어 해당 pod에서 job 실행

 

※ agent pod를 별도로 띄워놓고 동작시키고 싶을 경우 별도의 pod(deployment) 생성해 controller와 연결 가능 (아래 별도 설명)

 

 

 

 

3. helm 배포로 jenkins 구축

helm install jenkins jenkins/jenkins . -f values.yaml -n jenkins
 
 
NAME: jenkins
LAST DEPLOYED: Sat Nov  11 12:00:57 2023
NAMESPACE: jenkins
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
  kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  echo http://127.0.0.1:8080
  kubectl --namespace jenkins port-forward svc/jenkins 8080:8080

3. Login with the password from step 1 and the username: admin
4. Configure security realm and authorization strategy
5. Use Jenkins Configuration as Code by specifying configScripts in your values.yaml file, see documentation: http:///configuration-as-code and examples: https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos

For more information on running Jenkins on Kubernetes, visit:
https://cloud.google.com/solutions/jenkins-on-container-engine

For more information about Jenkins Configuration as Code, visit:
https://jenkins.io/projects/jcasc/


NOTE: Consider using a custom image with pre-installed plugins

NOTES 대로 kubectl 명령어를 실행해주면 jenkins 접속 시 admin의 password 확인할 수 있으며, 임의의 password를 지정하고 싶으면 values.yaml에  adminPassword를 지정해주면 됨

 

jenkins UI 접속도 마찬가지로 아래 명령어를 통해 port-forward해 http://127.0.0.1:8080 으로 접속 가능하며, values.yaml의 serviceType 옵션을 변경하거나, ingress를 enabled: true 로 활성화 및 옵션 지정하여 url설정 및 접속 가능하게 함  

 

 

 

 

 

 

 

4. agent pod 생성 및 controller 연결

1. Jenkins 관리 > Nodes > New Node에서 노드명, type 지정해 신규 노드 설정 생성

 

노드 설정 예시

  • 노드명: default-agent
  • Type: Permanent Agent
  • Remote root directory: /home/jenkins
  • Labels: default-agent
  • Usage: Use this node as much as possible 
  • Launch method: Launch agent by connecting it to the controller

 

2. 생성된 노드늘 눌러 상세 화면으로 들어간 후 agent의 command 라인의 secret 옵션값 복사

 

 

 

 

 

3. agent pod생성 후 controller와 연결해 job을 실행하기 위한 deployment yaml (default-agent.yaml) 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: "jenkins-inbound-default-agent"
  labels:
    name: "jenkins-inbound-default-agent"
  namespace: "jenkins"
spec:
  replicas: 1
  selector:
    matchLabels:
      name: "jenkins-inbound-default-agent"
  template:
    metadata:
      labels:
        name: "jenkins-inbound-default-agent"
    spec:
      containers:
      - name: inbound-default-agent
        env:
        - name: "JENKINS_SECRET"
          value: "5d9a52efc22d85f3ed27c81c99c8434dfe05445bd38f0801fc545f3a1564e30d"
        - name: "JENKINS_TUNNEL"
          value: "jenkins-agent.jenkins.svc.cluster.local:50000"
        - name: "JENKINS_AGENT_NAME"
          value: "default-agent"
        - name: "JENKINS_NAME"
          value: "default-agent"
        - name: "JENKINS_AGENT_WORKDIR"
          value: "/home/jenkins/agent"
        - name: "JENKINS_URL"
          value: "http://jenkins.jenkins.svc.cluster.local:8080/"
        image: "jenkins/inbound-agent"
        imagePullPolicy: "Always"
        resources:
          limits:
            memory: "1Gi"
            cpu: "1024m"
          requests:
            memory: "1Gi"
            cpu: "1024m"
  • 위에서 복사한 secret 값을 JENKINS_SECRET 환경변수 값으로 적용

 

 

 

4. kubectl 명령어로 default-agent.yaml apply해 pod 생성

kubectl apply -f default-agent.yaml -n jenkins

 

 

 

5. 노드 생성 및 연결 확인

 

 

 

 

6. job 생성 시 label에 해당 노드의 label 적용해 지정 노드에서 job 실행 가능

 

 

 

 

'Kubernetes' 카테고리의 다른 글

CRD 제거 안될 때 조치  (1) 2023.11.24

+ Recent posts