Score:2

kube-proxy ไม่ทำงานสำหรับ IP ของคลัสเตอร์บริการ

ธง es

ฉันติดตั้งคลัสเตอร์ k8s 1.23.3 บน raspberry pi สี่ตัวที่กำลังรัน raspberrypi OS 11 (บูลส์อาย) แขน64; โดยส่วนใหญ่ติดตาม คู่มือนี้.
สาระสำคัญของมันคือระนาบควบคุมถูกสร้างขึ้นโดยใช้คำสั่งนี้

kubeadm init --token={some_token} --kubernetes-version=v1.23.3 --pod-network-cidr=10.1.0.0/16 --service-cidr=10.11.0.0/16 --control-plane-endpoint= 10.0.4.16 --node-name=rpi-1-1

จากนั้นฉันก็สร้างของฉันเอง ตรวจสอบ kube เนมสเปซ วางการปรับใช้ของ echo-เซิร์ฟเวอร์ เข้าไปและสร้างบริการสำหรับมัน

อย่างไรก็ตาม, ฉันไม่สามารถเข้าถึง IP คลัสเตอร์ของบริการจากโหนดใดๆ ทำไม คำขอหมดเวลาในขณะที่คำขอไปยัง IP คลัสเตอร์ของพ็อดทำงานได้ดี
ฉันสงสัยว่าของฉัน kube-พร็อกซี ไม่ทำงานเท่าที่ควร ด้านล่างนี้คือสิ่งที่ฉันตรวจสอบจนถึงตอนนี้

$ kubectl รับบริการ -n kube-verify -o=wide

ประเภทชื่อ CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
echo-server ClusterIP 10.11.213.180 <ไม่มี> 8080/TCP 24h app=echo-server
$ kubectl รับพ็อด -n kube-system -o=wide

ชื่อ พร้อม สถานะ เริ่มใหม่ อายุ IP โหนด โหนดที่ได้รับการเสนอชื่อ เกตส์ความพร้อม
coredns-64897985d-47gpr 1/1 วิ่ง 1 (69m มาแล้ว) 41h 10.1.0.5 rpi-1-1 <ไม่มี> <ไม่มี>
coredns-64897985d-nf55w 1/1 Running 1 (69m ago) 41h 10.1.0.4 rpi-1-1 <ไม่มี> <ไม่มี>
etcd-rpi-1-1 1/1 Running 2 (69m ago) 41h 10.0.4.16 rpi-1-1 <ไม่มี> <ไม่มี>
kube-apiserver-rpi-1-1 1/1 วิ่ง 2 (69m ที่แล้ว) 41h 10.0.4.16 rpi-1-1 <ไม่มี> <ไม่มี>
kube-controller-manager-rpi-1-1 1/1 Running 2 (69m ago) 41h 10.0.4.16 rpi-1-1 <ไม่มี> <ไม่มี>
kube-flannel-ds-5467m 1/1 Running 1 (69m ago) 28h 10.0.4.17 rpi-1-2 <ไม่มี> <ไม่มี>
kube-flannel-ds-7wpvz 1/1 Running 1 (69m ago) 28h 10.0.4.18 rpi-1-3 <ไม่มี> <ไม่มี>
kube-flannel-ds-9chxk 1/1 Running 1 (69m ago) 28h 10.0.4.19 rpi-1-4 <ไม่มี> <ไม่มี>
kube-flannel-ds-x5rvx 1/1 วิ่ง 1 (69m ที่แล้ว) 29h 10.0.4.16 rpi-1-1 <ไม่มี> <ไม่มี>
kube-proxy-8bbjn 1/1 กำลังดำเนินการ 1 (69m ที่แล้ว) 28h 10.0.4.17 rpi-1-2 <ไม่มี> <ไม่มี>
kube-proxy-dw45d 1/1 กำลังทำงาน 1 (69m ที่แล้ว) 28h 10.0.4.18 rpi-1-3 <ไม่มี> <ไม่มี>
kube-proxy-gkkxq 1/1 กำลังทำงาน 2 (69m ที่แล้ว) 41h 10.0.4.16 rpi-1-1 <ไม่มี> <ไม่มี>
kube-proxy-ntl5w 1/1 กำลังทำงาน 1 (69m ที่แล้ว) 28h 10.0.4.19 rpi-1-4 <ไม่มี> <ไม่มี>
kube-scheduler-rpi-1-1 1/1 วิ่ง 2 (69m ที่แล้ว) 41h 10.0.4.16 rpi-1-1 <ไม่มี> <ไม่มี>
$ kubectl บันทึก kube-proxy-gkkxq -n kube-system

I0220 13:52:02.281289 1 node.go:163] ดึงข้อมูลโหนด IP สำเร็จ: 10.0.4.16
I0220 13:52:02.281535 1 server_others.go:138] "ตรวจพบโหนด IP" address="10.0.4.16"
I0220 13:52:02.281610 1 server_others.go:561] "โหมดพร็อกซีที่ไม่รู้จัก สมมติว่าเป็นพร็อกซี iptables" proxyMode=""
I0220 13:52:02.604880 1 server_others.go:206] "ใช้ iptables Proxier"
I0220 13:52:02.604966 1 server_others.go:213] "kube-proxy ทำงานในโหมด dual-stack" ipFamily=IPv4
I0220 13:52:02.605026 1 server_others.go:214] "กำลังสร้าง dualStackProxier สำหรับ iptables"
I0220 13:52:02.605151 1 server_others.go:491] "Detect-local-mode ตั้งค่าเป็น ClusterCIDR แต่ไม่มีการกำหนด CIDR ของคลัสเตอร์ IPv6 ค่าเริ่มต้นเป็น no-op detection-local สำหรับ IPv6"
I0220 13:52:02.606905 1 server.go:656] "ข้อมูลเวอร์ชัน" version="v1.23.3"
W0220 13:52:02.614777 1 sysinfo.go:203] โทโพโลยีของโหนดไม่พร้อมใช้งาน โดยให้โทโพโลยี CPU
I0220 13:52:02.619535 1 conntrack.go:52] "การตั้งค่า nf_conntrack_max" nf_conntrack_max=131072
I0220 13:52:02.620869 1 conntrack.go:100] "ตั้งค่า sysctl" รายการ="net/netfilter/nf_conntrack_tcp_timeout_close_wait" ค่า=3600
I0220 13:52:02.660947 1 config.go:317] "กำลังเริ่มต้นตัวควบคุมการกำหนดค่าบริการ"
I0220 13:52:02.661015 1 shared_informer.go:240] กำลังรอแคชซิงค์สำหรับการกำหนดค่าบริการ
I0220 13:52:02.662669 1 config.go:226] "การเริ่มต้นตัวควบคุมการกำหนดค่าส่วนปลาย"
I0220 13:52:02.662726 1 shared_informer.go:240] กำลังรอแคชเพื่อซิงค์สำหรับการกำหนดค่าส่วนปลาย
I0220 13:52:02.762734 1 shared_informer.go:247] มีการซิงค์แคชสำหรับการกำหนดค่าบริการ 
I0220 13:52:02.762834 1 shared_informer.go:247] มีการซิงค์แคชสำหรับการกำหนดค่าส่วนปลาย

สิ่งที่ฉันสังเกตเห็นนี่คือว่า โทโพโลยีของโหนดไม่พร้อมใช้งานดังนั้นฉันจึงเจาะลึกการกำหนดค่า kube-proxy เพิ่มเติม แต่ไม่มีอะไรโดดเด่นสำหรับฉัน
หากมีปัญหากับโทโพโลยีของโหนดในคลัสเตอร์ของฉัน โปรดแนะนำแหล่งข้อมูลบางอย่างเกี่ยวกับวิธีแก้ปัญหานี้ให้ฉัน เนื่องจากฉันไม่พบสิ่งที่มีความหมายจากข้อความแสดงข้อผิดพลาดนี้

$ kubectl อธิบาย configmap kube-proxy -n kube-system

ชื่อ: kube-proxy
เนมสเปซ: ระบบ kube
ป้ายกำกับ: app=kube-proxy
คำอธิบายประกอบ: kubeadm.kubernetes.io/component-config.hash: sha256:edce433d45f2ed3a58ee400690184ad033594e8275fdbf52e9c8c852caa7124d

ข้อมูล
====
config.conf:
----
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
bindAddressHardFail: เท็จ
การเชื่อมต่อลูกค้า:
  ยอมรับเนื้อหาประเภท: ""
  ระเบิด: 0
  ชนิดของเนื้อหา: ""
  kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
  qps: 0
คลัสเตอร์CIDR: 10.1.0.0/16
configSyncPeriod: 0 วินาที
คอนแทร็ก:
  maxPerCore: null
  นาที: เป็นโมฆะ
  tcpCloseWaitTimeout: null
  tcpEstablishedTimeout: null
ตรวจจับโหมดท้องถิ่น: ""
enableProfiling: เท็จ
healthzBindAddress: ""
ชื่อโฮสต์โอเวอร์ไรด์: ""
iptables:
  สวมหน้ากากทั้งหมด: เท็จ
  มาสเคอเรดบิต: null
  minSyncPeriod: 0 วินาที
  ระยะเวลาซิงค์: 0 วินาที
IPV:
  ไม่รวม CIDRs: null
  minSyncPeriod: 0 วินาที
  กำหนดการ: ""
  ARRP ที่เข้มงวด: เท็จ
  ระยะเวลาซิงค์: 0 วินาที
  tcpFinTimeout: 0 วินาที
  tcpTimeout: 0 วินาที
  udpTimeout: 0 วินาที
ประเภท: KubeProxyConfiguration
เมตริกBindAddress: ""
โหมด: ""
nodePortAddresses: null
oomScoreAdj: null
ช่วงพอร์ต: ""
showHiddenMetricsForVersion: ""
udpIdleTimeout: 0 วินาที
เคอร์เนล:
  enableDSR: เท็จ
  ชื่อเครือข่าย: ""
  แหล่งที่มาวีไอพี: ""
kubeconfig.conf:
----
api เวอร์ชัน: v1
ประเภท: การกำหนดค่า
คลัสเตอร์:
- กลุ่ม:
    ผู้ออกใบรับรอง: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    เซิร์ฟเวอร์: https://10.0.4.16:6443
  ชื่อ: ค่าเริ่มต้น
บริบท:
- บริบท:
    คลัสเตอร์: ค่าเริ่มต้น
    เนมสเปซ: ค่าเริ่มต้น
    ผู้ใช้: ค่าเริ่มต้น
  ชื่อ: ค่าเริ่มต้น
บริบทปัจจุบัน: ค่าเริ่มต้น
ผู้ใช้:
- ชื่อ: ค่าเริ่มต้น
  ผู้ใช้:
    ไฟล์โทเค็น: /var/run/secrets/kubernetes.io/serviceaccount/token

ข้อมูลไบนารี
====

เหตุการณ์: <ไม่มี>
$ kubectl -n kube-system exec kube-proxy-gkkxq cat /var/lib/kube-proxy/kubeconfig.conf

kubectl exec [POD] [COMMAND] เลิกใช้แล้วและจะถูกลบออกในเวอร์ชันอนาคต ใช้ kubectl exec [POD] -- [COMMAND] แทน
api เวอร์ชัน: v1
ประเภท: การกำหนดค่า
คลัสเตอร์:
- กลุ่ม:
    ผู้ออกใบรับรอง: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    เซิร์ฟเวอร์: https://10.0.4.16:6443
  ชื่อ: ค่าเริ่มต้น
บริบท:
- บริบท:
    คลัสเตอร์: ค่าเริ่มต้น
    เนมสเปซ: ค่าเริ่มต้น
    ผู้ใช้: ค่าเริ่มต้น
  ชื่อ: ค่าเริ่มต้น
บริบทปัจจุบัน: ค่าเริ่มต้น
ผู้ใช้:
- ชื่อ: ค่าเริ่มต้น
  ผู้ใช้:
    ไฟล์โทเค็น: /var/run/secrets/kubernetes.io/serviceaccount/token

เดอะ โหมด ค่าเริ่มต้นเป็น iptablesตามที่บันทึกด้านบนยืนยัน
ฉันยังเปิดใช้งานการส่งต่อ IP บนโหนดทั้งหมด

$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
moonkotte avatar
in flag
ดูเหมือนว่าจะมีปัญหากับซับเน็ต: เครือข่ายพ็อด cidr คือ `10.1.0.0/16` และจุดสิ้นสุดของระนาบควบคุมนั้นอยู่ใน cidr ของเครือข่ายพ็อด (เนื่องจากเป็น `10.1.0.4`) คุณเปลี่ยน 'pod network cidr' เมื่อคุณติดตั้ง 'flannel' หรือไม่ โดยค่าเริ่มต้นจะใช้ `cidr` ที่แตกต่างกัน
es flag
ฉันติดตั้งผ้าสักหลาดแบบนี้: `kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.16.3/Documentation/kube-flannel.yml` คำสั่ง `kubeadm init` ของฉันมีการตั้งค่าสถานะ `--pod-network-cidr=10.1.0.0/16` และ `--control-plane-endpoint=10.0.4.16`
moonkotte avatar
in flag
คุณสามารถตรวจสอบสิ่งที่อยู่ภายในการกำหนดค่า yaml ของผ้าสักหลาด คุณจะเห็นว่า `"เครือข่าย": "10.244.0.0/16"` ถูกตั้งค่าเป็นเครือข่ายย่อยที่แตกต่างจากที่คุณเริ่มต้นคลัสเตอร์ด้วยตัวเลือก `--pod-network-cidr=10.1.0.0/16` คุณมี 2 ตัวเลือกในการแก้ไข: คุณสามารถเปลี่ยนซับเน็ตใน yaml ของ flannel ให้เหมือนกับ `--pod-network-cidr=10.1.0.0/16` หรือคุณสามารถทำลายคลัสเตอร์และเริ่มด้วยซับเน็ตเดียวกับใน yaml สักหลาด `"เครือข่าย": "10.244.0.0/16"`
es flag
ขอบคุณ. นี่เป็นเคล็ดลับ หากคุณต้องการ คุณสามารถสร้างคำตอบได้และฉันจะยอมรับมันอย่างแน่นอน และต่อมาฉันอาจแนะนำให้แก้ไขโดยเพิ่มสคริปต์เพื่อเขียนไฟล์ YAML นั้นใหม่โดยอัตโนมัติโดยใช้ `yq` และ `jq`
moonkotte avatar
in flag
ได้เลย ขอบคุณ เพื่อนของฉัน @radekw จะโพสต์คำตอบให้ฉันเพราะเขาต้องการชื่อเสียง + เขาให้คำแนะนำนั้นแก่ฉัน อย่าลังเลที่จะยอมรับและแนะนำให้แก้ไข
Score:1
ธง cn

สักหลาด สามารถติดตั้งได้โดยใช้รายการจากที่เก็บ

สามารถเพิ่ม Flannel ลงในคลัสเตอร์ Kubernetes ที่มีอยู่ได้ แม้ว่าจะเป็นการเพิ่มที่ง่ายที่สุด สักหลาด ก่อนที่พ็อดใด ๆ ที่ใช้เครือข่ายพ็อดจะเริ่มต้นขึ้น สำหรับ Kubernetes v1.17+ ใช้ kubectl -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

อย่างที่คุณเห็นในเรื่องนี้ ยาเมล ไฟล์โดยซับเน็ตเครือข่ายเริ่มต้นถูกตั้งค่าเป็น 10.244.0.0/16

  net-conf.json: |
    {
      "เครือข่าย": "10.244.0.0/16",
      "แบ็กเอนด์": {
        "ประเภท": "vxlan"
      }

kubeadm เริ่มต้น คือ สั่งการ เพื่อเริ่มต้นคลัสเตอร์ซึ่งจำเป็นต้องระบุเครือข่ายย่อยสำหรับเครือข่ายคลัสเตอร์และจำเป็นต้องเหมือนกับเครือข่ายย่อยใน CNI ของคุณ คุณสามารถตรวจสอบเพิ่มเติม ตัวเลือก.

--pod-network-cidr สตริง ระบุช่วงของที่อยู่ IP สำหรับเครือข่ายพ็อด หากตั้งค่าไว้ ระนาบควบคุมจะจัดสรร CIDR โดยอัตโนมัติสำหรับทุกโหนด

คุณเริ่มต้นคลัสเตอร์ด้วย --pod-network-cidr=10.1.0.0/16 และซับเน็ตของคลัสเตอร์ของคุณถูกตั้งค่าให้แตกต่างจากซับเน็ตในไฟล์ yaml ของรายการสักหลาด "10.244.0.0/16" และนั่นคือสาเหตุที่มันไม่ทำงาน

มีสองตัวเลือกในการแก้ไข:
ขั้นแรก - เปลี่ยน subnet ใน yaml ของการกำหนดค่า flannel ให้เหมือนกับที่ใช้เมื่อคลัสเตอร์ถูก init-ed ในกรณีนี้คือ --pod-network-cidr=10.1.0.0/16 (ดูสคริปต์ด้านล่าง)
หรือ
ประการที่สอง - หากคลัสเตอร์มีไว้เพื่อการทดสอบและเป็นเพียง init-ed ให้ทำลายคลัสเตอร์และเริ่มต้นด้วยเครือข่ายย่อยเดียวกันกับ yaml ของการกำหนดค่าสักหลาด "เครือข่าย": "10.244.0.0/16"

เพื่อแก้ไขโดยอัตโนมัติ kube-flannel.ymlสคริปต์ต่อไปนี้ขึ้นอยู่กับ ใช่ และ เจคิว สามารถใช้คำสั่ง:

#!/bin/bash

อินพุต = $1
เอาต์พุต=$2

echo "แปลง $input เป็น $output"

netconf=$( yq '. | เลือก(.kind == "ConfigMap") | เลือก(.metadata.name == "kube-flannel-cfg") | .data."net-conf.json"' "อินพุต $ " | jq 'fromjson | .Network="10.1.0.0/16"' | yq -R '.' )
kube_flannel_cfg=$( yq --yaml-output '. | เลือก(.kind == "ConfigMap") | เลือก(.metadata.name == "kube-flannel-cfg") | .data."net-conf.json "='"$netconf" "$อินพุต" )
everything_else=$( yq --yaml-output '. | เลือก(.kind != "ConfigMap") | เลือก(.metadata.name != "kube-flannel-cfg")' "$input" )
เสียงสะท้อน "$kube_flannel_cfg" >> "$output"
echo '---' >> "เอาต์พุต $"
echo "$everything_else" >> "$output"

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา