dịch vụ kubernetes ip bên ngoài đang chờ xử lý


142

Tôi đang cố gắng triển khai nginx trên kubernetes, phiên bản kubernetes là v1.5.2, tôi đã triển khai nginx với 3 bản sao, tập tin YAML bên dưới,

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

và bây giờ tôi muốn hiển thị cổng 80 của nó trên cổng 30062 của nút, vì tôi đã tạo một dịch vụ bên dưới,

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

dịch vụ này đang hoạt động tốt như mong muốn, nhưng nó đang hiển thị như đang chờ xử lý không chỉ trên bảng điều khiển kubernetes trên thiết bị đầu cuối. Đầu ra thiết bị đầu cuốiTrạng thái bảng Dash

vì vậy hãy giúp tôi giải quyết vấn đề này Cảm ơn ...

Câu trả lời:


177

Dường như bạn đang sử dụng một tùy chỉnh Kubernetes cụm (sử dụng minikube, kubeadmhoặc tương tự). Trong trường hợp này, không có LoadBalancer được tích hợp (không giống như AWS hoặc Google Cloud). Với thiết lập mặc định này, bạn chỉ có thể sử dụng NodePorthoặc Bộ điều khiển Ingress.

Với Bộ điều khiển Ingress, bạn có thể thiết lập một tên miền ánh xạ tới nhóm của bạn; bạn không cần cung cấp cho Dịch vụ của mình LoadBalancerloại nếu bạn sử dụng Bộ điều khiển Ingress.


Cảm ơn bạn rất nhiều @javier điều này thực sự hữu ích. Tôi đã giải quyết vấn đề của tôi từ doc trên.
Pankaj Jackson

9
Điều này không thực sự trả lời câu hỏi? Người dùng đang sử dụng LoadBalancerlàm loại dịch vụ là loại dịch vụ hợp lệ. NodePortingresslà những cách khác để làm điều đó nhưng không thực sự giải quyết vấn đề, phải không?
Raptor

2
Đây là một loại dịch vụ hợp lệ nhưng nó đang được sử dụng trong một nền tảng không tương thích (ít nhất là theo mặc định). Để sử dụng LoadBalancer, bạn phải có một nền tảng có thể cung cấp IP bên ngoài cho các nhóm, đây là điều mà Google Cloud hoặc AWS làm.
Javier Salmeron

2
Tôi đang sử dụng kubeadm trên AWS. Tôi vẫn có thể LoadBalancerchứ?
jiashenC

3
Nếu bạn đang sử dụng minikube, hãy chạy "đường hầm minikube". Bây giờ kiểm tra dịch vụ của bạn, bạn sẽ nhận được ip công cộng. Đây là tài liệu để biết thêm thông tin minikube.sigs.k8s.io/docs/t task / loadbalancer
Ravi

73

Nếu bạn đang sử dụng Minikube, có một lệnh ma thuật!

$ minikube tunnel

Hy vọng ai đó có thể tiết kiệm một vài phút với điều này.

Liên kết tham khảo https://minikube.sigs.k8s.io/docs/handbook/accessing/#USE-minikube-tunnel


Tôi đã thử minikube tunnelvà nó thực sự giải quyết được pendingvấn đề, nhưng sau đó IP bên ngoài mới không hoạt động: Tôi gặp lỗi hết thời gian ...
a.barbieri

@ a.barbieri đảm bảo bạn đang sử dụng ip đường hầm thay vì ip minikube. "vá ingress-nginx với IP 10.106.102.98"
Peter Zhou

2
vâng cảm ơn bạn Peter. Sẽ thử. Dù sao, chuyển sang Docker Desktop Tôi đã có thể khắc phục vấn đề này với cài đặt bên ngoài hoạt động trực tiếp trên localhost.
a.barbieri

3
Mẹo tiết kiệm thời gian tuyệt vời để trình diễn!
jgitter

49

Nếu bạn không sử dụng GCE hoặc EKS (bạn đã sử dụng kubeadm), bạn có thể thêm externalIPsthông số kỹ thuật vào dịch vụ YAML của mình. Bạn có thể sử dụng IP được liên kết với giao diện chính của nút như eth0. Sau đó, bạn có thể truy cập dịch vụ bên ngoài, sử dụng IP bên ngoài của nút.

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

2
Phải có một thông tin còn thiếu: "cácIP bên ngoài không được quản lý bởi Kubernetes và là trách nhiệm của quản trị viên cụm." ( kubernetes.io/docs/con accept / service-networking / service ). Có một số loại "bộ điều khiển" tôi phải cài đặt không?
Daniel Alder

Tôi đang theo hướng dẫn của Kubernetes ( kubernetes.io/docs/tutorials/statless-application/guestbook ) và nó hoạt động tốt với kubeadm
Eduardo

Cảm ơn bạn - xuất sắc, làm việc như mong đợi. Tôi đã tiếp xúc với Dịch vụ với các nút mạng IP hiện có thể truy cập bên ngoài cụm
Vlad Gulin


21

Tôi đã tạo một cụm nút k8s bằng cách sử dụng kubeadm. Khi tôi đã cố gắng PortForwardProxy kubectl , nó cho thấy IP bên ngoài như chưa giải quyết.

$ 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

Trong trường hợp của tôi, tôi đã vá dịch vụ như thế này:

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

Sau đó, nó bắt đầu phục vụ trên IP công cộng

$ 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
Có lẽ bạn nên đề cập đến việc "172.31.71.218" đến từ đâu?
EuRBamarth

Cuối cùng, một câu trả lời cho cách vá. Cám ơn vì đã chia sẻ.
Srikant

5

Nếu chạy trên minikube , đừng quên đề cập đến không gian tên nếu bạn không sử dụng mặc định.

dịch vụ minikube << service_name >> --url --namespace = << namepace_name >>


4

Nếu bạn đang sử dụng minikube thì hãy chạy các lệnh bên dưới từ terminal

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

2

cùng một vấn đề:

os> kubectl có được svc phải-sabertooth-wordpress

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT (S)
right-sabertooth-wordpress LoadBalancer 10.97.130.7 "đang chờ xử lý" 80: 30454 / TCP, 443: 30427 / TCP

os> danh sách dịch vụ minikube

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

| Tên không gian | TÊN | URL |

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

| mặc định | kubernetes | Không có cổng nút |

| mặc định | phải-sabertooth-mariadb | Không có cổng nút |

| mặc định | phải-sabertooth-wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| hệ thống kube | kube-dns | Không có cổng nút |

| hệ thống kube | máy xới-triển khai | Không có cổng nút |

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

Tuy nhiên, nó có thể truy cập thông qua http://192.168.99.100:30454 .


2

Theo câu trả lời của @ Javier. Tôi đã quyết định thực hiện "vá IP bên ngoài" cho bộ cân bằng tải của mình.

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

Điều này sẽ thay thế 'đang chờ xử lý' bằng một địa chỉ IP được vá mới mà bạn có thể sử dụng cho cụm của mình.

Để biết thêm về điều này. Vui lòng xem bài đăng của karthik trên hỗ trợ LoadBalancer với Minikube cho Kubernetes

Không phải là cách sạch nhất để làm điều đó. Tôi cần một giải pháp tạm thời. Hy vọng điều này sẽ giúp ai đó.


1

Sử dụng NodePort:

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

kubectl trưng bày triển khai đăng nhập người dùng --type = NodePort --name = user-login-service

kubectl mô tả dịch vụ đăng nhập người dùng dịch vụ (Lưu ý xuống cổng)

thông tin cụm kubect (IP-> Nhận IP nơi chủ đang chạy)

Dịch vụ của bạn có thể truy cập tại (IP) :( cổng)


1

Khi sử dụng Minikube, bạn có thể nhận IP và cổng thông qua đó bạn có thể truy cập dịch vụ bằng cách chạy dịch vụ minikube kubia-http.


1

Nếu bạn không ở trên đám mây được hỗ trợ (aws, azure, gcloud, v.v.), bạn không thể sử dụng LoadBalancer mà không có MetalLB https://metallb.universe.tf/ nhưng nó đã ở bản beta ..


1

LoadBalancer ServiceType sẽ chỉ hoạt động nếu cơ sở hạ tầng bên dưới hỗ trợ tự động tạo Load Balancer và có hỗ trợ tương ứng trong Kubernetes, như trường hợp của Google Cloud Platform và AWS. Nếu không có tính năng này được định cấu hình, trường địa chỉ IP LoadBalancer sẽ không được điền và vẫn ở trạng thái chờ xử lý và Dịch vụ sẽ hoạt động giống như dịch vụ loại NodePort


1

Bạn có thể vá IP của Node nơi các pod được lưu trữ (IP riêng của Node), đây là cách giải quyết dễ dàng.

Tham khảo với các bài viết trên, Sau đây làm việc cho tôi:

dịch vụ vá kubectl my-loadbalancer-service-name \ -n lb-service-namepace \ -p '{"spec": {"type": "LoadBalancer", "outsIPs": ["xxx.xxx.xxx.xxx Riêng tư IP của Máy chủ Vật lý - Nút - nơi triển khai được thực hiện "]}} '


0

xóa dịch vụ hiện có và tạo cùng một dịch vụ mới giải quyết vấn đề của tôi. Vấn đề của tôi là Ip cân bằng tải mà tôi xác định được sử dụng để điểm cuối bên ngoài đang chờ xử lý. Khi tôi thay đổi IP cân bằng tải mới, nó vẫn không hoạt động. Cuối cùng, xóa dịch vụ hiện có và tạo một dịch vụ mới giải quyết vấn đề của tôi.


0

Kiểm tra nhật ký bộ điều khiển kube. Tôi đã có thể giải quyết vấn đề này bằng cách đặt các thẻ clusterID thành thể hiện ec2 mà tôi đã triển khai cụm trên.


0

Nếu đó là cụm k8s riêng tư của bạn, MetalLB sẽ phù hợp hơn. Dưới đây là các bước.

Bước 1: Cài đặt MetalLB trong cụm của bạn

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

Bước 2: Cấu hình nó bằng cách sử dụng một 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 

Bước 3: Tạo dịch vụ của bạn để nhận IP bên ngoài (mặc dù sẽ là IP riêng).

Tài chính

Trước khi cài đặt MetalLB: nhập mô tả hình ảnh ở đây

Sau khi cài đặt MetalLB: nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


0

Thêm giải pháp cho những người gặp phải lỗi này khi chạy trên .

Trước hết chạy:

kubectl describe svc <service-name>

Và sau đó xem lại eventstrường trong đầu ra ví dụ dưới đây:

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

Xem lại thông báo lỗi:

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

Trong trường hợp của tôi, lý do không có mạng con phù hợp nào được cung cấp để tạo ELB là:

1: Cụm EKS đã được triển khai trên nhóm mạng con sai - mạng con nội bộ thay vì phải đối mặt với công chúng.
(*) Theo mặc định, các dịch vụ loại LoadBalancertạo cân bằng tải đối diện công khai nếu không có service.beta.kubernetes.io/aws-load-balancer-internal: "true"chú thích nào được cung cấp).

2: Các mạng con không được gắn thẻ theo các yêu cầu được đề cập ở đây .

Gắn thẻ VPC với:

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

Gắn thẻ các mạng con công cộng với:

Key: kubernetes.io/role/elb
Value: 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.