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

このサービスは正常に機能していますが、kubernetesダッシュボードだけでなく、ターミナルでも保留中と表示されています。 端子出力ダッシュボードの状態

この問題を解決するために私を助けてください。ありがとう...

回答:


177

あなたは(使用してカスタムKubernetesクラスタを使用しているように見えますminikubekubeadmなど)。この場合、(AWSやGoogle Cloudとは異なり)LoadBalancerは統合されていません。このデフォルト設定では、NodePortまたはIngressコントローラーのみを使用できます。

イングレスコントローラあなたの設定あなたのポッドにマップするドメイン名をすることができます。LoadBalancerIngressコントローラーを使用する場合は、サービスにタイプを指定する必要はありません。


@javierさん、本当にありがとうございました。上記のドキュメントから問題を解決しました。
Pankaj Jackson 2017

9
これは本当に質問に答えませんか?ユーザーはLoadBalancer、有効なサービスタイプであるサービスタイプとして使用しています。NodePortそしてingressそれをやってますが、実際に問題を解決していない他の方法、右ですか?
ラプター

2
これは有効なサービスタイプですが、互換性のないプラットフォームで使用されています(少なくともデフォルトでは)。LoadBalancerを使用するには、ポッドに外部IPを提供できるプラットフォームが必要です。これは、Google CloudまたはAWSが行うものです。
ハビエルサルメロン2018年

2
AWSでkubeadmを使用しています。まだできますLoadBalancerか?
jiashenC

3
minikubeを使用している場合は、「minikubeトンネル」を実行します。次に、サービスをチェックして、パブリックIPを取得します。詳細はこちらのドキュメントをご覧くださいminikube.sigs.k8s.io/docs/tasks/loadbalancer
Ravi

73

Minikubeを使用している場合は、魔法のコマンドがあります。

$ minikube tunnel

うまくいけば、誰かがこれで数分節約できるでしょう。

参照リンク https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel


私が試したところminikube tunnel、実際にpending問題は解決しましたが、新しい外部IPが機能しません。タイムアウトエラーが発生します...
a.barbieri

@ a.barbieriは、minikube IPの代わりにトンネルIPを使用していることを確認してください。「IP 10.106.102.98を使用したingress-nginxのパッチ」
Peter Zhou

2
はい、ピーターに感謝します。しようとします。とにかくDocker Desktopに切り替えると、localhostで直接動作するすぐに使える設定でこの問題を克服できました。
a.barbieri

3
デモのための優れた時間節約のヒント!
jgitter

49

GCEまたはEKSを使用していない場合は(使用しましたkubeadmexternalIPs、サービスYAMLに仕様を追加できます。などのノードのプライマリインターフェースに関連付けられたIPを使用できますeth0。その後、ノードの外部IPを使用して、サービスに外部からアクセスできます。

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

2
「externalIPはKubernetesによって管理されておらず、クラスタ管理者の責任です」という欠落している情報があるはずです。(kubernetes.io/docs/concepts/services-networking/service)。インストールする必要がある「コントローラ」の種類はありますか?
Daniel Alder

私はKubernetesチュートリアル(kubernetes.io/docs/tutorials/stateless-application/guestbook)に従っていて、kubeadmで問題なく動作しました
Eduardo

ありがとう-素晴らしい、期待どおりに機能した。サービスをノードのネットワークIPに公開しました。ネットワークIPはクラスターの外部からアクセスできるようになりました
Vlad Gulin


21

kubeadmを使用して単一ノードk8sクラスターを作成しました。PortForwardkubectl proxyを試したところ、外部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 get svc right-sabertooth-wordpress

名前タイプCLUSTER-IP EXTERNAL-IP PORT(S)
right-sabertooth-wordpress LoadBalancer 10.97.130.7 "pending" 80:30454 / TCP、443:30427 / TCP

os> minikubeサービス一覧

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

| ネームスペース| NAME | URL |

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

| デフォルト| kubernetes | ノードポートがありません|

| デフォルト| 右-sabertooth-mariadb | ノードポートがありません|

| デフォルト| 右-sabertooth-wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| kube-system | kube-dns | ノードポートがありません|

| kube-system | tiller-deploy | ノードポートがありません|

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

ただし、その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アドレスに置き換えられます。

これについての詳細。KubernetesのMinikubeでのLoadBalancerサポートに関するkarthikの投稿を参照してください

それを行うための最もクリーンな方法ではありません。一時的な解決策が必要でした。これが誰かを助けることを願っています。


1

NodePortを使用:

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

kubectlがデプロイのユーザーログインを公開する--type = NodePort --name = user-login-service

kubectl describe services user-login-service(ポートを下にメモ)

kubect cluster-info(IP->マスターが実行されているIPを取得)

(IP):(ポート)でサービスにアクセスできます


1

Minikubeを使用する場合、minikube service kubia-httpを実行することで、サービスにアクセスできるIPとポートを取得できます。



1

LoadBalancer ServiceTypeは、基盤となるインフラストラクチャがロードバランサの自動作成をサポートし、Google Cloud PlatformやAWSの場合のように、Kubernetesでそれぞれサポートされている場合にのみ機能します。そのような機能が設定されていない場合、LoadBalancer IPアドレスフィールドは入力されず、保留中のステータスのままであり、サービスはNodePortタイプのサービスと同じように機能します


1

ポッドがホストされているノードのIP(ノードのプライベートIP)にパッチを適用できます。これは簡単な回避策です。

上記の投稿を参考にして、私のために働いた:

kubectlパッチサービス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クラスターが間違ったサブネットグループにデプロイされました-パブリックフェースではなく内部サブネット。
(*)デフォルトでは、タイプのサービスはLoadBalancerservice.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.