k 8 sとetcd--etcdデータをs 3にバックアップ

4284 ワード

前言


k 8 s全体の多くのコンポーネントはほとんど無状態であり、すべてのデータはetcdに保存されており、etcdはk 8 sクラスタ全体のデータベースと言える.etcdの重要性が考えられる.したがって、etcdデータのバックアップを行うことが重要です.この文章は主に我が社の関連する実践について話します.

etcdデータをs 3にバックアップ


etcdができるバックアップ案は多いが、ほとんどがetcdctlコマンドを利用している.
どうしてs 3を選んだの?
  • はawsの使用が多いため、etcdを導入するネイティブではなく、高可用性のストレージにバックアップしたいと考えています.
  • さらに、s 3は記憶されたライフサイクルの設定をサポートする.設定するとawsは、古いデータを定期的に削除し、新しいバックアップデータを保持するのに役立ちます.

  • 具体案


    私たちは基本的にetcd-backupというプロジェクトを使って、もちろんforkもして、少し変更して、主にdockerfileを変更しました.etcdctlをオンラインの実際のバージョンに変更します.
    変更後のdockerfileは次のとおりです.
    FROM alpine:3.8
    
    RUN apk add --no-cache curl
    
    # Get etcdctl
    ENV ETCD_VER=v3.2.24
    RUN \
      cd /tmp && \
      curl -L https://storage.googleapis.com/etcd/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz | \
      tar xz -C /usr/local/bin --strip-components=1
    
    COPY ./etcd-backup /
    ENTRYPOINT ["/etcd-backup"]
    CMD ["-h"]

    あとはdocker buildとか.

    k 8 s導入案


    k 8 sのcronjobを選択するのが適切で、私のバックアップポリシーは3時間ごとにバックアップします.
    cronjob.yaml:
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: etcd-backup
      namespace: kube-system
    spec:
      schedule: "0 */4 * * *"
      successfulJobsHistoryLimit: 2
      failedJobsHistoryLimit: 2
      jobTemplate:
        spec:
          # Job timeout
          activeDeadlineSeconds: 300
          template:
            spec:
              tolerations:
              # Tolerate master taint
              - key: node-role.kubernetes.io/master
                operator: Exists
                effect: NoSchedule
              # Container creates etcd backups.
              # Run container in host network mode on G8s masters
              # to be able to use 127.0.0.1 as etcd address.
              # For etcd v2 backups container should have access
              # to etcd data directory. To achive that,
              # mount /var/lib/etcd3 as a volume.
              nodeSelector:
                node-role.kubernetes.io/master: ""
              containers:
              - name: etcd-backup
                image: iyacontrol/etcd-backup:0.1
                args:
                # backup guest clusters only on production instalations
                # testing installation can have many broken guest clusters
                - -prefix=k8s-prod-1
                - -etcd-v2-datadir=/var/lib/etcd
                - -etcd-v3-endpoints=https://172.xx.xx.221:2379,https://172.xx.xx.83:2379,https://172.xx.xx.246:2379
                - -etcd-v3-cacert=/certs/ca.crt
                - -etcd-v3-cert=/certs/server.crt
                - -etcd-v3-key=/certs/server.key
                - -aws-s3-bucket=mybucket
                - -aws-s3-region=us-east-1
                volumeMounts:
                - mountPath: /var/lib/etcd
                  name: etcd-datadir
                - mountPath: /certs
                  name: etcd-certs
                env:
                  - name: ETCDBACKUP_AWS_ACCESS_KEY
                    valueFrom:
                      secretKeyRef:
                        name: etcd-backup
                        key: ETCDBACKUP_AWS_ACCESS_KEY
                  - name: ETCDBACKUP_AWS_SECRET_KEY
                    valueFrom:
                      secretKeyRef:
                        name: etcd-backup
                        key: ETCDBACKUP_AWS_SECRET_KEY
                  - name: ETCDBACKUP_PASSPHRASE
                    valueFrom:
                      secretKeyRef:
                        name: etcd-backup
                        key: ETCDBACKUP_PASSPHRASE
              volumes:
              - name: etcd-datadir
                hostPath:
                  path: /var/lib/etcd
              - name: etcd-certs
                hostPath:
                  path: /etc/kubernetes/pki/etcd/
              # Do not restart pod, job takes care on restarting failed pod.
              restartPolicy: Never
              hostNetwork: true
       

    注意:nodeselectorと協力してpodをmasterノードにスケジューリングすることを許容します.
    そしてsecret.yaml:
    apiVersion: v1
    kind: Secret
    metadata:
      name: etcd-backup
      namespace: kube-system
    type: Opaque
    data:
      ETCDBACKUP_AWS_ACCESS_KEY: QUtJTI0TktCT0xQRlEK
      ETCDBACKUP_AWS_SECRET_KEY: aXJ6eThjQnM2MVRaSkdGMGxDeHhoeFZNUDU4ZGRNbgo=
      ETCDBACKUP_PASSPHRASE: ""

    まとめ


    前にetcd-operatorを試してbackupを完了しました.実際の使用過程では、概念が多く、コンポーネントが複雑で、コードが多く書き方が死んでいることがわかりました.
    最後にetcd-backupを選択します.主に簡単だから、less is more.ソースコードを見て、golangで書いて、自分のいくつかの需要を拡張して、比較的に簡単です.