DevOps/Kubernetes

[kubernetes] Helm으로 Jenkins Deploy

twoDeveloper 2021. 11. 12. 15:26

※ 시작 전 EKS Cluster가 구축되어 있어야 한다!

 

■ k8s Cluster 에 Helm을 이용하여 Jenkins Deploy

1. AWS EBS (Persistent Volume)

Pod가 삭제 후 재생성 되어도 Pod 내부의 내용을 보존하기 위해 독립적인 Persistent Volume 필요

 

필자는 AWS EBS를 Persistent Volume으로 사용할 것

 

EBS CSI Driver 를 Cluster에 배포하여 EBS를 Persistent Volume으로 사용하도록 세팅하는 과정 !

1) ServiceAccount에 필요한 권한을 정의한 IAM 정책 생성

'IAM' -> 정책 -> '정책 생성'

정책 내용 : example-iam-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AttachVolume",
        "ec2:CreateSnapshot",
        "ec2:CreateTags",
        "ec2:CreateVolume",
        "ec2:DeleteSnapshot",
        "ec2:DeleteTags",
        "ec2:DeleteVolume",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeInstances",
        "ec2:DescribeSnapshots",
        "ec2:DescribeTags",
        "ec2:DescribeVolumes",
        "ec2:DescribeVolumesModifications",
        "ec2:DetachVolume",
        "ec2:ModifyVolume"
      ],
      "Resource": "*"
    }
  ]
}

 

2) IAM 역알을 만들고 위에 만든 정책을 연결

'IAM' -> 역할 -> '역할 만들기'

* 웹 ID

* 자격 증명 공급자 : 기존 생성한 'EKS URI'

* Audience : 'sts.amazonaws.com'

* '다음 권한' 클릭

* 위에 생성한 '정책' 선택

 

3) 생성한 정책 편집

* 생성한 정책 편집 ( '신뢰 관계' -> '편집' )

--------------------------------

"StringEquals" : {                         

   이 부분을 위의 캡쳐본과 같이 편집   

}

--------------------------------

* 신뢰 정책 업데이트 클릭

 


■ aws-ebs-csi-deriver.git clone

$ git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git

* clone 후 aws-ebs-csi-driver/deploy/kubernetees/base 폴더 내부의

  'serviceaccount-csi-controller.yaml' 파일에 annotations 추가

---
# Source: aws-ebs-csi-driver/templates/serviceaccount-csi-controller.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ebs-csi-controller-sa
  labels:
    app.kubernetes.io/name: aws-ebs-csi-driver
  #Enable if EKS IAM for SA is used
  annotations:
    eks.amazonaws.com/role-arn: [생성한 역할 ARN 입력]

 

* 수정한 serviceaccount-csi-controller.yaml 적용

$ kubectl apply -k aws-ebs-csi-driver/deploy/kubernetes/base

 


■ Helm을 이용하여 Jenkins Deploy

1.  jenkins namespace 생성

$ kubectl create namespace jenkins

 

2. StroageClass & PersistentVolumeClaim 생성

* jenkins-pvc.yaml

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: jenkins-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: jenkins-sc
  resources:
    requests:
      storage: 30Gi

* StorageClass 및 해당 StorageClass를 사용하는 Persistent VolumeClaim 생성

* SC 및 PVC 이름 기억 ( jenkins-pvc, jenkins-sc )

 

* 구성한 jenkins-pvc.yaml 적용

$ kubectl apply -f jenkins-pvc.yaml

■ ServiceAccount

* Jenkins의 Pod 가 API Server 와 상호작용할 수 있도록 jenkins 라는 ServiceAccount 생성

* jenkins-sa.yaml

kind: ServiceAccount
metadata:
  name: jenkins
  namespace: jenkins
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: jenkins
rules:
- apiGroups:
  - '*'
  resources:
  - statefulsets
  - services
  - replicationcontrollers
  - replicasets
  - podtemplates
  - podsecuritypolicies
  - pods
  - pods/log
  - pods/exec
  - podpreset
  - poddisruptionbudget
  - persistentvolumes
  - persistentvolumeclaims
  - jobs
  - endpoints
  - deployments
  - deployments/scale
  - daemonsets
  - cronjobs
  - configmaps
  - namespaces
  - events
  - secrets
  verbs:
  - create
  - get
  - watch
  - delete
  - list
  - patch
  - update
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
  - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: jenkins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts:jenkins

* ClusterRole, ClusterRoleBinding, ServiceAccount를 생성 !

 


■ values.yaml 템플릿 수정 및 적용 (이후 values.yaml -> jenkins-values.yaml 변경)

* values.yaml : https://raw.githubusercontent.com/jenkinsci/helm-charts/main/charts/jenkins/values.yaml

※ values.yaml 수정 할 부분

1) servicePort

  servicePort: 80
  targetPort: 8080

* 8080 -> 80

 

2) 외부로 노출하기 위해 LoadBalancer 설정

  serviceType: LoadBalancer
  # Use Local to preserve the client source IP and avoids a second hop for LoadBalancer and Nodeport type services,
  # but risks potentially imbalanced traffic spreading.
  serviceExternalTrafficPolicy:
  # Jenkins controller service annotations
  serviceAnnotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"

 

3) persistence.existingClaim

existingClaim: jenkins-pvc

* 생성한 pvc 이름 적용 ( jenkins-pvc )

 

4) persistence.storageClass

storageClass: jenkins-sc

* 생성한 sc 이름 적용 ( jenkins-sc )

 

5) persistence.serviceAccount

serviceAccount:
  create: false
  # The name of the service account is autogenerated by default
  name: jenkins
  annotations: {}
  imagePullSecretName:

* jenkins 라는 sa를 이미 생성했었기 때문 (위 참조) create: true 부분을 create: false로 수정

* name: jenkins

 


■ Jenkins Deploy

1. helm chart에 jenkins repo add

$ helm repo add jenkinsci https://charts.jenkins.io
---
NAME     	URL 
jenkinsci	https://charts.jenkins.io
$ helm repo update

 

2. 수정한 jenkins-values.yaml 을 EKS Cluster에 Jenkins를 배포

$ helm install jenkins -n jenkins -f jenkins-values.yaml jenkinsci/jenkins

 

3. LoadBalancer를 보면 'NLB' 가 생성된 것을 볼 수 있음

* NLB Address 로 접속하면 Jenkins UI 페이지 접속

* 사용자 이름 : admin

* 비밀번호 :

$ kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo
GVh3G7H9uJ8tTh6mNZxKul

위 명령어 입력 후 나온 값이 비밀번호 (로그인 후 비밀번호 변경)

 

4. EC2 Volume 또한 생성된 것을 확인 가능

 

 

참고 : https://velog.io/@aylee5/EKS-Helm%EC%9C%BC%EB%A1%9C-Jenkins-%EB%B0%B0%ED%8F%AC-MasterSlave-%EA%B5%AC%EC%A1%B0-with-Persistent-VolumeEBS

 

[EKS] Helm으로 Jenkins 배포 - Master/Slave 구조 with Persistent Volume(EBS)

이번 글에서는 helm을 이용하여 jenkins를 kubernetes 클러스터에 배포해 볼 것이다.Jenkins는 Master/Slave 구조로 구성해 볼 것인데 간단하게 Master는 Job을 구성하는 역할을 하게 되고 Slave는 실제 Job을 실

velog.io

 

'DevOps > Kubernetes' 카테고리의 다른 글

[Kubernetes] 쿠버네티스란?  (0) 2022.08.23
[kubernetes] Argo CD Install  (0) 2021.12.22
[kubernetes] EKS Cluster 내부에 AWS RDS 구축  (0) 2021.11.10
[Kubernetes] AWS ALB Controller  (0) 2021.11.10
[kubernetes] EKS Install  (0) 2021.10.27