kubernetes layanan ip eksternal yang tertunda

142

Saya mencoba menggunakan nginx di kubernetes, versi kubernetes v1.5.2, saya telah menggunakan nginx dengan 3 replika, file YAML di bawah,

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

dan sekarang saya ingin mengekspos port 80 pada port 30062 node, untuk itu saya membuat layanan di bawah ini,

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

layanan ini berfungsi dengan baik sebagaimana mestinya, tetapi ditampilkan sebagai tertunda tidak hanya pada kubernetes dasbor juga pada terminal. Output terminalStatus papan dasbor

jadi tolong bantu saya untuk mengatasi masalah ini. Terima kasih ...

Pankaj Jackson
sumber

Jawaban:

177

Sepertinya Anda menggunakan Cluster Kubernetes kustom (menggunakan minikube, kubeadmatau sejenisnya). Dalam hal ini, tidak ada LoadBalancer terintegrasi (tidak seperti AWS atau Google Cloud). Dengan pengaturan default ini, Anda hanya dapat menggunakan NodePortatau Ingress Controller.

Dengan Pengontrol Ingress Anda dapat mengatur nama domain yang memetakan ke pod Anda; Anda tidak perlu memberikan LoadBalancertipe layanan kepada Anda jika Anda menggunakan Ingress Controller.

Javier Salmeron
sumber
Terima kasih banyak @javier ini sangat membantu. Saya memecahkan masalah saya dari dokumen di atas.
Pankaj Jackson
9
Ini tidak benar-benar menjawab pertanyaan itu? Pengguna menggunakan LoadBalancersebagai jenis layanan yang merupakan jenis layanan yang valid. NodePortdan ingressapakah ada cara lain untuk melakukannya tetapi tidak benar-benar menyelesaikan masalah, bukan?
Raptor
2
Ini adalah jenis layanan yang valid tetapi sedang digunakan dalam platform yang tidak kompatibel (setidaknya secara default). Untuk menggunakan LoadBalancer, Anda harus memiliki platform yang dapat memberikan IP eksternal ke pod, yang merupakan sesuatu yang dilakukan Google Cloud atau AWS.
Javier Salmeron
2
Saya menggunakan kubeadm di AWS. Bisakah saya diam LoadBalancer?
jiashenC
3
Jika Anda menggunakan minikube, jalankan "terowongan minikube". Sekarang periksa layanan Anda, Anda akan mendapatkan ip publik. Berikut ini adalah dokumen untuk informasi lebih lanjut minikube.sigs.k8s.io/docs/tasks/loadbalancer
Ravi
73

Jika Anda menggunakan Minikube, ada perintah ajaib!

$ minikube tunnel

Semoga seseorang dapat menghemat beberapa menit dengan ini.

Tautan referensi https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel

Peter Zhou
sumber
Saya mencoba minikube tunneldan itu benar-benar menyelesaikan pendingmasalah, tetapi kemudian IP eksternal baru tidak berfungsi: Saya mendapatkan kesalahan batas waktu ...
a.barbieri
@ a.barbieri pastikan Anda menggunakan ip tunnel bukan ip minikube. "menambal ingress-nginx dengan IP 10.106.102.98"
Peter Zhou
2
ya terima kasih Peter. Akan mencoba. Pokoknya beralih ke Docker Desktop Saya sudah bisa mengatasi masalah ini dengan pengaturan out-of-the-box yang bekerja langsung di localhost.
a.barbieri
3
Tip hemat waktu yang sangat baik untuk demonstrasi!
jgitter
49

Jika Anda tidak menggunakan GCE atau EKS (Anda menggunakan kubeadm), Anda dapat menambahkan externalIPsspesifikasi ke layanan Anda YAML. Anda dapat menggunakan IP yang terkait dengan antarmuka utama simpul Anda seperti eth0. Anda kemudian dapat mengakses layanan secara eksternal, menggunakan IP eksternal dari node.

...
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10
toppur
sumber
2
Harus ada informasi yang hilang: "externalIPs tidak dikelola oleh Kubernetes dan merupakan tanggung jawab administrator cluster." ( kubernetes.io/docs/concepts/services-networking/service ). Apakah ada semacam "pengontrol" yang harus saya instal?
Daniel Alder
Saya mengikuti tutorial Kubernetes ( kubernetes.io/docs/tutorials/stateless-application/guestbook ) dan berhasil dengan kubeadm
Eduardo
Terima kasih - brilian, bekerja seperti yang diharapkan. Saya telah mengekspos Layanan ke node-node jaringan IP yang sekarang dapat diakses di luar cluster
Vlad Gulin
34

Untuk mengakses layanan aktif minikube, Anda perlu menjalankan perintah berikut:

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

Informasi lebih lanjut di sini: Minikube GitHub

Saket Jain
sumber
9
contoh nyata: layanan minikube spark-ui-proxy --url 192.168.99.100:30621
Romeo Kienzler
21

Saya membuat satu simpul node k8s menggunakan kubeadm. Ketika saya mencoba PortForward dan kubectl proxy , itu menunjukkan IP eksternal sebagai pending.

$ 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

Dalam kasus saya, saya telah memperbaiki layanan seperti ini:

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

Setelah ini, mulai melayani IP publik

$ 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
surya vallabhaneni
sumber
11
Mungkin Anda harus menyebutkan dari mana "172.31.71.218" berasal?
EuRBamarth
Akhirnya jawaban yang memberi cara menambal. Terima kasih telah berbagi.
Srikant
5

Jika berjalan di minikube , jangan lupa menyebutkan namespace jika Anda tidak menggunakan default.

layanan minikube << service_name >> --url --namespace = << namespace_name >>

Mohsin
sumber
4

Jika Anda menggunakan minikube kemudian jalankan perintah di bawah ini dari terminal,

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

masalah yang sama:

os> kubectl dapatkan svc right-sabertooth-wordpress

NAMA TIPE CLUSTER-IP EKSTERNAL-IP PORT (S)
kanan-sabertooth-wordpress LoadBalancer 10.97.130.7 "tertunda" 80: 30454 / TCP, 443: 30427 / TCP

os> daftar layanan minikube

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

| NAMESPACE | NAME | URL |

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

| default | kubernetes | Tidak ada port node |

| default | right-sabertooth-mariadb | Tidak ada port node |

| default | wordpress kanan-sabertooth- | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| sistem kubus | kube-dns | Tidak ada port node |

| sistem kubus | tiller-deploy | Tidak ada port node |

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

Namun demikian, dapat diakses melalui http://192.168.99.100:30454 itu .

alfred
sumber
2

Mengikuti jawaban Javier. Saya telah memutuskan untuk pergi dengan "menambal IP eksternal" untuk penyeimbang beban saya.

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

Ini akan menggantikan 'pending' itu dengan alamat IP baru yang ditambal yang dapat Anda gunakan untuk cluster Anda.

Untuk lebih lanjut tentang ini. Silakan lihat posting karthik tentang dukungan LoadBalancer dengan Minikube untuk Kubernetes

Bukan cara terbersih untuk melakukannya. Saya membutuhkan solusi sementara. Semoga ini bisa membantu seseorang.

Mo-Gang
sumber
1

Gunakan NodePort:

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

kubectl memperlihatkan penyebaran pengguna-masuk --type = NodePort --name = pengguna-masuk-layanan

kubectl menggambarkan layanan pengguna-masuk-layanan (Catat port)

kubect cluster-info (IP-> Get The IP where master running)

Layanan Anda dapat diakses di (IP) :( port)

Shubham Sawant
sumber
1

Saat menggunakan Minikube, Anda bisa mendapatkan IP dan port yang melaluinya Anda dapat mengakses layanan dengan menjalankan layanan minikube kubia-http.

Hammad Asad
sumber
1

Jika Anda tidak menggunakan cloud yang didukung (aws, azure, gcloud dll.), Anda tidak dapat menggunakan LoadBalancer tanpa MetalLB https://metallb.universe.tf/ tetapi masih dalam versi beta ..

Pierluigi Di Lorenzo
sumber
1

LoadBalancer ServiceType hanya akan berfungsi jika infrastruktur yang mendasarinya mendukung pembuatan Load Balancers otomatis dan mendapatkan masing-masing dukungan di Kubernetes, seperti halnya dengan Google Cloud Platform dan AWS. Jika tidak ada fitur yang dikonfigurasi, bidang alamat IP LoadBalancer tidak terisi dan masih dalam status menunggu, dan Layanan akan bekerja dengan cara yang sama seperti Layanan jenis NodePort

Medone
sumber
1

Anda dapat menambal IP Node tempat pod di-host (Private IP of Node), ini adalah solusi yang mudah.

Mengambil referensi dengan posting di atas, Berikut bekerja untuk saya:

kubectl layanan patch my-loadbalancer-service-name \ -n lb-service-namespace \ -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["xxx.xxx.xxx.xxx Pribadi IP Server Fisik - Node - tempat penerapan dilakukan "]}} '

Dheeraj Sharma
sumber
0

hapus layanan yang ada dan buat layanan baru yang sama menyelesaikan masalah saya. Masalah saya adalah bahwa load balancing yang didefinisikan oleh IP I digunakan sehingga titik akhir eksternal sedang menunggu. Ketika saya mengubah IP penyeimbangan beban baru, masih tidak berfungsi. Akhirnya, hapus layanan yang ada dan buat yang baru memecahkan masalah saya.

Shakira Sun
sumber
0

Periksa log kube-controller. Saya bisa mengatasi masalah ini dengan mengatur tag clusterID ke contoh EC2 saya menggunakan cluster.

Rakesh Pelluri
sumber
0

Jika itu adalah cluster k8s pribadi Anda, MetalLB akan lebih cocok. Berikut langkah-langkahnya.

Langkah 1: Instal MetalLB di cluster Anda

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

Langkah 2: Konfigurasikan dengan menggunakan 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 

Langkah 3: Buat layanan Anda untuk mendapatkan IP eksternal (akan menjadi IP pribadi).

FYR:

Sebelum instalasi MetalLB: masukkan deskripsi gambar di sini

Setelah instalasi MetalLB: masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Thilee
sumber
0

Menambahkan solusi untuk mereka yang mengalami kesalahan ini saat berjalan .

Pertama-tama dijalankan:

kubectl describe svc <service-name>

Dan kemudian tinjau eventsbidang dalam contoh output di bawah ini:

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

Tinjau pesan kesalahan:

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

Dalam kasus saya, alasan tidak ada subnet yang cocok untuk membuat ELB adalah:

1: Cluster EKS digunakan pada grup subnet yang salah - subnet internal dan bukan menghadap publik.
(*) Secara default, layanan tipe LoadBalancermembuat penyeimbang beban yang menghadap publik jika tidak ada service.beta.kubernetes.io/aws-load-balancer-internal: "true"anotasi yang diberikan).

2: Subnet tidak ditandai sesuai dengan persyaratan yang disebutkan di sini .

Memberi tag VPC dengan:

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

Memberi tag pada subnet publik dengan:

Key: kubernetes.io/role/elb
Value: 1
RtmY
sumber