kubernetes hizmeti harici ip bekleniyor


143

Nginx'i kubernetes üzerinde konuşlandırmaya çalışıyorum, kubernetes sürümü v1.5.2, nginx'i 3 replika ile konuşlandırdım, YAML dosyası aşağıda,

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

ve şimdi 80 numaralı bağlantı noktasını düğümün 30062 numaralı bağlantı noktasında göstermek istiyorum, bunun için aşağıda bir hizmet oluşturdum,

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

bu hizmet olması gerektiği gibi iyi çalışıyor, ancak yalnızca kubernetes kontrol panelinde değil, terminalde de beklemede görünüyor. Terminal çıkışıGösterge panosu durumu

bu yüzden lütfen bu sorunu çözmeme yardım edin. Teşekkürler ...

Yanıtlar:


177

Eğer (kullanarak özel bir Kubernetes Küme kullanıyor gibi görünüyor minikube, kubeadmya da benzeri). Bu durumda, entegre LoadBalancer yoktur (AWS veya Google Cloud'un aksine). Bu varsayılan kurulumla, yalnızca NodePortveya bir Giriş Kontrolörü kullanabilirsiniz.

İle Ingress Kontrolörü Eğer kurulum pod eşleştiren bir alan adı can; LoadBalancerBir Giriş Kontrolörü kullanıyorsanız , Hizmet tipini vermenize gerek yoktur .


Çok teşekkür ederim @javier bu gerçekten yardımcı oldu. Sorunumu yukarıdaki belgeden çözdüm.
Pankaj Jackson

9
Bu gerçekten soruya cevap vermiyor mu? Kullanıcı, LoadBalancergeçerli bir hizmet türü olan hizmet türü olarak kullanmaktadır. NodePortve ingressbunu yapmanın başka yolları var ama sorunu gerçekten çözmüyor, değil mi?
Raptor

2
Geçerli bir hizmet türüdür ancak uyumlu olmayan bir platformda kullanılmaktadır (en azından varsayılan olarak). LoadBalancer'ı kullanmak için, Google Cloud veya AWS'nin yaptığı gibi, bölmelere harici IP'ler sağlayabilen bir platforma sahip olmanız gerekir.
Javier Salmeron

2
AWS'de kubeadm kullanıyorum. Hala yapabilir miyim LoadBalancer?
jiashenC

3
Minikube kullanıyorsanız "minikube tüneli" çalıştırın. Şimdi hizmetlerinizi kontrol edin, genel ip alacaksınız. İşte daha fazla bilgi için belge minikube.sigs.k8s.io/docs/tasks/loadbalancer
Ravi

73

Minikube kullanıyorsanız, sihirli bir komut var!

$ minikube tunnel

Umarım birileri bununla birkaç dakika kazanabilir.

Referans bağlantısı https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel


Denedim minikube tunnelve aslında pendingsorunu çözdü , ama sonra yeni harici IP çalışmıyor: Bir zaman aşımı hatası alıyorum ...
a.barbieri

@ a.barbieri minikube ip yerine tünel ipini kullandığınızdan emin olun. "IP 10.106.102.98 ile yama girişi-nginx"
Peter Zhou

2
evet teşekkür ederim Peter. Deneyecek. Her neyse, Docker Desktop'a geçiyorum, doğrudan localhost üzerinde çalışan kullanıma hazır ayar ile bu sorunun üstesinden gelebildim.
a.barbieri

3
Gösteri için mükemmel zaman kazandıran ipucu!
jgitter

49

GCE veya EKS (kullandınız kubeadm) kullanmıyorsanız , externalIPsYAML hizmetinize bir özellik ekleyebilirsiniz . Düğümünüzün birincil arabirimiyle ilişkili IP'yi kullanabilirsiniz eth0. Ardından, düğümün harici IP'sini kullanarak hizmete harici olarak erişebilirsiniz.

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

2
Eksik bir bilgi parçası olmalıdır: "harici IP'ler Kubernetes tarafından yönetilmez ve küme yöneticisinin sorumluluğundadır." ( kubernetes.io/docs/concepts/services-networking/service ). Yüklemem gereken bir tür "denetleyici" var mı?
Daniel Alder

Kubernetes öğreticisini ( kubernetes.io/docs/tutorials/stateless-application/guestbook ) takip ediyorum ve kubeadm ile iyi çalıştı
Eduardo

Teşekkürler - mükemmel, beklendiği gibi çalıştı. Hizmeti, artık kümenin dışından erişilebilen et ağ IP düğümlerine maruz bıraktım
Vlad Gulin


21

Kubeadm kullanarak tek düğümlü bir k8s kümesi oluşturdum. PortForward ve kubectl proxy'yi denediğimde , beklemede olarak harici IP gösterdi.

$ 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

Benim durumumda, hizmeti şu şekilde yamadım:

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

Bundan sonra, genel IP üzerinden hizmet vermeye başladı

$ 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
Belki de "172.31.71.218" nereden geldiğinden bahsetmelisiniz?
EuRBamarth

Sonunda nasıl yama yapılacağını veren bir cevap. Paylaşım için teşekkürler.
Srikant

5

Minikube üzerinde çalışıyorsa varsayılanı kullanmıyorsanız ad alanından bahsetmeyi unutmayın.

minikube hizmeti << hizmet_adı >> --url --namespace = << ad alanı_adı >>


4

Minikube kullanıyorsanız, terminalden aşağıdaki komutları çalıştırın,

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

2

aynı sorun:

os> kubectl svc sağ sabertooth-wordpress olsun

İSİM TİPİ KÜMELEME-IP HARİCİ-IP PORT (LAR)
sağ-sabertooth-wordpress kılıç dişli LoadBalancer 10.97.130.7 "beklemede" 80: 30454 / TCP, 443: 30427 / TCP

os> minikube hizmet listesi

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

| NAMESPACE | İSİM | URL |

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

| varsayılan | kubernetes | Düğüm bağlantı noktası yok |

| varsayılan | sağ kılıç dişli mariadb | Düğüm bağlantı noktası yok |

| varsayılan | sağ kılıç dişli wordpress |http://192.168.99.100:30454 |

| | |http://192.168.99.100:30427 |

| kube sistemi | kube-dns | Düğüm bağlantı noktası yok |

| kube sistemi | yeke konuşlandırması | Düğüm bağlantı noktası yok |

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

Bununla birlikte, http://192.168.99.100:30454 adresinden erişilebilir .


2

@ Javier'in cevabını takiben. Yük dengeleyicim için "harici IP'yi düzeltme" ye karar verdim.

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

Bu, "beklemedeki" ifadesini kümeniz için kullanabileceğiniz yamalanmış yeni bir IP adresiyle değiştirecektir.

Daha fazlası için. Bakınız karthik en üstünde yazı Kubernetes için Minikube ile LoadBalancer desteği

Bunu yapmanın en temiz yolu değil. Geçici bir çözüme ihtiyacım vardı. Umarım bu birine yardımcı olur.


1

NodePort'u kullanın:

kubectl kullanıcı-girişini çalıştır --replicas = 2 --labels = "run = kullanıcı-girişi" --image = kingslayerr / teamproject: sürüm2 --port = 5000

kubectl, dağıtım kullanıcı oturum açma --type = NodePort --name = kullanıcı-oturum açma-hizmetini ifşa eder

kubectl hizmetleri kullanıcı oturum açma hizmetini tanımlar (Bağlantı noktasını not edin)

kubect cluster-info (IP-> Master'ın çalıştığı IP adresini alın)

Hizmetinize (IP) :( port) adresinden erişilebilir


1

Minikube kullanırken, minikube servisini kubia-http çalıştırarak servise erişebileceğiniz IP ve portu alabilirsiniz.



1

LoadBalancer ServiceType, yalnızca temel altyapı Load Balancer'ların otomatik olarak oluşturulmasını destekliyorsa ve Google Cloud Platform ve AWS'de olduğu gibi Kubernetes'te ilgili desteğe sahipse çalışır. Böyle bir özellik yapılandırılmamışsa, LoadBalancer IP adresi alanı doldurulmaz ve hala beklemede durumundadır ve Hizmet, NodePort tipi Hizmet ile aynı şekilde çalışacaktır.


1

Bölmelerin barındırıldığı Düğüm IP'sine yama uygulayabilirsiniz (Düğümün Özel IP'si), bu kolay bir çözümdür.

Yukarıdaki gönderilere referans alarak, Aşağıdakiler benim için çalıştı:

kubectl yama hizmeti my-loadbalancer-service-name \ -n lb-service-namespace \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx Özel Fiziksel Sunucunun IP'si - Düğüm - dağıtımın yapıldığı yer "]}} '


0

mevcut hizmeti silmek ve aynı yeni hizmeti oluşturmak sorunlarımı çözdü. Benim problemlerim, tanımladığım yükleme dengeleme IP'sinin harici uç noktanın beklemede olması için kullanılması. Yeni bir yük dengeleme IP'sini değiştirdiğimde hala çalışmıyor. Son olarak, mevcut hizmeti silin ve yeni bir tane oluşturun sorunumu çözdü.


0

Kube denetleyici günlüklerini kontrol edin. Bu sorunu, clusterID etiketlerini, kümeyi dağıttığım ec2 örneğine ayarlayarak çözebildim.


0

Özel k8 kümenizse, MetalLB daha uygun olacaktır. Adımlar aşağıdadır.

Adım 1: MetalLB'yi kümenize kurun

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)"

Adım 2: Bir yapılandırma haritası kullanarak yapılandırın

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 

Adım 3: Harici bir IP almak için hizmetinizi oluşturun (yine de özel bir IP olacaktır).

EY:

MetalLB kurulumundan önce: görüntü açıklamasını buraya girin

MetalLB kurulumundan sonra: görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin


0

Çalışırken bu hatayla karşılaşanlar için bir çözüm eklemek .

Her şeyden önce çalıştırın:

kubectl describe svc <service-name>

Ve sonra eventsaşağıdaki örnek çıktıdaki alanı inceleyin:

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

Hata mesajını inceleyin:

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

Benim durumumda, ELB'yi oluşturmak için uygun alt ağların sağlanmamasının nedeni şunlardı:

1: EKS kümesi yanlış alt ağ grubuna yerleştirildi - herkese açık değil, dahili alt ağlar.
(*) Varsayılan olarak, türdeki hizmetler, ek açıklama sağlanmadıysa LoadBalancerdışa dönük yük dengeleyiciler oluşturur service.beta.kubernetes.io/aws-load-balancer-internal: "true").

2: Alt ağlar, burada belirtilen gereksinimlere göre etiketlenmemiş .

VPC'yi şununla etiketleme:

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

Genel alt ağları şunlarla etiketleme:

Key: kubernetes.io/role/elb
Value: 1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.