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を選んだの?
etcdができるバックアップ案は多いが、ほとんどがetcdctlコマンドを利用している.
どうしてs 3を選んだの?
具体案
私たちは基本的に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: ""