2016-09-22 4 views
3

私はkubernetes/dockerにはとても新しいので、これが愚かな質問であれば謝ります。KubernetesのサービスIPは変更されますか?

私はいくつかのサービスにアクセスしているポッドを持っています。私のコンテナでは、Pythonスクリプトを実行していて、サービスにアクセスする必要があります。現在私はサービスのIPアドレスを使ってこれをやっています。

サービスのIPアドレスは安定していますか、environment variablesを使用する方が良いですか?もしそうなら、それを行う上でのヒントは素晴らしいでしょう。でも、これらのIPアドレスはできません

各ポッドは、独自のIPアドレスを取得している間、Services Documentationの冒頭の段落は、安定したIPアドレスを意味サービスのための動機を与えるが、私はそれが明示的に述べ見ることはない

時間の経過とともに安定することに頼らなければならない。。これは、いくつかのPod(バックエンドと呼ぶ)がKubernetesクラスタ内の他のPod(フロントエンドと呼ぶ)に機能を提供する場合、どのフロントエンドがそのバックエンドをどのように見つけて追跡するのか?

サービスを入力してください。

参照のための私ポッド仕様:

kind: Pod 
apiVersion: v1 
metadata: 
    name: fetchdataiso 
    labels: 
    name: fetchdataiso 
spec: 
    containers: 
    - name: fetchdataiso 
     image: 192.111.1.11:5000/ncllc/fetch_data 
     command: ["python"] 
     args: ["feed/fetch_data.py", "-hf", "10.222.222.51", "-pf", "8880", "-hi", "10.223.222.173", "-pi","9101"] 

答えて

0

サービスIPアドレスが安定しています。 IPアドレス(DNSなど)を検出するには、環境変数を使用する必要があります。

+0

ありがとう、ドキュメントへのリンクは非常に役立つだろう。私の上司は私を信じていない! args内のIPアドレスを環境変数に置き換えようとしました。たとえば、 "$ IQFEED_SERVICE_HOST"ですが、ポッドはちょうどクラッシュし続けました。それらにアクセスする適切な方法は何でしょうか?実行中のコンテナにログインし、IPを表示したecho $ IQFEED_SERVICE_HOSTを実行したため、環境変数が存在することがわかりました。 – Shuaib

0

、あなたのサービスにアクセスするために、クラスタ内のDNSクラスタのアドオンを使用して、あなたのサービスは、名前空間barfooと呼ばれている場合は、おそらく、より意味のある無地のIPアドレス以外である、bar.fooとしてそれにアクセスすることができます。

http://kubernetes.io/docs/user-guide/services/#dns

+0

ありがとうございます。私はどのように私のポッドの仕様でそれを使用するだろうか?私は2つの名前空間** kube-system **と** default **を持っています。私のサービス名は** ssdb-feed **です。では、IPアドレスの代わりにssdb-feed.kube-systemを渡しますか?私はそれを試み、ポッドがクラッシュする。 – Shuaib

+0

@ Shuaibあなたのサービスはおそらくデフォルト名前空間にあります。あなたのポッドが同じ名前空間にある限り、 'ssdb-feed'を渡すだけで動作します。確認する場合は、ビジーボックスポッドを実行して、クラスタ内からサービスの名前解決を試みることができます。 –

0

が短い答えは

$ kubectl apply -f test.svc.yml 
service "test" created 

$ kubectl get svc 
NAME   CLUSTER-IP  EXTERNAL-IP PORT(S) AGE 
kubernetes 10.12.0.1  <none>  443/TCP 10d 
test   10.12.172.156 <none>  80/TCP 6s 

$ kubectl delete svc test 
service "test" deleted 

$ kubectl apply -f test.svc.yml 
service "test" created 

$ kubectl get svc 
NAME   CLUSTER-IP  EXTERNAL-IP PORT(S) AGE 
kubernetes 10.12.0.1  <none>  443/TCP 10d 
test   10.12.254.241 <none>  80/TCP 3s 

長い答えは、あなたが右のそれを使用する場合、あなたはそれで問題がないということです「はい、サービスIPを変更することができます」されて参照してください。あなたの質問の範囲でさらに重要なことは、ENV変数がDNS/IP結合より悪いことです。 サービスまたはservice.namespaceまたはtest.default.svc.cluster.localの行に沿った何かのような完全なパスでもサービスを参照する必要があります。これはClusterIPのサービスに解決され、ENVとは反対に新しいIPに再解決されます(明示的に削除してサービスを再作成しない限り起こりません)。実行中のプロセスのENVは変更されません。

+0

私は、あなたがそれを削除/再作成することを決定するまで、サービスIPは安定したままであると考えています。しかし、私は、DNSの名前を使用する方が良いことに同意します。 –

+0

DNS(クライアントが古いエントリをキャッシュすることができる)よりも、サービス検出のためのより良い方法があります(サービスが再起動されます)。 – prat0318

+0

@ prat0318実際、これは非常にまれなケースです。私の例のように 'delete'と' create'ではなく 'apply'を使うのが普通です。そのため、kubernetesのサービス発見は非常に強力です(基礎となるポッドやIP変更は変更されますが、まったく変更されなかったclusterIPがまだ指摘されています) –

関連する問題