※ 시작 전 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 또한 생성된 것을 확인 가능
[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 |