kubernetes บริการ ip ภายนอกที่รอดำเนินการ


143

ฉันกำลังพยายามปรับใช้ nginx บน kubernetes เวอร์ชัน kubernetes คือ v1.5.2 ฉันได้ปรับใช้ nginx พร้อม 3 แบบจำลองไฟล์ YAML อยู่ด้านล่าง

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

และตอนนี้ฉันต้องการแสดงพอร์ต 80 บนพอร์ต 30062 ของโหนดเพราะฉันสร้างบริการด้านล่าง

kind: Service
apiVersion: v1
metadata:
  name: nginx-ils-service
spec:
  ports:
    - name: http
      port: 80
      nodePort: 30062
  selector:
    app: nginx
  type: LoadBalancer

บริการนี้ทำงานได้ดีอย่างที่ควรจะเป็น แต่แสดงว่ารอดำเนินการไม่เพียง แต่บนแดชบอร์ด kubernetes บนเทอร์มินัล เอาท์พุทขั้วสถานะกระดานแดช

ดังนั้นโปรดช่วยฉันแก้ไขปัญหานี้ ขอบคุณ ...

คำตอบ:


177

ดูเหมือนว่าคุณกำลังใช้กำหนดเอง Kubernetes คลัสเตอร์ (ใช้minikube, kubeadmหรือชอบ) ในกรณีนี้ไม่มี LoadBalancer รวมอยู่ด้วย (ไม่เหมือนกับ AWS หรือ Google Cloud) ด้วยการตั้งค่าเริ่มต้นนี้คุณสามารถใช้NodePortหรือ Ingress Controller เท่านั้น

ด้วยIngress Controllerคุณสามารถตั้งชื่อโดเมนที่แมปกับพ็อดของคุณได้ คุณไม่จำเป็นต้องระบุLoadBalancerประเภทบริการของคุณหากคุณใช้ Ingress Controller


ขอบคุณมาก @javier นี่เป็นประโยชน์จริงๆ ฉันแก้ไขปัญหาของฉันจากด้านบน doc
Pankaj Jackson

9
สิ่งนี้ไม่ตอบโจทย์จริงๆเหรอ? ผู้ใช้กำลังใช้LoadBalancerเป็นประเภทบริการซึ่งเป็นประเภทบริการที่ถูกต้อง NodePortและingressมีวิธีอื่นในการดำเนินการ แต่ไม่สามารถแก้ปัญหาได้จริงไหม?
Raptor

2
เป็นประเภทบริการที่ถูกต้อง แต่ถูกใช้ในแพลตฟอร์มที่ไม่รองรับ (อย่างน้อยก็เป็นค่าเริ่มต้น) ในการใช้ LoadBalancer คุณต้องมีแพลตฟอร์มที่สามารถให้ IP ภายนอกกับพ็อดซึ่งเป็นสิ่งที่ Google Cloud หรือ AWS ทำ
Javier Salmeron

2
ฉันใช้ kubeadm บน AWS ฉันยังได้LoadBalancerไหม?
jiashenC

3
หากคุณใช้ minikube ให้เรียกใช้ "minikube tunnel" ตรวจสอบบริการของคุณตอนนี้คุณจะได้รับ ip สาธารณะ นี่คือเอกสารสำหรับข้อมูลเพิ่มเติมminikube.sigs.k8s.io/docs/tasks/loadbalancer
ราวี

73

หากคุณใช้ Minikube มีคำสั่งวิเศษ!

$ minikube tunnel

หวังว่าจะมีใครบางคนสามารถประหยัดเวลาได้บ้าง

ลิงค์อ้างอิง https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel


ฉันพยายามminikube tunnelและมันแก้ปัญหาได้จริงpendingแต่ IP ภายนอกใหม่ไม่ทำงาน: ฉันได้รับข้อผิดพลาดการหมดเวลา ...
a.barbieri

@ a.barbieri ตรวจสอบให้แน่ใจว่าคุณใช้ tunnel ip แทน minikube ip "patching ingress-nginx ด้วย IP 10.106.102.98"
Peter Zhou

2
ใช่ขอบคุณปีเตอร์ จะพยายาม. อย่างไรก็ตามการเปลี่ยนไปใช้ Docker Desktop ฉันสามารถเอาชนะปัญหานี้ได้ด้วยการตั้งค่าแบบสำเร็จรูปซึ่งทำงานได้โดยตรงบน localhost
a.barbieri

3
เคล็ดลับประหยัดเวลาที่ยอดเยี่ยมสำหรับการสาธิต!
jgitter

49

หากคุณไม่ได้ใช้ GCE หรือ EKS (คุณเคยใช้kubeadm) คุณสามารถเพิ่มexternalIPsข้อมูลจำเพาะในบริการของคุณ YAML คุณสามารถใช้ IP ที่เชื่อมโยงกับอินเทอร์เฟซหลักของโหนดของคุณเช่นeth0. จากนั้นคุณสามารถเข้าถึงบริการจากภายนอกโดยใช้ IP ภายนอกของโหนด

...
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10

2
ต้องมีข้อมูลที่ขาดหายไป: "Kubernetes ภายนอกไม่ได้รับการจัดการและเป็นความรับผิดชอบของผู้ดูแลคลัสเตอร์" ( kubernetes.io/docs/concepts/services-networking/service ) มี "คอนโทรลเลอร์" บางประเภทที่ฉันต้องติดตั้งหรือไม่?
Daniel Alder

ฉันกำลังติดตามบทช่วยสอน Kubernetes ( kubernetes.io/docs/tutorials/stateless-application/guestbook ) และทำงานได้ดีกับ kubeadm
Eduardo

ขอบคุณ - ยอดเยี่ยมทำงานได้ตามที่คาดหวัง ฉันได้เปิดเผยบริการกับโหนด eth เครือข่าย IP ซึ่งตอนนี้สามารถเข้าถึงได้ภายนอกคลัสเตอร์
Vlad Gulin


21

ฉันสร้างคลัสเตอร์ k8s โหนดเดียวโดยใช้ kubeadm เมื่อฉันลองใช้พร็อกซีPortForwardและkubectlพบว่า IP ภายนอกรอดำเนินการ

$ kubectl get svc -n argocd argocd-server
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-server   LoadBalancer   10.107.37.153   <pending>     80:30047/TCP,443:31307/TCP   110s

ในกรณีของฉันฉันได้แก้ไขบริการในลักษณะนี้:

kubectl patch svc <svc-name> -n <namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["172.31.71.218"]}}'

หลังจากนั้นก็เริ่มให้บริการผ่าน IP สาธารณะ

$ kubectl get svc argo-ui -n argo
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
argo-ui   LoadBalancer   10.103.219.8   172.31.71.218   80:30981/TCP   7m50s

11
บางทีคุณควรระบุว่า "172.31.71.218" มาจากไหน
EuRBamarth

ในที่สุดคำตอบที่ให้วิธีการแก้ไข ขอบคุณสำหรับการแบ่งปัน.
Srikant

5

หากใช้งานบนminikubeอย่าลืมพูดถึงเนมสเปซหากคุณไม่ได้ใช้ค่าเริ่มต้น

บริการ minikube << service_name >> --url --namespace = << namespace_name >>


4

หากคุณใช้ minikube ให้เรียกใช้คำสั่งด้านล่างจากเทอร์มินัล

$ minikube ip
$ 172.17.0.2 // then 
$ curl http://172.17.0.2:31245
or simply
$ curl http://$(minikube ip):31245

2

ปัญหาเดียวกัน:

os> kubectl รับ svc ขวา sabertooth-wordpress

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT (S)
right-sabertooth-wordpress LoadBalancer 10.97.130.7 "รอดำเนินการ" 80: 30454 / TCP, 443: 30427 / TCP

ระบบปฏิบัติการ> รายการบริการ minikube

| ------------- | ---------------------------- | ------ -------------------------- |

| NAMESPACE | ชื่อ | URL |

| ------------- | ---------------------------- | ------ -------------------------- |

| ค่าเริ่มต้น | kubernetes | ไม่มีพอร์ตโหนด |

| ค่าเริ่มต้น | ขวา sabertooth-mariadb | ไม่มีพอร์ตโหนด |

| ค่าเริ่มต้น | right-sabertooth-wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| ระบบ kube | kube-dns | ไม่มีพอร์ตโหนด |

| ระบบ kube | ไถนาปรับใช้ | ไม่มีพอร์ตโหนด |

| ------------- | ---------------------------- | ------ -------------------------- |

มันเป็นอย่างไร accesible ผ่านที่http://192.168.99.100:30454


2

ติดตามคำตอบของ @ Javier ฉันได้ตัดสินใจที่จะใช้ "การแก้ไข IP ภายนอก" สำหรับตัวจัดสรรภาระงานของฉัน

 $ kubectl patch service my-loadbalancer-service-name \
-n lb-service-namespace \
-p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.39.25"]}}'

สิ่งนี้จะแทนที่ 'รอดำเนินการ' ด้วยที่อยู่ IP ที่ได้รับการแก้ไขใหม่ที่คุณสามารถใช้สำหรับคลัสเตอร์ของคุณ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ โปรดดูโพสต์ของ karthikเกี่ยวกับการสนับสนุน LoadBalancer ด้วย Minikube สำหรับ Kubernetes

ไม่ใช่วิธีที่สะอาดที่สุดที่จะทำ ฉันต้องการวิธีแก้ปัญหาชั่วคราว หวังว่านี่จะช่วยใครสักคน


1

ใช้ NodePort:

kubectl รัน user-login --replicas = 2 --labels = "run = user-login" --image = kingslayerr / teamproject: version2 --port = 5000

kubectl แสดงการปรับใช้ user-login --type = NodePort --name = user-login-service

kubectl อธิบายเซอร์วิส user-login-service (จดพอร์ต)

kubect cluster-info (IP-> รับ IP ที่มาสเตอร์กำลังทำงานอยู่)

บริการของคุณสามารถเข้าถึงได้ที่ (IP) :( พอร์ต)




1

LoadBalancer ServiceType จะใช้งานได้ก็ต่อเมื่อโครงสร้างพื้นฐานที่สำคัญรองรับการสร้าง Load Balancers โดยอัตโนมัติและมีการสนับสนุนตามลำดับใน Kubernetes เช่นเดียวกับในกรณีของ Google Cloud Platform และ AWS หากไม่มีการกำหนดค่าคุณสมบัติดังกล่าวช่องที่อยู่ IP ของ LoadBalancer จะไม่ถูกเติมและยังคงอยู่ในสถานะรอดำเนินการและบริการจะทำงานในลักษณะเดียวกับบริการประเภท NodePort


1

คุณสามารถแก้ไข IP ของโหนดที่โฮสต์พ็อดได้ (IP ส่วนตัวของโหนด) นี่เป็นวิธีแก้ปัญหาง่ายๆ

การอ้างอิงกับโพสต์ข้างต้นการติดตามใช้ได้ผลสำหรับฉัน:

kubectl patch service my-loadbalancer-service-name \ -n lb-service-namespace \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx Private IP ของเซิร์ฟเวอร์จริง - โหนด - ที่การปรับใช้เสร็จสิ้น "]}}"


0

ลบบริการที่มีอยู่และสร้างบริการใหม่เดียวกันช่วยแก้ปัญหาของฉันได้ ปัญหาของฉันคือการปรับสมดุลการโหลด Ip ที่ฉันกำหนดถูกใช้เพื่อให้ปลายทางภายนอกรอดำเนินการ เมื่อฉันเปลี่ยน IP การจัดสรรภาระงานใหม่มันก็ยังไม่สามารถใช้งานได้ สุดท้ายลบบริการที่มีอยู่และสร้างใหม่เพื่อแก้ปัญหาของฉัน


0

ตรวจสอบบันทึก kube-controller ฉันสามารถแก้ปัญหานี้ได้โดยตั้งค่าแท็ก clusterID เป็นอินสแตนซ์ ec2 ที่ฉันปรับใช้คลัสเตอร์


0

หากเป็นคลัสเตอร์ k8s ส่วนตัวของคุณ MetalLB จะเหมาะสมกว่า ด้านล่างนี้เป็นขั้นตอน

ขั้นตอนที่ 1: ติดตั้ง MetalLB ในคลัสเตอร์ของคุณ

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

ขั้นตอนที่ 2: กำหนดค่าโดยใช้ configmap

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.42.42.100-172.42.42.105 #Update this with your Nodes IP range 

ขั้นตอนที่ 3: สร้างบริการของคุณเพื่อรับ IP ภายนอก (แม้ว่าจะเป็น IP ส่วนตัว)

FYR:

ก่อนการติดตั้ง MetalLB: ป้อนคำอธิบายภาพที่นี่

หลังจากการติดตั้ง MetalLB: ป้อนคำอธิบายภาพที่นี่

ป้อนคำอธิบายภาพที่นี่


0

การเพิ่มโซลูชันสำหรับผู้ที่พบข้อผิดพลาดนี้ขณะทำงาน .

ก่อนอื่นให้รัน:

kubectl describe svc <service-name>

จากนั้นตรวจสอบeventsฟิลด์ในผลลัพธ์ตัวอย่างด้านล่าง:

Name:                     some-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"some-service","namespace":"default"},"spec":{"ports":[{"port":80,...
Selector:                 app=some
Type:                     LoadBalancer
IP:                       10.100.91.19
Port:                     <unset>  80/TCP
TargetPort:               5000/TCP
NodePort:                 <unset>  31022/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                  Age        From                Message
  ----     ------                  ----       ----                -------
  Normal   EnsuringLoadBalancer    68s  service-controller  Ensuring load balancer
  Warning  SyncLoadBalancerFailed  67s  service-controller  Error syncing load balancer: failed to ensure load balancer: could not find any suitable subnets for creating the ELB

ตรวจสอบข้อความแสดงข้อผิดพลาด:

Failed to ensure load balancer: could not find any suitable subnets for creating the ELB

ในกรณีของฉันเหตุผลที่ไม่มีเครือข่ายย่อยที่เหมาะสมสำหรับการสร้าง ELB คือ:

1:คลัสเตอร์ EKS ถูกนำไปใช้กับกลุ่มเครือข่ายย่อยที่ไม่ถูกต้อง - เครือข่ายย่อยภายในแทนที่จะเป็นแบบสาธารณะ
(*) โดยค่าเริ่มต้นบริการประเภทจะLoadBalancerสร้างตัวservice.beta.kubernetes.io/aws-load-balancer-internal: "true"จัดสรรภาระงานที่เปิดเผยต่อสาธารณะหากไม่มีการใส่คำอธิบายประกอบ)

2:เครือข่ายย่อยที่ไม่ได้ติดแท็กตามความต้องการดังกล่าวที่นี่

การติดแท็ก VPC ด้วย:

Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared

การติดแท็กเครือข่ายย่อยสาธารณะด้วย:

Key: kubernetes.io/role/elb
Value: 1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.