Migrazione del nodo master kubernetes da 1 server a un altro server

Aug 22 2020

Ho un server bare metal che ospita un nodo Kubernetes principale. Avrei bisogno di spostare il nodo master su un nuovo server bare metal. Come possiamo spostarlo o migrarlo?

Ho fatto le mie ricerche ma la maggior parte di esse sono relative al cluster GCP in cui spostiamo 4 directory dal vecchio nodo al nuovo nodo, e cambiamo anche l'IP e quella domanda è stata posta 5 anni fa, che ora è obsoleta.

/var/etcd
/srv/kubernetes
/srv/sshproxy
/srv/salt-overlay

Qual è il modo corretto per spostarlo assumendo che stiamo utilizzando la versione k8s più recente di 1.17

Risposte

2 Mark Aug 26 2020 at 17:34

A seguito del problema di GitHub menzionato nei commenti e delle modifiche dell'indirizzo IP nel nodo master Kubernetes :

1 . Verifica che etcd data directorystai esaminando etcd pod in kube-system namespace:

(valori predefiniti utilizzando k8s v1.17.0 creato con kubeadm),

    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data

2 . Preparazione:

  • copia /etc/kubernetes/pkida Master1 al nuovo Master2 :
    #create backup directory in Master2,
    mkdir ~/backup

    #copy from Master1 all key,crt files into the Master2 
    sudo scp -r /etc/kubernetes/pki  [email protected]:~/backup

  • Su Master2 rimuovere i certificati con le chiavi che hanno il vecchio indirizzo IP per apiserver e eccd cert :
    ./etcd/peer.crt
    ./apiserver.crt

    rm ~/backup/pki/{apiserver.*,etcd/peer.*}
  • mossa pki directory to /etc/kubernetes
 cp -r ~/backup/pki  /etc/kubernetes/

3 . Su Master1 crea un'istantanea etcd :

Verifica il tuo API version:

kubectl exec -it etcd-Master1 -n kube-system -- etcdctl  version

etcdctl version: 3.4.3
API version: 3.4
  • utilizzando l'attuale pod etcd :
    kubectl exec -it etcd-master1 -n kube-system --  etcdctl --endpoints https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key snapshot save /var/lib/etcd/snapshot1.db
  • usando o usando i binari etcdctl :
    ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key snapshot save /var/lib/etcd/snapshot1.db

4 . Copia lo snapshot creato dalla directory di backup Master1 alla directory di backup Master2 :

scp ./snapshot1.db  [email protected]:~/backup

5 . Prepara la configurazione di Kubeadm per riflettere la configurazione Master1 :

apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: x.x.x.x
  bindPort: 6443
nodeRegistration:
  name: master2
  taints: []     # Removing all taints from Master2 node.
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.17.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.0.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

6. Ripristina snapshot:

  • utilizzando l' etcd:3.4.3-0immagine docker:
    docker run --rm \
        -v $(pwd):/backup \
        -v /var/lib/etcd:/var/lib/etcd \
        --env ETCDCTL_API=3 \
        k8s.gcr.io/etcd:3.4.3-0 \
        /bin/sh -c "etcdctl snapshot restore './snapshot1.db' ; mv /default.etcd/member/ /var/lib/etcd/"
  • o usando i etcdctlbinari:
    ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 snapshot restore  './snapshot1.db' ; mv ./default.etcd/member/ /var/lib/etcd/

7. Inizializza Master2 :

    sudo kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd --config kubeadm-config.yaml
    # kubeadm-config.yaml prepared in 5 step.
  • Avviso:

[WARNING DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master2 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 master2_IP]
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [master2 localhost] and IPs [master2_ip 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [master2 localhost] and IPs [master2_ip 127.0.0.1 ::1]
.
.
.  
  Your Kubernetes control-plane has initialized successfully!
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • Dopo la verifica dell'oggetto k8s (breve esempio):
    kubectl get nodes
    kuebctl get pods - owide
    kuebctl get pods -n kube-system -o wide
    systemctl status kubelet 
  • Se tutti gli oggetti k8s distribuiti come pod, distribuzioni ecc. Sono stati spostati nel tuo nuovo nodo Master2 :
    kubectl drain Master1
    kubectl delete node Master1

Nota:

Inoltre, considera la creazione di cluster altamente disponibili in questa configurazione dovresti avere la possibilità di più di 1 master, in questa configurazione puoi creare / rimuovere nodi aggiuntivi del piano di controllo in modo più sicuro.

  • Docs
  • Tutorial
  • Documentazione Funzionamento dei cluster etcd per Kubernetes