web-dev-qa-db-ja.com

Kubernetesサービスに外部IPを割り当てる

EDIT:私のセットアップの全体的なポイントは、(可能な場合)以下を達成することです:

  • 複数のk8sノードがあります
  • (会社のネットワークから)IPアドレスに連絡するときは、コンテナ/ポッド/サービス/などのいずれかにルーティングする必要があります。
  • そのIPを簡単に設定できるはずです(私のサービスの.yml定義のように)

Docker(古い)Swarmセットアップをk8sに移動できるかどうかを評価するために、小さなKubernetesクラスター(kubeadmで構築)を実行しています。絶対に必要な機能は、MacVlanで行うように、コンテナにIPを割り当てる機能です。

現在のdockerセットアップでは、MacVlanを使用して会社のネットワークからいくつかのコンテナーにIPアドレスを割り当てているため、物理サーバーのように(リバースプロキシなしで)直接アクセスできます。私はk8sで似たようなことを達成しようとしています。

そうだと分かった:

  • Serviceを使用する必要があります
  • LoadBalancerタイプは、互換性のあるクラウドプロバイダー(GCEやAWSなど)専用であるため、使用できません。
  • ExternalIPs を使用する必要があります
  • イングレスリソースはリバースプロキシの一種ですか?

私のyamlファイルは次のとおりです。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
      name: nginx-deployment
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - A.B.C.D

私のサービスがIP A.B.C.D(会社のネットワークの1つ)を取得することを期待していました。 ClusterIPを使用してk8sクラスター内からnginxコンテナーに到達できるため、私の展開は機能しています。

私は何が欠けていますか?または、少なくとも、パケットが来ているかどうかを確認するために、ネットワークトラフィックに関する情報をどこで見つけることができますか?

[〜#〜] edit [〜#〜]

$ kubectl get svc
NAME            CLUSTER-IP     EXTERNAL-IP       PORT(S)   AGE
kubernetes      10.96.0.1      <none>            443/TCP   6d
nginx-service   10.102.64.83   A.B.C.D           80/TCP    23h

ありがとう。

14
Jérôme Pin

これが単なるテスト用の場合は、試してください

kubectl port-forward service/nginx-service 80:80

その後、次のことができます

curl http://localhost:80
9
Chuk Lee

(テストだけでなく、に欠点はありますが)動作する可能性のある解決策は、Podを設定して、ホストネットワークをhostNetwork specフィールドはtrueに設定されています。

それは、単一のポート(マニフェストで指定したcontainerPort)を介してホスト上で常にアクセスできるため、Podを公開するためのサービスが不要であることを意味します。その場合、DNSマッピングレコードを保持する必要はありません。

これは、特定のノードでこのPodの単一のインスタンスしか実行できないことも意味します(欠点について話します...)。そのため、 DaemonSet オブジェクトの適切な候補になります。

Podが引き続き内部Kubernetesホスト名にアクセス/解決する必要がある場合は、dnsPolicy specフィールドセットをClusterFirstWithNoHostNetに設定する必要があります。この設定により、ポッドがK8S DNSサービスにアクセスできるようになります。

例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx-reverse-proxy
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      tolerations:  # allow a Pod instance to run on Master - optional
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - image: nginx
        name: nginx
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

編集: ingress-nginx documentation のおかげでこのトラックに入れられました

4
edouardtheron

外部IPにパッチを適用できます

CMD:$ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'

例:-$ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'

3
Manoj Gudipati

まず、次のコマンドを実行します。

kubectl get -n namespace services

上記のコマンドは、次のような出力を返します。

 NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
backend   NodePort   10.100.44.154         <none>          9400:3003/TCP   13h   
frontend        NodePort   10.107.53.39     <none>        3000:30017/TCP   13h

上記の出力から、外部IPがまだサービスに割り当てられていないことが明らかです。外部IPをbackend serviceに割り当てるには、次のコマンドを実行します。

 kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

外部IPをfrontend serviceに割り当てるには、このコマンドを実行します。

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

次に、名前空間サービスを取得して、外部IPの割り当てを確認します。

kubectl get -n namespace services

次のような出力が得られます。

NAME     TYPE     CLUSTER-IP     EXTERNAL-IP    PORT(S)             AGE
backend  NodePort 10.100.44.154  192.168.0.194  9400:3003/TCP       13h
frontend NodePort 10.107.53.39   192.168.0.194  3000:30017/TCP      13h

乾杯!!! Kubernetes外部IPが割り当てられました。

2
Umar Hayat

kube-keepalived-vip構成を試して、トラフィックをルーティングできます。 https://github.com/kubernetes/contrib/tree/master/keepalived-vip

1
sfgroups

サービスのyamlファイルに「type:NodePort」を追加すると、Webブラウザーまたは外部からアクセスするためのポートが作成されます。私の場合、それは役に立ちました。

0
Abu Shoeb