Încerc să configurez un cluster HA Kubernetes pe Hetzner Cloud acest ghid. Am creat 6 servere, 3 gazde pentru avioane de control și 3 lucrători. Când încerc să folosesc kubeadm pentru a se alătura celui de-al doilea server la cluster, primesc următoarele erori:
Pe k8s-server-1:
06 iulie 14:09:01 k8s-server-1 kubelet[8059]: E0706 14:09:01.430599 8059 controller.go:187] nu a reușit să actualizeze contractul de închiriere, eroare: eroare rpc: cod = Desc necunoscut = termen limită de context depășit
06 iulie 14:08:54 k8s-server-1 kubelet[8059]: E0706 14:08:54.370142 8059 controller.go:187] nu a reușit să actualizeze contractul de închiriere, eroare: eroare rpc: cod = Desc necunoscut = termen limită de context depășit
Iul 06 14:08:51 k8s-server-1 kubelet[8059]: E0706 14:08:51.762075 8059 kubelet_node_status.go:470] „Eroare la actualizarea stării nodului, va reîncerca” err="eroare la obținerea nod-server \"k8 -1\": Obțineți \"https://my.kubernetes.test:6443/api/v1/nodes/k8s-server-1?resourceVersion=0&timeout=10s\": termenul limită de context a depășit"
Iul 06 14:08:47 k8s-server-1 kubelet[8059]: E0706 14:08:47.325309 8059 event.go:273] Imposibil de scris evenimentul: '&v1.Event{TypeMeta:v1.TypeMeta:"{Kind:" , APIVersion:""}, ObjectMeta:v1.ObjectMeta{Nume:"kube-apiserver-k8s-server-1.168f32516b37209a", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"" , ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1. Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Adnotări:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizatori :[]string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"kube- apiserver-k8s-server-1", UID:"10b8928a4f8e5e0b449a40ab35a3efdc", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers{kube-apiserver}"}, Reason:"Unhealthyness", Mesaj:"Nesănătos", probe failed: HTTP probe fai led cu statuscode: 500", Sursă:v1.EventSource{Component:"kubelet", Gazdă:"k8s-server-1"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd0ee49429a, ext:115787424848, loc:(*time.Locație)(0x74c3600)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd16f1a0a1d, ext:117801107410, loc:(*time.Location)(0x74c3600:)}, Count:)} 2, Tip: „Avertisment”, EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries) (nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': „Correcție „https://my.kubernetes.test:6443/api/ v1/namespaces/kube-system/events/kube-apiserver-k8s-server-1.168f32516b37209a": citiți tcp 192.168.178.2:60934->192.168.178.8:64443 după reînchiderea conexiunii la rețea:"
06 iulie 14:08:47 k8s-server-1 kubelet[8059]: E0706 14:08:47.324053 8059 controller.go:187] nu a reușit să actualizeze contractul de închiriere, eroare: eroare rpc: cod = Desc necunoscut = termen limită de context depășit
Iul 06 14:08:46 k8s-server-1 kubelet[8059]: I0706 14:08:46.986663 8059 status_manager.go:566] „Nu s-a putut obține starea pentru pod” podUID=10b8928a4f8e59ae40b44598928a4f8e59a40db4459a4f8b8928a46.986663 apiserver-k8s-server-1" error="etcdserver: cererea a expirat"
Pe k8s-server-2:
Iul 06 14:09:04 k8s-server-2 kubelet[6685]: E0706 14:09:04.072247 6685 event.go:264] Serverul a respins evenimentul „&v1.Event{TypeMeta:v1.TypeMeta{Version API:” :""}, ObjectMeta:v1.ObjectMeta{Name:"weave-net-9fldg.168f3252093de42e", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion:"" , Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil) , DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string( nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"weave-net-9fldg", UID:"88743b7a-aa81-4948-be9b-78c4bbf436fe", APIVersion:"v1", ResourceVersion:"714", FieldPath:"spec.initContainers{weave-init}"}, Reason:"Pulled", Message:"Succesfully imagine trasă \"docker.io/weaveworks/weave-kube :2.8.1\" în 6.525660057s", Source:v1.EventSource{Component:"kubelet", Host:"k8s-server-2"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd1997fa82e, ext:11173601176, loc:(*time.Location)(0x74c3600)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd1997fa82e, ext:11173601176, loc:(*time.Location)74}6) }, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(* v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': 'eroare rpc: cod = Desc necunoscut = termen limită de context depăşit' (nu voi reîncerca!)
06 iulie 14:08:57 k8s-server-2 kubelet[6685]: E0706 14:08:57.993540 6685 controller.go:144] nu a reușit să se asigure că există contractul de închiriere, va încerca din nou în 400 ms, eroare: Obțineți „https://my .kubernetes.test:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/k8s-server-2?timeout=10s": termenul limită a contextului a fost depășit
Iul 06 14:08:57 k8s-server-2 kubelet[6685]: I0706 14:08:57.352989 6685 scope.go:111] "RemoveContainer" containerID="9e05ad27088c41bdd02f1960f062bd060f0520000000000000000000000
Iul 06 14:08:56 k8s-server-2 kubelet[6685]: E0706 14:08:56.992481 6685 event.go:273] Imposibil de scris evenimentul: '&v1.Event{TypeMeta:v1.TypeMeta:"{Kind:" , APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"weave-net-9fldg.168f3252093de42e", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion: „”, Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)( nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[] șir(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"weave-net-9fldg ", UID:"88743b7a-aa81-4948-be9b-78c4bbf436fe", APIVersion:"v1", ResourceVersion:"714", FieldPath:"spec.initContainers{weave-init}"}, Reason:"Pulled", Mesaj: „Imaginea extrasă cu succes \”docker.io/weaveworks/weave-kub e:2.8.1\" în 6.525660057s", Source:v1.EventSource{Component:"kubelet", Host:"k8s-server-2"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd1997fa82e , ext:11173601176, loc:(*time.Location)(0x74c3600)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd1997fa82e, ext:11173601176, loc:)(*6004Location) }}, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:( *v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': „Postează „https://my.kubernetes.test :6443/api/v1/namespaces/kube-system/events": citiți tcp 192.168.178.3:47722->192.168.178.8:6443: folosirea conexiunii de rețea închisă" (poate reîncerca după repaus)
Iul 06 14:08:56 k8s-server-2 kubelet[6685]: E0706 14:08:56.990109 6685 kubelet_node_status.go:470] „Eroare la actualizarea stării nodului, va reîncerca” err="eroare la obținerea nod-server \"k8 -2\": Obțineți \"https://my.kubernetes.test:6443/api/v1/nodes/k8s-server-2?timeout=10s\": net/http: cererea anulată (Client.Timeout depășit în timp ce în așteptarea antetelor)"
Iul 06 14:08:56 k8s-server-2 kubelet[6685]: I0706 14:08:56.989160 6685 scope.go:111] "RemoveContainer" containerID="9e05ad27088c41bdd02f1160f062bd0460f02bd060f02f080f0000000001
Jul 06 14:08:56 k8s-server-2 kubelet[6685]: E0706 14:08:56.988865 6685 kubelet.go:1683] „Crearea unui pod oglindă pentru” err="Postează \"https://my. kubernetes.test:6443/api/v1/namespaces/kube-system/pods\": citiți tcp 192.168.178.3:47722->192.168.178.8:6443: utilizarea conexiunii de rețea închisă" pod="kube-system/etcd- k8s-server-2"
Iul 06 14:08:54 k8s-server-2 kubelet[6685]: E0706 14:08:54.210098 6685 pod_workers.go:190] „Eroare de sincronizare a podului, sărirea peste” err="Nu a reușit să \"StartContainer\" pentru \" etcd\" cu CrashLoopBackOff: \"back-off 10s reporting failed container=etcd pod=etcd-k8s-server-2_kube-system(22b3a914daf1bef98cb01ddd7868523d)\"" pod="kube-system/etcd-28-pod-server-28 =22b3a914daf1bef98cb01ddd7868523d
Iul 06 14:08:54 k8s-server-2 kubelet[6685]: I0706 14:08:54.208472 6685 scope.go:111] "RemoveContainer" containerID="9e05ad27088c41bdd02f1160f0654160f0520080000000000000000000000
Jul 06 14:08:54 k8s-server-2 kubelet[6685]: E0706 14:08:54.208199 6685 kubelet.go:1683] „Eșuat la crearea unui pod oglindă pentru” err="eroare rpc: cod = Desc necunoscut = context termen limită depășit" pod="kube-system/etcd-k8s-server-2"
Iul 06 14:08:53 k8s-server-2 kubelet[6685]: E0706 14:08:53.347043 6685 event.go:264] Serverul a respins evenimentul „&v1.Event{TypeMeta:v1.TypeMeta{Version API:” :""}, ObjectMeta:v1.ObjectMeta{Nume:"kube-proxy-2z5js.168f3250c7fc2120", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion:"" , Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil) , DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string( nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"kube-proxy-2z5js", UID:"0ac8fe5d-7332-4a4d-abee-48c6d4dee38f", APIVersion:"v1", ResourceVersion:"711", FieldPath:"spec.containers{kube-proxy}"}, Reason:"Started", Mesaj:"Started container kube-proxy", Sursa:v1.EventSource{Compone nt:"kubelet", Gazdă:"k8s-server-2"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd04243d720, ext:5783805064, loc:(*time.Location)(0x74c3600)}} , LastTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd04243d720, ext:5783805064, loc:(*time.Location)(0x74c3600)}}, Count:1, Type:"Normal", EventTime:v1.MicroTime {Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries)(nil), Action:"", Înrudit:(* v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': „eroare rpc: cod = Desc necunoscut = termen limită de context depășit” (nu se va reîncerca!)
Iul 06 14:08:53 k8s-server-2 kubelet[6685]: I0706 14:08:53.269542 6685 scope.go:111] "RemoveContainer" containerID="e2664d16d53ff5ae6de917ae517716ae5177176ae52708778001
Iul 06 14:08:47 k8s-server-2 kubelet[6685]: I0706 14:08:47.194425 6685 scope.go:111] "RemoveContainer" containerID="7aaa63419740b5e30ccbd486bd46bd48bd48bd48bfd4bd48bd4b4bd4b4bd4b4bd4b4bd4b4bd4bd4bd4bd4bd4bd4bd4d4bd
Iul 06 14:08:46 k8s-server-2 kubelet[6685]: I0706 14:08:46.987598 6685 status_manager.go:566] „Nu s-a putut obține starea pentru pod” podUID=778e041efc75c75c19bbd5/podc75c75c19bbd5/bcbd5/46.987598 controller-manager-k8s-server-2" error="etcdserver: cererea a expirat"
06 iulie 14:08:46 k8s-server-2 kubelet[6685]: E0706 14:08:46.986807 6685 controller.go:144] nu a reușit să se asigure că există contractul de închiriere, va reîncerca în 200 ms, eroare: etcdserver: cererea expirată
Iul 06 14:08:46 k8s-server-2 kubelet[6685]: E0706 14:08:46.986800 6685 kubelet_node_status.go:470] „Eroare la actualizarea stării nodului, va reîncerca” err="eroare la obținerea nod-server \"k8 -2\": etcdserver: cererea a expirat"
Lista de servere:
| Nume | IP public | IP privat |
| --- | --- | --- |
| k8s-server-1 | 192.168.178.2 | 10.23.1.2 |
| k8s-server-2 | 192.168.178.3 | 10.23.1.3 |
| k8s-server-3 | 192.168.178.4 | 10.23.1.4 |
| k8s-lucrător-1 | 192.168.178.5 | 10.23.1.5 |
| k8s-lucrător-2 | 192.168.178.6 | 10.23.1.6 |
| k8s-lucrător-3 | 192.168.178.7 | 10.23.1.7 |
În plus, k8s-server-* au următoarele reguli de firewall aplicate (se aplică numai traficului direcționat prin IP public, nu în interiorul rețelei private):
| Direcție | Port | Sursa/Destinație |
| --- | --- | --- |
| Intrare | 80 | orice |
| Intrare | 443 | orice |
| Intrare | 22 | IP static al companiei |
| Intrare | 6443 | IP static al companiei |
| Ieșire | orice | orice |
Există un echilibrator de încărcare în interiorul aceleiași rețele care direcționează traficul către k8s-server-1. IP-ul public este 192.168.178.8, iar IP-ul privat este 10.23.1.8.
Ce am rulat pe ambele noduri:
apt-get update
apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stabil" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
systemctl enable docker.service
systemctl enable containerd.service
pisica <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "fișier-json",
„log-opts”: {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl enable docker
systemctl daemon-reload
systemctl reporniți docker
pisica <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
pisica <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo „deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main” | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
... pe serverul 1:
imaginile de configurare kubeadm pull
kubeadm init --apiserver-advertise-address=10.23.1.2 --control-plane-endpoint "my.kubernetes.test:6443" --upload-certs
mkdir ~/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config
kubectl aplică -f "https://cloud.weave.works/k8s/net?k8s-version=$(versiunea kubectl | base64 | tr -d '\n')"
uitați-vă la kubectl obține pod -n kube-system
uitați-vă la kubectl obține noduri
... pe serverul 2:
imaginile de configurare kubeadm pull
kubeadm alăturați-vă la my.kubernetes.test:6443 --token XXXXX.XXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXX --control-plane --certificate-key XXXXXXXXXX