Commit 9c5de9f5 authored by galal-hussein's avatar galal-hussein Committed by Alena Prokharchyk
Browse files

Handle etcd changing its public IP address

parent cf2f8a20
release/v1.3 1.2.5 enable_fossa githubaction-go-generate-2022-01-19-14-09-53 githubaction-go-generate-2022-01-19-16-59-09 githubaction-go-generate-2022-02-02-16-53-10 githubaction-go-generate-2022-03-19-01-55-24 githubaction-go-generate-2022-03-19-02-28-40 githubaction-go-generate-2022-03-24-18-41-17 githubaction-go-generate-2022-03-24-19-00-43 githubaction-go-generate-2022-04-27-01-07-30 githubaction-go-generate-2022-04-27-16-36-37 githubaction-go-generate-2022-04-28-23-21-04 githubaction-go-generate-2022-04-29-00-20-33 githubaction-go-generate-2022-04-29-03-20-39 githubaction-go-generate-2022-04-29-03-34-38 githubaction-go-generate-2022-05-05-16-15-24 githubaction-go-generate-2022-05-06-15-36-45 githubaction-go-generate-2022-05-06-21-32-47 kinarashah-patch-1 label-opened-issues master rancherbot_port_2796_release/v1.2_6efce927fbafb32468ad2dc45acb64511f4a6f31 release/v0.3 release/v1.0 release/v1.1 release/v1.1.10 release/v1.1.13 release/v1.1.2 release/v1.2 release/v1.2.1 revert-2326-rotate-encryption-keys revert-2374-revert-2326-rotate-encryption-keys revert-2541-no_selinux_relabel v1.0 wg-10699 v1.3.11-rc2 v1.3.11-rc1 v1.3.10 v1.3.10-rc7 v1.3.10-rc6 v1.3.10-rc5 v1.3.10-rc4 v1.3.10-rc3 v1.3.10-rc2 v1.3.10-rc1 v1.3.9 v1.3.9-rc1 v1.3.8 v1.3.8-rc12 v1.3.8-rc11 v1.3.8-rc10 v1.3.8-rc9 v1.3.8-rc8 v1.3.8-rc7 v1.3.8-rc6 v1.3.8-rc5 v1.3.8-rc4 v1.3.8-rc3 v1.3.8-rc2 v1.3.8-rc1 v1.3.7 v1.3.7-rc1 v1.3.6 v1.3.6-rc1 v1.3.5 v1.3.5-rc1 v1.3.5-alpha1 v1.3.4 v1.3.4-rc1 v1.3.3 v1.3.3-rc6 v1.3.3-rc5 v1.3.3-rc4 v1.3.3-rc3 v1.3.3-rc2 v1.3.3-rc1 v1.3.2 v1.3.2-rc2 v1.3.2-rc1 v1.3.1 v1.3.1-rc1 v1.3.0 v1.3.0-rc20 v1.3.0-rc19 v1.3.0-rc18 v1.3.0-rc17 v1.3.0-rc16 v1.3.0-rc15 v1.3.0-rc14 v1.3.0-rc13 v1.3.0-rc12 v1.3.0-rc11 v1.3.0-rc10 v1.3.0-rc9 v1.3.0-rc8 v1.3.0-rc7 v1.3.0-rc6 v1.3.0-rc5 v1.3.0-rc4 v1.3.0-rc3 v1.3.0-rc2 v1.3.0-rc1 v1.2.20 v1.2.20-rc1 v1.2.19 v1.2.19-rc4 v1.2.19-rc3 v1.2.19-rc2 v1.2.19-rc1 v1.2.18 v1.2.18-rc1 v1.2.17 v1.2.17-rc1 v1.2.16 v1.2.16-rc1 v1.2.15 v1.2.15-rc1 v1.2.14 v1.2.14-rc2 v1.2.14-rc1 v1.2.13 v1.2.13-rc2 v1.2.13-rc1 v1.2.12 v1.2.12-rc1 v1.2.11 v1.2.11-rc0 v1.2.10 v1.2.10-rc0 v1.2.9 v1.2.9-rc2 v1.2.9-rc1 v1.2.8 v1.2.8-rc4 v1.2.8-rc3 v1.2.8-rc2 v1.2.8-rc1 v1.2.7 v1.2.7-rc1 v1.2.6 v1.2.6-rc6 v1.2.6-rc5 v1.2.6-rc4 v1.2.6-rc3 v1.2.6-rc2 v1.2.6-rc1 v1.2.5 v1.2.5-rc2 v1.2.5-rc1 v1.2.4 v1.2.4-rc9 v1.2.4-rc8 v1.2.4-rc7 v1.2.4-rc6 v1.2.4-rc5 v1.2.4-rc4 v1.2.4-rc3 v1.2.4-rc2 v1.2.4-rc1 v1.2.3 v1.2.3-rc1 v1.2.2 v1.2.2-rc6 v1.2.2-rc5 v1.2.2-rc4 v1.2.2-rc3 v1.2.2-rc2 v1.2.2-rc1 v1.2.1 v1.2.1-rc1 v1.2.0 v1.2.0-rc17 v1.2.0-rc16 v1.2.0-rc15 v1.2.0-rc14 v1.2.0-rc13 v1.2.0-rc12 v1.2.0-rc11 v1.2.0-rc10 v1.2.0-rc9 v1.2.0-rc8 v1.2.0-rc7 v1.2.0-rc6 v1.2.0-rc5 v1.2.0-rc4 v1.2.0-rc3 v1.2.0-rc2 v1.2.0-rc1 v1.1.19 v1.1.19-rc1 v1.1.18 v1.1.18-rc2 v1.1.18-rc1 v1.1.17 v1.1.17-rc2 v1.1.17-rc1 v1.1.16 v1.1.16-rc1 v1.1.15 v1.1.15-rc4 v1.1.15-rc3 v1.1.15-rc2 v1.1.15-rc1 v1.1.14 v1.1.14-rc3 v1.1.14-rc2 v1.1.14-rc1 v1.1.13 v1.1.13-rc3 v1.1.13-rc2 v1.1.13-rc1 v1.1.12 v1.1.12-rc1 v1.1.11 v1.1.11-rc6 v1.1.11-rc5 v1.1.11-rc4 v1.1.11-rc3 v1.1.11-rc2 v1.1.11-rc1 v1.1.10 v1.1.10-rc1 v1.1.9 v1.1.9-rc3 v1.1.9-rc2 v1.1.9-rc1 v1.1.8-rc1 v1.1.7 v1.1.6 v1.1.5 v1.1.5-rc9 v1.1.5-rc8 v1.1.5-rc7 v1.1.5-rc6 v1.1.5-rc5 v1.1.5-rc4 v1.1.5-rc3 v1.1.5-rc2 v1.1.5-rc1 v1.1.4 v1.1.4-rc2 v1.1.4-rc1 v1.1.3 v1.1.3-rc6 v1.1.3-rc5 v1.1.3-rc4 v1.1.3-rc3 v1.1.3-rc2 v1.1.3-rc1 v1.1.2 v1.1.2-rc4 v1.1.2-rc3 v1.1.2-rc1 v1.1.1 v1.1.1-rc1 v1.1.0 v1.1.0-rc19 v1.1.0-rc18 v1.1.0-rc17 v1.1.0-rc16 v1.1.0-rc15 v1.1.0-rc14 v1.1.0-rc13 v1.1.0-rc12 v1.1.0-rc11 v1.1.0-rc10 v1.1.0-rc9 v1.1.0-rc8 v1.1.0-rc7 v1.1.0-rc6 v1.1.0-rc5 v1.1.0-rc4 v1.1.0-rc3 v1.1.0-rc2 v1.1.0-rc1 v1.0.16 v1.0.16-rc1 v1.0.15 v1.0.15-rc2 v1.0.15-rc1 v1.0.14 v1.0.14-rc2 v1.0.14-rc1 v1.0.13 v1.0.13-rc1 v1.0.12 v1.0.12-rc1 v1.0.11 v1.0.11-rc1 v1.0.10 v1.0.10-rc1 v1.0.9 v1.0.9-rc2 v1.0.9-rc1 v1.0.8 v1.0.7 v1.0.7-rc3 v1.0.7-rc2 v1.0.7-rc1 v1.0.6 v1.0.6-rc4 v1.0.6-rc3 v1.0.6-rc2 v1.0.6-rc1 v1.0.5 v1.0.5-rc1 v1.0.4 v1.0.3 v1.0.2 v1.0.1 v1.0.1-rc5 v1.0.1-rc4 v1.0.1-rc3 v1.0.1-rc2 v1.0.1-rc1 v1.0.0 v1.0.0-rc6 v1.0.0-rc5 v1.0.0-rc4 v1.0.0-rc3 v1.0.0-rc2 v1.0.0-rc1 v0.3.2 v0.3.2-rc3 v0.3.2-rc2 v0.3.2-rc1 v0.3.1 v0.3.1-rc3 v0.3.1-rc2 v0.3.1-rc1 v0.3.0 v0.3.0-rc12 v0.3.0-rc11 v0.3.0-rc10 v0.3.0-rc9 v0.3.0-rc8
No related merge requests found
Showing with 52 additions and 27 deletions
+52 -27
......@@ -173,46 +173,46 @@ func reconcileHost(ctx context.Context, toDeleteHost *hosts.Host, worker, etcd b
}
func reconcileEtcd(ctx context.Context, currentCluster, kubeCluster *Cluster, kubeClient *kubernetes.Clientset, svcOptions *v3.KubernetesServicesOptions) error {
log.Infof(ctx, "[reconcile] Check etcd hosts to be deleted")
etcdToDelete := hosts.GetToDeleteHosts(currentCluster.EtcdHosts, kubeCluster.EtcdHosts, kubeCluster.InactiveHosts, false)
etcdToAdd := hosts.GetToAddHosts(currentCluster.EtcdHosts, kubeCluster.EtcdHosts)
clientCert := cert.EncodeCertPEM(currentCluster.Certificates[pki.KubeNodeCertName].Certificate)
clientKey := cert.EncodePrivateKeyPEM(currentCluster.Certificates[pki.KubeNodeCertName].Key)
// check if the whole etcd plane is replaced
if isEtcdPlaneReplaced(ctx, currentCluster, kubeCluster) {
logrus.Warnf("%v", EtcdPlaneNodesReplacedErr)
return fmt.Errorf("%v", EtcdPlaneNodesReplacedErr)
}
// get tls for the first current etcd host
clientCert := cert.EncodeCertPEM(currentCluster.Certificates[pki.KubeNodeCertName].Certificate)
clientkey := cert.EncodePrivateKeyPEM(currentCluster.Certificates[pki.KubeNodeCertName].Key)
etcdToDelete := hosts.GetToDeleteHosts(currentCluster.EtcdHosts, kubeCluster.EtcdHosts, kubeCluster.InactiveHosts, false)
for _, etcdHost := range etcdToDelete {
etcdHost.IsEtcd = false
if err := services.RemoveEtcdMember(ctx, etcdHost, kubeCluster.EtcdHosts, currentCluster.LocalConnDialerFactory, clientCert, clientkey); err != nil {
log.Warnf(ctx, "[reconcile] %v", err)
continue
}
if err := hosts.DeleteNode(ctx, etcdHost, kubeClient, etcdHost.IsControl || etcdHost.IsWorker, kubeCluster.CloudProvider.Name); err != nil {
log.Warnf(ctx, "Failed to delete etcd node [%s] from cluster: %v", etcdHost.Address, err)
continue
}
// attempting to clean services/files on the host
if err := reconcileHost(ctx, etcdHost, false, true, currentCluster.SystemImages.Alpine, currentCluster.DockerDialerFactory, currentCluster.PrivateRegistriesMap, currentCluster.PrefixPath, currentCluster.Version); err != nil {
log.Warnf(ctx, "[reconcile] Couldn't clean up etcd node [%s]: %v", etcdHost.Address, err)
continue
// check if Node changed its public IP
for i := range etcdToDelete {
for j := range etcdToAdd {
if etcdToDelete[i].InternalAddress == etcdToAdd[j].InternalAddress {
etcdToDelete[i].Address = etcdToAdd[j].Address
}
break
}
}
// handle etcd member delete
if err := deleteEtcdMembers(ctx, currentCluster, kubeCluster, kubeClient, clientCert, clientKey, etcdToDelete); err != nil {
return err
}
// handle etcd member add
return addEtcdMembers(ctx, currentCluster, kubeCluster, kubeClient, svcOptions, clientCert, clientKey, etcdToAdd)
}
func addEtcdMembers(ctx context.Context, currentCluster, kubeCluster *Cluster, kubeClient *kubernetes.Clientset, svcOptions *v3.KubernetesServicesOptions, clientCert, clientKey []byte, etcdToAdd []*hosts.Host) error {
log.Infof(ctx, "[reconcile] Check etcd hosts to be added")
etcdToAdd := hosts.GetToAddHosts(currentCluster.EtcdHosts, kubeCluster.EtcdHosts)
for _, etcdHost := range etcdToAdd {
kubeCluster.UpdateWorkersOnly = false
etcdHost.ToAddEtcdMember = true
}
for _, etcdHost := range etcdToAdd {
// Check if the host already part of the cluster -- this will cover cluster with lost quorum
isEtcdMember, err := services.IsEtcdMember(ctx, etcdHost, kubeCluster.EtcdHosts, currentCluster.LocalConnDialerFactory, clientCert, clientkey)
isEtcdMember, err := services.IsEtcdMember(ctx, etcdHost, kubeCluster.EtcdHosts, currentCluster.LocalConnDialerFactory, clientCert, clientKey)
if err != nil {
return err
}
if !isEtcdMember {
if err := services.AddEtcdMember(ctx, etcdHost, kubeCluster.EtcdHosts, currentCluster.LocalConnDialerFactory, clientCert, clientkey); err != nil {
if err := services.AddEtcdMember(ctx, etcdHost, kubeCluster.EtcdHosts, currentCluster.LocalConnDialerFactory, clientCert, clientKey); err != nil {
return err
}
}
......@@ -225,13 +225,34 @@ func reconcileEtcd(ctx context.Context, currentCluster, kubeCluster *Cluster, ku
}
// this will start the newly added etcd node and make sure it started correctly before restarting other node
// https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/runtime-configuration.md#add-a-new-member
if err := services.ReloadEtcdCluster(ctx, kubeCluster.EtcdReadyHosts, etcdHost, currentCluster.LocalConnDialerFactory, clientCert, clientkey, currentCluster.PrivateRegistriesMap, etcdNodePlanMap, kubeCluster.SystemImages.Alpine); err != nil {
if err := services.ReloadEtcdCluster(ctx, kubeCluster.EtcdReadyHosts, etcdHost, currentCluster.LocalConnDialerFactory, clientCert, clientKey, currentCluster.PrivateRegistriesMap, etcdNodePlanMap, kubeCluster.SystemImages.Alpine); err != nil {
return err
}
}
return nil
}
func deleteEtcdMembers(ctx context.Context, currentCluster, kubeCluster *Cluster, kubeClient *kubernetes.Clientset, clientCert, clientKey []byte, etcdToDelete []*hosts.Host) error {
log.Infof(ctx, "[reconcile] Check etcd hosts to be deleted")
for _, etcdHost := range etcdToDelete {
etcdHost.IsEtcd = false
if err := services.RemoveEtcdMember(ctx, etcdHost, kubeCluster.EtcdHosts, currentCluster.LocalConnDialerFactory, clientCert, clientKey); err != nil {
log.Warnf(ctx, "[reconcile] %v", err)
continue
}
if err := hosts.DeleteNode(ctx, etcdHost, kubeClient, etcdHost.IsControl || etcdHost.IsWorker, kubeCluster.CloudProvider.Name); err != nil {
log.Warnf(ctx, "Failed to delete etcd node [%s] from cluster: %v", etcdHost.Address, err)
continue
}
// attempting to clean services/files on the host
if err := reconcileHost(ctx, etcdHost, false, true, currentCluster.SystemImages.Alpine, currentCluster.DockerDialerFactory, currentCluster.PrivateRegistriesMap, currentCluster.PrefixPath, currentCluster.Version); err != nil {
log.Warnf(ctx, "[reconcile] Couldn't clean up etcd node [%s]: %v", etcdHost.Address, err)
continue
}
}
return nil
}
func syncLabels(ctx context.Context, currentCluster, kubeCluster *Cluster) {
currentHosts := hosts.GetUniqueHostList(currentCluster.EtcdHosts, currentCluster.ControlPlaneHosts, currentCluster.WorkerHosts)
configHosts := hosts.GetUniqueHostList(kubeCluster.EtcdHosts, kubeCluster.ControlPlaneHosts, kubeCluster.WorkerHosts)
......
......@@ -3,11 +3,12 @@ package hosts
import (
"context"
"fmt"
"github.com/rancher/rke/metadata"
"io/ioutil"
"os"
"path/filepath"
"github.com/rancher/rke/metadata"
"net"
"github.com/docker/docker/client"
......@@ -34,7 +35,10 @@ func (h *Host) TunnelUp(ctx context.Context, dialerFactory DialerFactory, cluste
}
// set Docker client
logrus.Debugf("Connecting to Docker API for host [%s]", h.Address)
h.DClient, err = client.NewClient("unix:///var/run/docker.sock", DockerAPIVersion, httpClient, nil)
h.DClient, err = client.NewClientWithOpts(
client.WithHost("unix:///var/run/docker.sock"),
client.WithVersion(DockerAPIVersion),
client.WithHTTPClient(httpClient))
if err != nil {
return fmt.Errorf("Can't initiate NewClient: %v", err)
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment