Kubernetes가 파산했습니다. 이제 뭐?

12451 단어 srekubernetesetcd
mccricardo.com에 원래 게시되었습니다.

우리는 몇 개의 Kubernetes 클러스터를 운영해 왔습니다. 누군가 넘어져 키보드에 넘어지고 여러 서비스가 삭제됩니다. 우리는 그것들을 (빨리!) 다시 온라인 상태로 만들어야 합니다.

이전 상태로 되돌릴 수 있는 몇 가지 옵션이 있습니다.

  • 우리는 버전 제어에 모든 것을 갖추고 있습니다. 파이프라인 또는 GitOps 조정자가 이를 처리합니다.

  • ectd 백업 복원 - 모든 Kubernetes 객체는 etcd에 저장됩니다. 정기적으로 etcd 클러스터 데이터를 백업하면 재해 시나리오에서 생명의 은인이 될 수 있습니다.

  • 특정 Kubernetes 백업 도구를 사용합니다(예: Velero ).

  • Velero과 같은 도구는 Kubernetes 개체를 백업하고 클라우드 공급자에게 PersistentVolume을 백업하도록 지시하므로 훌륭합니다. 즉, 이것은 램프 업이 있으며 지금 무언가가 필요합니다. etcd 클러스터를 백업하는 것은 항상 안전한 방법이며 그렇게 할 수 있는 방법이 있습니다ways.

    한동안 나는 MVP에 대한 "반대"로서 Earliest Testable/Usable/Lovable의 팬이었습니다.



    이를 염두에 두고 우리가 원하는 것은 무언가 잘못될 경우를 대비하여 안전망(스케이트)을 갖추는 빠른 방법입니다. 다행스럽게도 etcd에는 스냅샷 기능이 내장되어 있습니다.

    백업 등



    백업을 만들기 위해 etcd 배포에서 몇 가지를 식별해야 합니다.

    spec:
      containers:
      - command:
        - etcd
        - --advertise-client-urls=https://172.23.0.3:2379
        - --cert-file=/etc/kubernetes/pki/etcd/server.crt
        - --client-cert-auth=true
        - --data-dir=/var/lib/etcd
        - --initial-advertise-peer-urls=https://172.23.0.3:2380
        - --initial-cluster=backup-control-plane=https://172.23.0.3:2380
        - --key-file=/etc/kubernetes/pki/etcd/server.key
        - --listen-client-urls=https://127.0.0.1:2379,https://172.23.0.3:2379
        - --listen-metrics-urls=http://127.0.0.1:2381
        - --listen-peer-urls=https://172.23.0.3:2380
        - --name=backup-control-plane
        - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
        - --peer-client-cert-auth=true
        - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
        - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
        - --snapshot-count=10000
        - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    


    advertise-client-urls, cert-file, key-file 및 trusted-ca-file 값으로 무장하면 다음을 수행할 수 있습니다.

    ETCDCTL_API=3 etcdctl --endpoints https://172.23.0.3:2379 \
      --cacert="/etc/kubernetes/pki/etcd/ca.crt" \
      --cert="/etc/kubernetes/pki/etcd/server.crt" \
      --key="/etc/kubernetes/pki/etcd/server.key" \
      snapshot save snapshotdb
    
    {"level":"info","ts":1610913776.2521563,"caller":"snapshot/v3_snapshot.go:119","msg":"created temporary db file","path":"snapshotdb.part"}
    {"level":"info","ts":"2021-01-17T20:02:56.256Z","caller":"clientv3/maintenance.go:200","msg":"opened snapshot stream; downloading"}
    {"level":"info","ts":1610913776.2563014,"caller":"snapshot/v3_snapshot.go:127","msg":"fetching snapshot","endpoint":"https://172.23.0.3:2379"}
    {"level":"info","ts":"2021-01-17T20:02:56.273Z","caller":"clientv3/maintenance.go:208","msg":"completed snapshot read; closing"}
    {"level":"info","ts":1610913776.2887816,"caller":"snapshot/v3_snapshot.go:142","msg":"fetched snapshot","endpoint":"https://172.23.0.3:2379","size":"3.6 MB","took":0.036583317}
    {"level":"info","ts":1610913776.2891474,"caller":"snapshot/v3_snapshot.go:152","msg":"saved","path":"snapshotdb"}
    Snapshot saved at snapshotdb
    


    안전을 위해 백업이 정상인지 확인할 수 있습니다.

     ETCDCTL_API=3 etcdctl --write-out=table snapshot status snapshotdb
    +----------+----------+------------+------------+
    |   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
    +----------+----------+------------+------------+
    | 9b193bf0 |     1996 |       2009 |     2.7 MB |
    +----------+----------+------------+------------+
    


    etcd 복원



    kube-apiserveretcd을 사용하여 정보를 저장하고 검색하므로 먼저 ip를 중지해야 합니다. 이는 kube-apiserver 구성 방법에 따라 다릅니다. 다음으로 etcd를 복원합니다.

    ETCDCTL_API=3 etcdctl snapshot restore snapshotdb --data-dir="/var/lib/etcd-restore"
    {"level":"info","ts":1610913810.5761065,"caller":"snapshot/v3_snapshot.go:296","msg":"restoring snapshot","path":"snapshotdb","wal-dir":"/var/lib/etcd-restore/member/wal","data-dir":"/var/lib/etcd-restore","snap-dir":"/var/lib/etcd-restore/member/snap"}
    {"level":"info","ts":1610913810.599168,"caller":"mvcc/kvstore.go:380","msg":"restored last compact revision","meta-bucket-name":"meta","meta-bucket-name-key":"finishedCompactRev","restored-compact-revision":7655}
    {"level":"info","ts":1610913810.60404,"caller":"membership/cluster.go:392","msg":"added member","cluster-id":"cdf818194e3a8c32","local-member-id":"0","added-peer-id":"8e9e05c52164694d","added-peer-peer-urls":["http://localhost:2380"]}
    {"level":"info","ts":1610913810.6153672,"caller":"snapshot/v3_snapshot.go:309","msg":"restored snapshot","path":"snapshotdb","wal-dir":"/var/lib/etcd-restore/member/wal","data-dir":"/var/lib/etcd-restore","snap-dir":"/var/lib/etcd-restore/member/snap"}
    


    etcd에게 이 데이터 폴더를 사용하도록 지시하고 실행되면 kube-apiserver을 다시 온라인으로 가져와야 합니다.

    volumes:
      - hostPath:
          path: /var/lib/etcd-restore
          type: DirectoryOrCreate
        name: etcd-data
    


    이것은 약간 투박해 보이지만 재해 발생 시 안전망을 확보하는 동시에 더 유능한 솔루션(스쿠터 -> 자전거 -> 오토바이 -> 자동차)을 작업할 시간을 벌 수 있는 쉬운 방법(다시 스케이트)입니다. 예를 들어 자전거가 충분하다는 점에 도달할 수도 있습니다.

    좋은 웹페이지 즐겨찾기