지난 3편에 이어 다음!!
지난 포스팅까지 base 이미지가 생성되었다.
이제 마지막으로 cronjob / pvc / serviceaccount / rolebinding / scc 권한을 해주면 끝난다.
serviceAccount
pod가 기동될때 사용할 서비스어카운트를 생성한다.
서비스 어카운트를 생성하면 secret에 token이 생기는데 해당 토큰으로 부여된 권한에 한해서 조회/생성/삭제 등을 할 수 있다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: backup-user
namespace: 3scale
admin rolebinding
생성된 서비스어카운트에 admin 권한을 부여한다.
롤은 클러스터전체 또는 네임스페이스 단위로 지정할 수 있는데
네임스페이스 단위로 지정하려면 아래 yam 처럼 namespace가 지정된다.
(kind가 ClusterRole 이라 전체인줄 알았는데, 클러스터전체는 namespace 항목이 없어야됨)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: backup-user-3scale-admin-rolebinding
namespace: 3scale
subjects:
- kind: ServiceAccount
name: backup-user
namespace: 3scale
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
PersistentVolumeClaim
실제 백업파일을 보존할 pvc를 생성한다.
필자는 ARO 환경에 AzureFile을 StorageClass로 사용하고 있기 때문에, pvc만 만들면 자동으로 pv가 binding 된다.
pvc name : 3scale-backup
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: 3scale-backup
namespace: 3scale
annotations:
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/azure-file
volume.kubernetes.io/storage-provisioner: kubernetes.io/azure-file
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: azure-file
volumeMode: Filesystem
scc 권한 부여
dockerfile 에서 지정한 유저의 uid 는 1000 이다.
ocp 에서는 project 마다 생성되는 uid를 제한하는데,
$ oc describe project <namespace>
위 명령어로 조회해보면, 아래 내용 중 uid-range 항목에 컨테이너 기동 유저의 id를 임의로 지정한다.
(리눅스는 uid 제한이 0~65535)
Name: openshift-apiserver
Created: 3 hours ago
Labels: kubernetes.io/metadata.name=openshift-apiserver
olm.operatorgroup.uid/f62101a1-cd94-4f8d-9e92-c401e3916a3b=
openshift.io/cluster-monitoring=true
pod-security.kubernetes.io/audit=privileged
pod-security.kubernetes.io/enforce=privileged
pod-security.kubernetes.io/warn=privileged
Annotations: openshift.io/node-selector=
openshift.io/sa.scc.mcs=s0:c23,c22
openshift.io/sa.scc.supplemental-groups=1000550000/10000
openshift.io/sa.scc.uid-range=1000550000/10000
workload.openshift.io/allowed=management
Display Name: <none>
Description: <none>
Status: Active
Node Selector: <none>
Quota: <none>
Resource limits: <none>
이로인해 ocp에서는 컨테이너 기동 유저의 id가 100550000 보다 낮을경우(위 프로젝트 예시값) error 가 발생한다.
그래서 scc 권한을 부여해주어야하는데, nonroot를 부여해주면 root를 제외한 모든 유저를 사용할 수 있게된다.
$ oc adm policy add-scc-to-user nonroot -z backup-user -n 3scale
CronJob
대망의 크론잡이다.!!!!
스케줄 작동 시간은 테스트로 1분마다 실행하도록 지정해놓았고,
dockerfile에서 넣어두었던 start.sh 을 실행시키는 커맨드를 작성하였다.
또, uid 1000(backupuser), gid 2000 으로 실행시키는 정의를 하였다.
특별히 volumeMount 에 serviceaccount token을 가져오는데, 현재 serviceAccountName의 token을 마운트하면 된다.
apiVersion: batch/v1
kind: CronJob
metadata:
namespace: 3scale
name: 3scale-backup-cronjob
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: "Replace"
#startingDeadlineSeconds: 200
#suspend: false
successfulJobsHistoryLimit: 2
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
metadata:
labels:
parent: "3scale-backup-cronjob"
spec:
containers:
- command: ["/bin/sh", "/home/backupuser/start.sh"]
image: image-registry.openshift-image-registry.svc:5000/3scale/backupjob:1.0
imagePullPolicy: Always
name: job-3scale-backup
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- name: 3scale-backup-pvc
mountPath: /pv-storage/
- name: kube-api-access-b4pds
readOnly: true
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
securityContext:
runAsUser: 1000
runAsGroup: 2000
dnsPolicy: ClusterFirst
serviceAccountName: backup-user
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
restartPolicy: OnFailure
volumes:
- name: 3scale-backup-pvc
persistentVolumeClaim:
claimName: 3scale-backup
- name: kube-api-access-b4pds
projected:
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
name: kube-root-ca.crt
items:
- key: ca.crt
path: ca.crt
- downwardAPI:
items:
- path: namespace
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- configMap:
name: openshift-service-ca.crt
items:
- key: service-ca.crt
path: service-ca.crt
defaultMode: 420
완료
이제 1분마다 잡이 생성되고, 최신 백업데이터를 5개만 유지한다.
지금까지 쓰인 모든 파일은 gitlab project 에 push하여 형상관리를 하고,
start.sh 를 통한 백업 스크립트를 따로 빼서 테스트하기에도 용이하다.
이로써 백업고도화(?) 작업을 마친다.
'엔지니어링 > 3scale' 카테고리의 다른 글
[3scale] 복원 중 rake aborted 에러 해결방법 (0) | 2022.09.01 |
---|---|
[OCP] 3scale 백업 자동화 고도화하기 - 3편(이미지생성, 권한부여) (0) | 2022.08.31 |
[OCP] 3scale 백업 자동화 고도화하기 - 2편(dockerfile, 쉘스크립트) (0) | 2022.08.31 |
[OCP] 3scale 백업 자동화 고도화하기 - 1편(도입부) (0) | 2022.08.31 |
[OCP] 3scale Operator 리소스 조정(관리) (0) | 2022.08.24 |