kubernetes सेवा बाहरी IP लंबित है


142

मैं kubernetes पर nginx को तैनात करने की कोशिश कर रहा हूं, kubernetes संस्करण v1.5.2 है, मैंने 3 प्रतिकृति के साथ nginx तैनात किया है, 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

और अब मैं नोड के पोर्ट 30062 पर इसके पोर्ट 80 को उजागर करना चाहता हूं, इसके लिए मैंने नीचे एक सेवा बनाई,

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

यह सेवा अच्छी होनी चाहिए क्योंकि यह होना चाहिए, लेकिन यह न केवल कुबेरनेट्स डैशबोर्ड पर बल्कि टर्मिनल पर भी लंबित है। टर्मिनल आउटपुटडैश बोर्ड की स्थिति

तो कृपया मुझे इस मुद्दे को हल करने में मदद करें। धन्यवाद ...

जवाबों:


177

ऐसा लगता है कि आप एक कस्टम कुबेरनेट क्लस्टर (उपयोग minikube, kubeadmया पसंद है) का उपयोग कर रहे हैं । इस मामले में, कोई लोडबेलर एकीकृत नहीं है (AWS या Google क्लाउड के विपरीत)। इस डिफ़ॉल्ट सेटअप के साथ, आप केवल NodePortएक या इनवॉइस कंट्रोलर का उपयोग कर सकते हैं ।

साथ प्रवेश नियंत्रक आप एक डोमेन नाम है जो आपके फली के नक्शे सेटअप कर सकते हैं, LoadBalancerयदि आप एक Ingress नियंत्रक का उपयोग करते हैं, तो आपको अपनी सेवा देने की आवश्यकता नहीं है ।


बहुत बहुत धन्यवाद @ @ जेवियर यह वास्तव में मददगार है। मैंने अपनी समस्या को डॉक के ऊपर से हल किया।
पंकज जैक्सन

9
यह वास्तव में क्वेटियन का जवाब नहीं देता है? उपयोगकर्ता LoadBalancerएक सेवा प्रकार के रूप में उपयोग कर रहा है जो एक मान्य सेवा प्रकार है। NodePortऔर ingressयह करने के अन्य तरीके हैं, लेकिन वास्तव में इस मुद्दे को हल नहीं कर रहे हैं, है ना?
रैप्टर

2
यह एक वैध सेवा प्रकार है लेकिन इसका उपयोग गैर-संगत प्लेटफॉर्म (कम से कम डिफ़ॉल्ट रूप से) में किया जा रहा है। LoadBalancer का उपयोग करने के लिए आपके पास एक ऐसा प्लेटफॉर्म होना चाहिए जो पॉड्स को बाहरी IP प्रदान कर सके, जो कि Google क्लाउड या AWS है।
जेवियर सलारमॉन

2
मैं AWS पर kubeadm का उपयोग कर रहा हूं। क्या मैं अभी भी कर सकता हूँ LoadBalancer?
jiashenC

3
यदि आप मिनीब्यूब रन "मिनीक्यूब टनल" का उपयोग कर रहे हैं। अब अपनी सेवाओं की जांच करें आपको सार्वजनिक आईपी मिलेगा। यहाँ अधिक जानकारी के लिए dik है minikube.sigs.k8s.io/docs/tasks/loadbalancer
रवि

73

यदि आप मिनिक्यूब का उपयोग कर रहे हैं, तो एक जादू कमांड है!

$ minikube tunnel

उम्मीद है कि कोई इसके साथ कुछ मिनट बचा सकता है।

संदर्भ लिंक https://minikube.sigs.k8s.io/docs/handbook/accessing/#use-minikube-tunnel


मैंने कोशिश की minikube tunnelऔर यह वास्तव में इस pendingमुद्दे को हल करता है, लेकिन फिर नया बाहरी आईपी काम नहीं करता है: मुझे टाइमआउट त्रुटि मिलती है ...
a.barbieri

@ a.barbieri सुनिश्चित करें कि आप मिनीब्यूब आईपी के बजाय सुरंग आईपी का उपयोग कर रहे हैं। "आईपी 10.106.102.98 के साथ पैच-इनगिनैक्स पैचिंग"
पीटर झोउ

2
हाँ धन्यवाद पीटर। कोशिश करेंगे। वैसे भी Docker Desktop पर स्विच करने से मैं इस मुद्दे को आउट-ऑफ-द-बॉक्स सेटिंग के साथ दूर कर पा रहा हूं, जो सीधे लोकलहोस्ट पर काम करता है।
a.bbieri

3
प्रदर्शन के लिए उत्कृष्ट समय की बचत टिप!
jgitter

49

यदि आप GCE या EKS (आपने उपयोग नहीं किया है kubeadm) का उपयोग नहीं कर रहे हैं, तो आप externalIPsअपनी सेवा YAML में एक युक्ति जोड़ सकते हैं । आप अपने नोड के प्राथमिक इंटरफ़ेस से जुड़े आईपी का उपयोग कर सकते हैं जैसे कि eth0। फिर आप नोड के बाहरी आईपी का उपयोग करके, बाह्य रूप से सेवा का उपयोग कर सकते हैं।

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

2
एक अनुपस्थित जानकारी होनी चाहिए: "एक्सटर्ब को कुबेरनेट द्वारा प्रबंधित नहीं किया गया है और यह क्लस्टर व्यवस्थापक की जिम्मेदारी है।" ( kubernetes.io/docs/concepts/services-networking/service )। क्या मुझे किसी प्रकार का "नियंत्रक" स्थापित करना है?
डैनियल एल्डर

मैं कुबेरनेट्स ट्यूटोरियल ( kubernetes.io/docs/tutorials/stateless-application/guestbook ) का अनुसरण कर रहा हूं और यह कुबेदम के साथ ठीक काम करता है
एडुआर्डो

धन्यवाद - शानदार, उम्मीद के मुताबिक काम किया। मैंने सेवा को उजागर किया है नैतिक नेटवर्क आईपी को नोड करने के लिए जो अब क्लस्टर के बाहर सुलभ है
व्लाद गुलिन

34

किसी सेवा तक पहुँचने के लिए minikube, आपको निम्नलिखित कमांड चलाने की आवश्यकता है:

minikube service [-n NAMESPACE] [--url] NAME

अधिक जानकारी यहाँ: Minikube GitHub


9
ठोस उदाहरण: मिनीब्यूब सेवा स्पार्क-यूआई-प्रॉक्सी
रोमियो किन्ज़लर

21

मैंने kubeadm का उपयोग करके एक एकल नोड k8s क्लस्टर बनाया। जब मैंने 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"]}}'

इसके बाद, इसने सार्वजनिक आईपी पर सेवा देना शुरू कर दिया

$ 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" कहां से आता है?
यूरेम्बरथ

अंत में एक उत्तर जो पैच करने के लिए देता है। साझा करने के लिए धन्यवाद।
श्रीकांत

5

यदि मिनीब्यूब पर चल रहे हैं , तो डिफ़ॉल्ट नाम का उपयोग नहीं करने पर नाम स्थान का उल्लेख करना न भूलें।

मिनीब्यूब सेवा << service_name >> --url --namespace = << namespace_name >>


4

यदि आप मिनीब्यूब का उपयोग कर रहे हैं तो टर्मिनल से नीचे कमांड चलाएं,

$ 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 बाहरी आईपी पोर्ट (S)
राइट- सबर्बूथ - वर्ड लोडर 10.97.130.7 "लंबित" 80: 30454 / टीसीपी, 443: 30427 / टीसीपी

ओएस> मिनीब्यूब सेवा सूची

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

| NAMESPACE | NAME | URL |

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

| डिफ़ॉल्ट | कुबेरनेट्स | कोई नोड पोर्ट नहीं |

| डिफ़ॉल्ट | दाहिना- sabertooth-mariadb | कोई नोड पोर्ट नहीं |

| डिफ़ॉल्ट | right-sabertooth-wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| क्यूब-सिस्टम | क्यूब-डीएनएस | कोई नोड पोर्ट नहीं |

| क्यूब-सिस्टम | टिलर-तैनात | कोई नोड पोर्ट नहीं |

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

हालाँकि, यह http://192.168.99.100:30454 के माध्यम से प्रशंसनीय है


2

@ जेवियर के जवाब के बाद। मैंने अपने लोड बैलेंसर के लिए "बाहरी आईपी को पैच अप" के साथ जाने का फैसला किया है।

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

यह उस 'लंबित' की जगह एक नया पैचअप आईपी एड्रेस देगा जिसे आप अपने क्लस्टर के लिए उपयोग कर सकते हैं।

इस पर और अधिक के लिए। कृपया कुबेरनेट्स के लिए मिनिक्यूब के साथ लोडबेलर समर्थन पर कार्तिक की पोस्ट देखें

इसे करने का सबसे साफ तरीका नहीं है। मुझे एक अस्थायी समाधान की आवश्यकता थी। आशा है कि यह किसी की मदद करता है।


1

NodePort का उपयोग करें:

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

kubectl परिनियोजन उपयोगकर्ता-लॉगिन - टाइप करें = NodePort --name = उपयोगकर्ता-लॉगिन-सेवा

kubectl सेवाओं के उपयोगकर्ता-लॉगिन-सेवा का वर्णन करें (पोर्ट को नोट करें)

kubect क्लस्टर-जानकारी (IP-> IP प्राप्त करें जहां मास्टर चल रहा है)

आपकी सेवा सुलभ है (IP) :( पोर्ट)


1

मिनिक्यूब का उपयोग करते समय, आप आईपी और पोर्ट प्राप्त कर सकते हैं जिसके माध्यम से आप मिनीब्यूब सेवा कुबिया-http चलाकर सेवा का उपयोग कर सकते हैं।



1

LoadBalancer ServiceType केवल तभी काम करेगा जब अंतर्निहित अवसंरचना लोड Balancers के स्वचालित निर्माण का समर्थन करती है और Kubernetes में संबंधित समर्थन है, जैसा कि Google क्लाउड प्लेटफ़ॉर्म और AWS के साथ है। यदि ऐसी कोई सुविधा कॉन्फ़िगर नहीं की गई है, तो LoadBalancer IP पता फ़ील्ड आबाद नहीं है और अभी भी लंबित स्थिति में है, और सेवा NodePort प्रकार सेवा के समान कार्य करेगी


1

आप नोड के आईपी को पैच कर सकते हैं जहां पॉड्स होस्ट किए गए हैं (प्राइवेट आईपी ऑफ नोड), यह आसान समाधान है।

उपरोक्त पोस्ट के साथ संदर्भ लेते हुए, निम्नलिखित ने मेरे लिए काम किया:

kubectl पैच सर्विस my-loadbalancer-service-name -n lb-service-namespace \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx Private आईपी ​​ऑफ फिजिकल सर्वर - नोड - जहाँ पर तैनाती की जाती है "]}}"


0

मौजूदा सेवा को हटाएं और एक ही नई सेवा बनाने से मेरी समस्याएं हल हो गई हैं। मेरी समस्या यह है कि लोडिंग बैलेंसिंग I I को परिभाषित किया जाता है ताकि बाहरी समापन बिंदु लंबित हो। जब मैंने एक नया लोड संतुलन आईपी बदल दिया तो यह अभी भी काम नहीं कर रहा है। अंत में, मौजूदा सेवा को हटा दें और एक नई समस्या को हल करें।


0

क्यूब-कंट्रोलर लॉग की जाँच करें। मैं इस समस्या को हल करने में सक्षम था जिस पर मैंने क्लस्टर पर तैनात ec2 उदाहरण के लिए क्लस्टरआईडी टैग सेट किया था।


0

यदि यह आपका निजी k8s क्लस्टर है, तो MetalLB एक बेहतर फिट होगा। नीचे चरण हैं।

चरण 1: अपने क्लस्टर में मेटलएलबी स्थापित करें

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: एक कॉन्फ़िगरमैप का उपयोग करके इसे कॉन्फ़िगर करें

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: एक बाहरी आईपी प्राप्त करने के लिए अपनी सेवा बनाएं (हालांकि एक निजी आईपी होगा)।

यूगोस्लाविय:

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: ईकेएस क्लस्टर को गलत सबनेट समूह पर तैनात किया गया था - जनता का सामना करने के बजाय आंतरिक सबनेट।
(*) डिफ़ॉल्ट रूप से, 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.