ฉันกำลังพยายามตั้งค่าคลัสเตอร์ HA Kubernetes บน Hetzner Cloud ดังต่อไปนี้ นี้ แนะนำ. ฉันได้สร้างเซิร์ฟเวอร์ 6 เครื่อง โฮสต์ควบคุม 3 เครื่อง และพนักงาน 3 คน เมื่อพยายามใช้ kubeadm เพื่อเข้าร่วมเซิร์ฟเวอร์ที่สองกับคลัสเตอร์ ฉันได้รับข้อผิดพลาดต่อไปนี้:
บน k8s-server-1:
06 ก.ค. 14:09:01 k8s-server-1 kubelet[8059]: E0706 14:09:01.430599 8059 controller.go:187] ล้มเหลวในการอัปเดตสัญญาเช่า ข้อผิดพลาด: ข้อผิดพลาด rpc: รหัส = ไม่รู้จัก desc = เกินกำหนดเวลาบริบท
06 ก.ค. 14:08:54 k8s-server-1 kubelet[8059]: E0706 14:08:54.370142 8059 controller.go:187] ล้มเหลวในการอัปเดตสัญญาเช่า ข้อผิดพลาด: ข้อผิดพลาด rpc: รหัส = ไม่รู้จัก desc = เกินกำหนดเวลาบริบท
06 ก.ค. 14:08:51 k8s-server-1 kubelet[8059]: E0706 14:08:51.762075 8059 kubelet_node_status.go:470] "ข้อผิดพลาดในการอัปเดตสถานะโหนด จะลองอีกครั้ง" err="ข้อผิดพลาดในการรับโหนด \"k8s-server -1\": รับ \"https://my.kubernetes.test:6443/api/v1/nodes/k8s-server-1?resourceVersion=0&timeout=10s\": เกินกำหนดเวลาบริบท"
06 ก.ค. 14:08:47 k8s-server-1 kubelet[8059]: E0706 14:08:47.325309 8059 event.go:273] ไม่สามารถเขียนเหตุการณ์: '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"" , APIVersion:""}, ObjectMeta:v1.ObjectMeta{ชื่อ:"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. เวลา)(ศูนย์), DeletionGracePeriodSeconds:(*int64)(ศูนย์), 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", ชื่อ:"kube- apiserver-k8s-server-1", UID:"10b8928a4f8e5e0b449a40ab35a3efdc", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers{kube-apiserver}"}, เหตุผล:"Unhealthy", ข้อความ:"Readiness โพรบล้มเหลว: โพรบ HTTP ล้มเหลว นำด้วยรหัสสถานะ: 500", Source:v1.EventSource{Component:"kubelet", Host:"k8s-server-1"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd0ee49429a, ext:115787424848, loc:(*time.Location)(0x74c3600)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xc0312fd16f1a0a1d, ext:117801107410, loc:(*time.Location)(0x74c3600)}} จำนวน: 2, ประเภท:"คำเตือน", EventTime:v1.MicroTime{เวลา:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries) (ศูนย์), การดำเนินการ:"", ที่เกี่ยวข้อง:(*v1.ObjectReference)(ไม่มี), ReportingController:"", ReportingInstance:""}': 'Patch "https://my.kubernetes.test:6443/api/ v1/namespaces/kube-system/events/kube-apiserver-k8s-server-1.168f32516b37209a": read tcp 192.168.178.2:60934->192.168.178.8:6443: use of closed network connection'(อาจลองอีกครั้งหลังจากเข้าสู่โหมดสลีป)
06 ก.ค. 14:08:47 k8s-server-1 kubelet[8059]: E0706 14:08:47.324053 8059 controller.go:187] ล้มเหลวในการอัปเดตสัญญาเช่า ข้อผิดพลาด: ข้อผิดพลาด rpc: รหัส = ไม่รู้จัก desc = เกินกำหนดเวลาบริบท
06 ก.ค. 14:08:46 k8s-server-1 kubelet[8059]: I0706 14:08:46.986663 8059 status_manager.go:566] "ไม่สามารถรับสถานะสำหรับพ็อด" podUID=10b8928a4f8e5e0b449a40ab35a3efdc pod="kube-system/kube- apiserver-k8s-server-1" error="etcdserver: คำขอหมดเวลา"
บน k8s-server-2:
6 กรกฎาคม 14:09:04 k8s-server-2 kubelet[6685]: E0706 14:09:04.072247 6685 event.go:264] เซิร์ฟเวอร์ปฏิเสธเหตุการณ์ '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion :""}, ObjectMeta:v1.ObjectMeta{ชื่อ:"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)(ไม่มี) , DeletionGracePeriodSeconds:(*int64)(ไม่มี), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string( ไม่มี), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", ชื่อ:"weave-net-9fldg", UID:"88743b7a-aa81-4948-be9b-78c4bbf436fe", APIVersion:"v1", ResourceVersion:"714", FieldPath:"spec.initContainers{weave-init}"}, เหตุผล:"ดึง", ข้อความ:"สำเร็จ ดึงภาพ \"docker.io/weaveworks/weave-kube :2.8.1\" ใน 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)(0x74c3600)} }, จำนวน:1, ประเภท:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(* v1.EventSeries)(ไม่มี), การดำเนินการ:"", ที่เกี่ยวข้อง:(*v1.ObjectReference)(ไม่มี), ReportingController:"", ReportingInstance:""}': 'ข้อผิดพลาด rpc: รหัส = ไม่รู้จัก desc = เกินกำหนดเวลาของบริบท' (จะไม่ลองใหม่!)
06 ก.ค. 14:08:57 k8s-server-2 kubelet[6685]: E0706 14:08:57.993540 6685 controller.go:144] ล้มเหลวในการตรวจสอบการเช่าที่มีอยู่ จะลองอีกครั้งใน 400ms ข้อผิดพลาด: รับ "https://my .kubernetes.test:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/lease/k8s-server-2?timeout=10s": เกินกำหนดเวลาบริบท
06 ก.ค. 14:08:57 k8s-server-2 kubelet[6685]: I0706 14:08:57.352989 6685 scope.go:111] "RemoveContainer" containerID="9e05ad27088c41bdd02bd0d32a16706fc6eab6e458031f0714c9a8f2f2f2f2f2f2f2f2f2f6eab6e458031f0714c9a851f2f2f2f2f2f2f2f
06 ก.ค. 14:08:56 k8s-server-2 kubelet[6685]: E0706 14:08:56.992481 6685 event.go:273] ไม่สามารถเขียนเหตุการณ์: '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"" , APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"weave-net-9fldg.168f3252093de42e", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion: "", รุ่น:0, CreationTimestamp:v1.Time{เวลา:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)( ไม่มี), DeletionGracePeriodSeconds:(*int64)(ไม่มี), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[] สตริง (ศูนย์), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry (ไม่มี)}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", ชื่อ:"weave-net-9fldg ", UID:"88743b7a-aa81-4948-be9b-78c4bbf436fe", APIVersion:"v1", ResourceVersion:"714", FieldPath:"spec.initContainers{weave-init}"}, เหตุผล:"Pulled", ข้อความ: "ดึงอิมเมจ \"docker.io/weaveworks/weave-kub สำเร็จแล้ว e:2.8.1\" ใน 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)(0x74c3600) }}, จำนวน:1, ประเภท:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:( *v1.EventSeries)(ศูนย์), การดำเนินการ:"", ที่เกี่ยวข้อง:(*v1.ObjectReference)(ศูนย์), ReportingController:"", ReportingInstance:""}': 'โพสต์ "https://my.kubernetes.test :6443/api/v1/namespaces/kube-system/events": read tcp 192.168.178.3:47722->192.168.178.8:6443: use of closed network connection'(อาจลองอีกครั้งหลังจากเข้าสู่โหมดสลีป)
06 ก.ค. 14:08:56 k8s-server-2 kubelet[6685]: E0706 14:08:56.990109 6685 kubelet_node_status.go:470] "เกิดข้อผิดพลาดในการอัปเดตสถานะโหนด จะลองอีกครั้ง" err="ข้อผิดพลาดในการรับโหนด \"k8s-server -2\": รับ \"https://my.kubernetes.test:6443/api/v1/nodes/k8s-server-2?timeout=10s\": net/http: คำขอถูกยกเลิก (Client.Timeout เกินในขณะที่ รอส่วนหัว)"
06 ก.ค. 14:08:56 k8s-server-2 kubelet[6685]: I0706 14:08:56.989160 6685 scope.go:111] "RemoveContainer" containerID="9e05ad27088c41bdd02bd0d32a16706fc6eab6e458031f0714c9a82f2f2f2f2f2f2f2f2f2a
06 ก.ค. 14:08:56 k8s-server-2 kubelet[6685]: E0706 14:08:56.988865 6685 kubelet.go:1683] "สร้างมิเรอร์พ็อดสำหรับ" err="Post \"https://my. kubernetes.test:6443/api/v1/namespaces/kube-system/pods\": อ่าน tcp 192.168.178.3:47722->192.168.178.8:6443: ใช้การเชื่อมต่อเครือข่ายแบบปิด" pod="kube-system/etcd- k8s-เซิร์ฟเวอร์-2"
06 ก.ค. 14:08:54 k8s-server-2 kubelet[6685]: E0706 14:08:54.210098 6685 pod_workers.go:190] "ข้อผิดพลาดในการซิงค์พ็อด การข้าม" err="ล้มเหลวในการ \"StartContainer\" สำหรับ \" etcd\" กับ CrashLoopBackOff: \"back-off 10s การรีสตาร์ทคอนเทนเนอร์ล้มเหลว = etcd pod=etcd-k8s-server-2_kube-system(22b3a914daf1bef98cb01ddd7868523d)\"" pod="kube-system/etcd-k8s-server-2" podUID =22b3a914daf1bef98cb01ddd7868523d
06 ก.ค. 14:08:54 k8s-server-2 kubelet[6685]: I0706 14:08:54.208472 6685 scope.go:111] "RemoveContainer" containerID="9e05ad27088c41bdd02bd0d32a16706fc6eab6e458031f5714c9a8f2f2f2f2f2f2f2f2f2f6eab6e458031f0714c9a8f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f
06 ก.ค. 14:08:54 k8s-server-2 kubelet[6685]: E0706 14:08:54.208199 6685 kubelet.go:1683] "สร้างมิเรอร์พ็อดล้มเหลวสำหรับ" err="rpc error: code = Unknown desc = context เกินกำหนดเวลา" pod="kube-system/etcd-k8s-server-2"
06 ก.ค. 14:08:53 k8s-server-2 kubelet[6685]: E0706 14:08:53.347043 6685 event.go:264] เซิร์ฟเวอร์ปฏิเสธเหตุการณ์ '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion :""}, ObjectMeta:v1.ObjectMeta{ชื่อ:"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)(ไม่มี) , DeletionGracePeriodSeconds:(*int64)(ไม่มี), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string( ไม่มี), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{ชนิด:"Pod", Namespace:"kube-system", ชื่อ:"kube-proxy-2z5js", UID:"0ac8fe5d-7332-4a4d-abee-48c6d4dee38f", APIVersion:"v1", ResourceVersion:"711", FieldPath:"spec.containers{kube-proxy}"}, เหตุผล:"Started", ข้อความ:"Started คอนเทนเนอร์ kube-proxy", แหล่งที่มา:v1.EventSource{Compone nt:"kubelet", โฮสต์:"k8s-server-2"}, FirstTimestamp:v1.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:"", ที่เกี่ยวข้อง:(* v1.ObjectReference)(ศูนย์), ReportingController:"", ReportingInstance:""}': 'ข้อผิดพลาด rpc: รหัส = Unknown desc = เกินกำหนดเวลาบริบท' (จะไม่ลองใหม่!)
06 ก.ค. 14:08:53 k8s-server-2 kubelet[6685]: I0706 14:08:53.269542 6685 scope.go:111] "RemoveContainer" containerID="e2664d16d53ff5ae6de27fe52e84651791bca1ca70a6987c3a4e3e78ea78ea"
06 ก.ค. 14:08:47 k8s-server-2 kubelet[6685]: I0706 14:08:47.194425 6685 scope.go:111] "RemoveContainer" containerID="7aaa63419740b5e30cc76770abc92dfbabe1f48d4d812b4abc39168d1f1e"
06 ก.ค. 14:08:46 k8s-server-2 kubelet[6685]: I0706 14:08:46.987598 6685 status_manager.go:566] "ไม่สามารถรับสถานะสำหรับพ็อด" podUID=778e041efc75c1983cbb59f2b3d46d09 pod="kube-system/kube- controller-manager-k8s-server-2" error="etcdserver: คำขอหมดเวลา"
06 ก.ค. 14:08:46 k8s-server-2 kubelet[6685]: E0706 14:08:46.986807 6685 controller.go:144] ล้มเหลวในการตรวจสอบการเช่าที่มีอยู่ จะลองอีกครั้งใน 200ms ข้อผิดพลาด: etcdserver: คำขอหมดเวลา
06 ก.ค. 14:08:46 k8s-server-2 kubelet[6685]: E0706 14:08:46.986800 6685 kubelet_node_status.go:470] "ข้อผิดพลาดในการอัปเดตสถานะโหนด จะลองอีกครั้ง" err="ข้อผิดพลาดในการรับโหนด \"k8s-server -2\": etcdserver: คำขอหมดเวลา"
รายชื่อเซิร์ฟเวอร์:
| ชื่อ | IP สาธารณะ | IP ส่วนตัว |
| --- | --- | --- |
| k8s-เซิร์ฟเวอร์-1 | 192.168.178.2 | 10.23.1.2 |
| k8s-เซิร์ฟเวอร์-2 | 192.168.178.3 | 10.23.1.3 |
| k8s-เซิร์ฟเวอร์-3 | 192.168.178.4 | 10.23.1.4 |
| k8s-คนงาน-1 | 192.168.178.5 | 10.23.1.5 |
| k8s-คนงาน-2 | 192.168.178.6 | 10.23.1.6 |
| k8s-คนงาน-3 | 192.168.178.7 | 10.23.1.7 |
นอกจากนี้ k8s-server-* ยังมีกฎไฟร์วอลล์ต่อไปนี้ที่ใช้กับกฎเหล่านี้ (ใช้กับการรับส่งข้อมูลที่กำหนดเส้นทางผ่าน IP สาธารณะเท่านั้น ไม่ใช่ภายในเครือข่ายส่วนตัว):
| ทิศทาง | พอร์ต | ที่มา/ปลายทาง |
| --- | --- | --- |
| ขาเข้า | 80 | ใด ๆ |
| ขาเข้า | 443 | ใด ๆ |
| ขาเข้า | 22 | IP บริษัทคงที่ |
| ขาเข้า | 6443 | IP บริษัทคงที่ |
| ขาออก | ใด ๆ | ใด ๆ |
มีโหลดบาลานเซอร์ภายในเครือข่ายเดียวกันซึ่งกำหนดเส้นทางการรับส่งข้อมูลไปยัง k8s-server-1 IP สาธารณะคือ 192.168.178.8 และ IP ส่วนตัวคือ 10.23.1.8
สิ่งที่ฉันวิ่งบนทั้งสองโหนด:
apt-รับการปรับปรุง
apt-get ติดตั้ง 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 ลงนามโดย=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) เสถียร" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-รับการปรับปรุง
apt-get ติดตั้ง docker-ce docker-ce-cli containerd.io
systemctl เปิดใช้งาน docker.service
systemctl เปิดใช้งาน containerd.service
แมว <<EOF | sudo ที /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "ไฟล์ json",
"ตัวเลือกการบันทึก": {
"ขนาดสูงสุด": "100m"
},
"ไดรเวอร์สตอเรจ": "overlay2"
}
อฟ
systemctl เปิดใช้งานนักเทียบท่า
systemctl daemon-โหลดซ้ำ
systemctl รีสตาร์ทนักเทียบท่า
แมว <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
อฟ
แมว <<EOF | sudo ที /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
อฟ
sysctl -- ระบบ
apt-รับการปรับปรุง
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 [ลงนามโดย=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo ที /etc/apt/sources.list.d/kubernetes.list
apt-รับการปรับปรุง
apt-get install -y kubelet kubeadm kubectl
apt-mark ถือ kubelet kubeadm kubectl
... บนเซิร์ฟเวอร์ 1:
ดึงอิมเมจการกำหนดค่า kubeadm
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 ใช้ -f "https://cloud.weave.works/k8s/net?k8s-version=$(เวอร์ชัน kubectl | base64 | tr -d '\n')"
ดู kubectl รับ pod -n kube-system
ดู kubectl รับโหนด
... บนเซิร์ฟเวอร์ 2:
ดึงอิมเมจการกำหนดค่า kubeadm
kubeadm เข้าร่วม my.kubernetes.test:6443 --token XXXXX.XXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXX --control-plane --certificate-key XXXXXXXXXX