집에서 데이터 영구화

11985 단어 kubernetes

목표


집에서 Kubernetes를 사용하십니까?
VPS를 빌려 Kubernetes를 운용합니다.
그러나 쿠버넷을 활용하는 과정에서 OS를 여러 번 다시 열고 실례를 다시 만들고 싶지만 응용 프로그램의 데이터를 잃고 싶지 않다.그런 일 없어요?

해결 방법


구글 드라이브에 정기적으로 저장하는 것을 고려하다.

Rclone


로컬 파일을 모든 SaaS와 동기화할 수 있는 도구
사이드카에 넣고 정기적으로 데이터를 백업하는 것을 고려하다.

시크릿


Rclone은 동기화 대상 정보를 config 파일로 제공할 수 있습니다.
여기에도 인증 정보 등이 포함되어 있기 때문에 쿠베르네츠의 시크릿 자원으로 준비하는 것이 좋다.rclone config 명령을 사용하여 대화 형식으로 구성 파일을 만들 수 있습니다.
옆에 있는 기계에 rclone을 설치할 수 있는데 이번에는 docker로 해 봤어요.
$ mkdir config
$ docker run --rm -v `pwd`/config:/config -t -i tynor88/rclone:latest rclone config --config=/config/.rclone.conf

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 10-adduser: executing...

GID/UID
-------------------------------------
User uid:    911
User gid:    911
-------------------------------------

[cont-init.d] 10-adduser: exited 0.
[cont-init.d] 40-config: executing...
crontab => 0 * * * * /app/rclone.sh
chmod: /config/Rclone.sh: No such file or directory
[cont-init.d] 40-config: exited 0.
[cont-init.d] done.
[services.d] starting services
crond[199]: crond (busybox 1.24.2) started, log level 0
crond[199]: user:root entry:*/15    *   *   *   *   run-parts /etc/periodic/15min
crond[199]: user:root entry:0   *   *   *   *   run-parts /etc/periodic/hourly
crond[199]: user:root entry:0   2   *   *   *   run-parts /etc/periodic/daily
crond[199]: user:root entry:0   3   *   *   6   run-parts /etc/periodic/weekly
crond[199]: user:root entry:0   5   1   *   *   run-parts /etc/periodic/monthly
crond[199]: user:abc entry:0 * * * * /app/rclone.sh
[services.d] done.
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> hoge
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 7
Google Application Client Id - leave blank normally.
client_id>
Google Application Client Secret - leave blank normally.
client_secret>
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n> N
config/.rclone.conf가 완성되었기 때문에kubernetes에서 시크릿으로 배치합니다.
$ kubectl create secret generic rclone-config --from-file=./config/.rclone.conf

주기 운행


정기적으로 rclone을 실행하는 Docker 이미지가 있습니다.이번엔 이걸로
https://hub.docker.com/r/tynor88/rclone/

배치


이번에 예를 들면, Google 드라이브와 Google 드라이브를 동기화하기 위해 gollum (git를 백엔드로 하는wiki) 을 배치할 것입니다.
처음 시작할 때 이전에 저장한 것을 복구하기 위해 Google Drive->Pod으로 동기화합니다.
이것은pod입니다.spec.initContainers에서 실행됩니다.( https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ )
시작 과정에서 Gollum 이외에 rclone 용기를 실행하고 정기적으로 Pod->Google Drive에서 동기화합니다.
그림으로 보면 이런 느낌이에요.

다음은 manifest가 상술한 manifest를 실현하는 것이다.
gollum-with-rclone.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: gollum
  name: gollum
  namespace: default
spec:
  selector:
    matchLabels:
      run: gollum
  template:
    metadata:
      labels:
        run: gollum
    spec:
      initContainers:  # gollumのために、git initを初めにしておく
      - name: init
        image: golang:latest # gitがあればなんでも良い
        command:
        - sh
        - -c
        - cd /root/wikidata && git init
        volumeMounts:
        - mountPath: /root/wikidata
          name: data
      - name: first-rclone
        image: tynor88/rclone:latest
        command:  # rclone初回実行 (GoogleDrive -> Pod)
        - sh
        - -c
        - /usr/bin/with-contenv sh /app/rclone.sh
        env:
        - name: SYNC_COMMAND
          value: rclone sync GoogleDrive:/gollum /data
        volumeMounts:
        - mountPath: /data
          name: data
        - mountPath: /root
          name: config
      containers:
      - name: gollum
        image: suttang/gollum:latest # 本命のgollumイメージ
        volumeMounts:
        - mountPath: /root/wikidata
          name: data
      - name: rclone
        image: tynor88/rclone:latest # 同期用のrclone (Pod -> GoogleDrive)
        imagePullPolicy: Always
        env:
        - name: SYNC_DESTINATION
          value: GoogleDrive
        - name: SYNC_DESTINATION_SUBPATH
          value: gollum
        - name: CRON_SCHEDULE
          value: 0 * * * *
        volumeMounts:
        - mountPath: /data
          name: data
        - mountPath: /config
          name: config
      volumes:
      - name: data  # wikiのデータを入れる
        emptyDir: {}
      - name: config # secretからConfigを読み出す
        secret:
          defaultMode: 511 # 雑に0777
          secretName: rclone-config
클러스터에 배포하려면 다음을 수행합니다.
$ kubectl apply -f gollum-with-rclone.yaml
나온다!

주의사항

  • 정기적으로 수행되는 백업이므로 백업 간격이 변경되지 않습니다.
  • presStop 등에서도 백업이 더 좋다고 볼 수 있음
  • 그럼에도 불구하고 급사 등은 메울 수 없기 때문에 주의가 필요하다
  • replica가 1 이상이라고 생각하지 않는다(집이라서)
  • 이러한 상황에서 응용 프로그램과 데이터를 분리하고 데이터의 백업을 Google 드라이브에 동기화하는 등 더 많은 노력이 필요하다.
  • 총결산


    집에서 Kubernetes 클러스터를 구축할 때 문제가 되는 데이터의 영속화에 대해 Rclone을 사용한 Google Drive에 대한 정기적인 백업 스크립트를 소개합니다.
    파일이면 무엇이든 동기화할 수 있기 때문에 모든 데이터가 오래 지속되는 것이 특징이다.
    Kubernetes의 변화가 매우 빠르기 때문에 최신 Kubernetes 환경이 자주 있는 것은 매우 좋은 학습이기 때문에 우리는 Kubernetes 집단을 추천합니다.
    (Raspberry pi를 사용하여 Kubernetes를 구축하는 방법도 소개되었으니 참고하세요https://qiita.com/hatotaka/items/48a88ecb190e1f5e03c3
    이 항목은 작업 시간에 ZLab 멤버Z Lab Advent Calendar 2017로 작성되었습니다.

    좋은 웹페이지 즐겨찾기