2017-05-03 5 views
1

私のクラスタでサンプルアプリケーションを実行しています。私は3つのコンテナを持つwebappポッドを持っています。それぞれ別々のspringboot webserviceとして動作します。従業員、test1とtest2。私の仮定は、Webサービスがノード上30062上で実行されていることであり、依存複数のマッピングを持つKubernetes for Java WebサービスでnodePortsを公開 -

apiVersion: v1 
kind: Pod 
metadata: 
    name: webapp 
    labels: 
    name: webapp 
spec: 
    containers: 
    - 
     resources: 
     limits: 
      cpu: 0.5 
     image: kube/employee 
     imagePullPolicy: IfNotPresent 
     name: wsemp 
     ports: 
     - containerPort: 8080 
      name: wsemp 
    - 
     resources: 
     limits: 
      cpu: 0.5 
     image: kube/test1 
     imagePullPolicy: IfNotPresent 
     name: wstest1 
     ports: 
     - containerPort: 8081 
      name: wstest1 
    imagePullSecrets: 
    - name: myregistrykey 

全体のコンテキストを持つように更新 - これはポッドの仕様は、以下である

apiVersion: v1 kind: Service metadata: labels: name: webapp name: webappservice spec: ports: - port: 8080 nodePort: 30062 type: NodePort selector: name: webapp

下に示されて露出サービスマッピング、私はWebサービスにアクセスできるようになります。例:http://11.168.24.221:30062/employeeおよびhttp://11.168.24.221:30062/test1/

下の従業員コンテナとtest1コンテナからログを分離します。

s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/employee],methods=[GET]}" onto public java.util.List<employee.model.Employee> employee.controller.EmployeeController.getAll() 
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/test1/],methods=[GET]}" onto public java.util.List<model.Test1> test1.controller.Test1Controller.getAll() 

問題はhttp://11.168.24.221:30062/employeeです。正しくWebサービスにヒットします。しかし、私がhttp://11.168.24.221:30062/test1/を押すと、上記のログの中でtest1/mappingが利用できないと言われています。マッピングは明らかに利用可能です。エラーメッセージはWhitelabel Error Page /です。このアプリケーションには/ errorの明示的なマッピングがないため、これをフォールバックとみなしています。

私が間違っていることは何ですか?

+0

ハングオン、これは完全なサービス仕様ですか?ポート8081のマッピングも指定していませんか? –

+0

https://kubernetes.io/docs/concepts/services-networking/service/#multi-port-services –

+1

のように、仕様全体を貼り付けました。 EMP ポート:8080 nodePort: - : ポート:名前 あなたはそれがこの仕様のようでなければなら意味30062 - 名前:TEST1 ポート:8081 nodePort:30063私は30063. – Vikram

答えて

2

あなたのサービスyamlは、ポート8080をNodePort 30062として公開していることを明確に示しています。-port:8081 nodePort:30063を既存の設定に単純に追加することはできますが、あなたの2つのサービスは別々のコンテナです。配備とサービスをkubernetesで実現します。 1つは従業員用、もう1つはtest1サービス用です。これにより、それらを個別に開発、展開、テストすることができます。また、PODで複数のコンテナを使用することは一般的には推奨されていません(いくつかの例外を除き)。thisを参照してください。

サービスに関する2つのyamlsがあります。名前、ラベル、セレクタを変更したことに注意してください。あなたはそれが、すべての展開を使用していない

apiVersion: v1 
kind: Service 
metadata: 
labels: 
    name: employeeservice 
name: employeeservice 
spec: 
ports: 
    - port: 8080 
    nodePort: 30062 
type: NodePort 
selector: 
    app: employeeservice 

apiVersion: v1 
kind: Service 
metadata: 
labels: 
    name: test1service 
name: test1service 
spec: 
ports: 
    - port: 8081 
    nodePort: 30063 
type: NodePort 
selector: 
    app: test1service 

が推奨されていません、あなたはkubernetes自己修復能力、例えば恩恵を受けるません。ポッドは健康でないときに自動的に交換されます。

展開の作成はeasyです。ここでは、POD仕様を含む展開の2つの例があります。上記のサービスのセレクタに合わせて名前を変更しました。レプリカ数を1に設定しているため、1つのPODが1つのデプロイメントごとに維持されますが、それを高い数値に設定することで簡単に拡張できます。

apiVersion: apps/v1beta1 
kind: Deployment 
metadata: 
    name: employeeservice-deployment 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: employeeservice 
    spec: 
     containers: 
     -resources: 
      limits: 
      cpu: 0.5 
     image: kube/employee 
     imagePullPolicy: IfNotPresent 
     name: wsemp 
     ports: 
      - containerPort: 8080 
      name: wsemp 
     imagePullSecrets: 
     - name: myregistrykey 

​​

また、あなたのサービスがDNSを通じて名前で到達可能であることに注意してください。したがって、上記のyamlsを使用すると、ノードのIPアドレスを使用する代わりに、クラスタ内のサービスにhttp://employeeservice/employeeという名前のサービスを照会できるようになります。クラスタの外部からアクセスするには、指定されたNodePortsを使用できます。通常は、すべてのノードにルーティングするある種類のロードバランサを介してNodePortsを使用します。

+0

でそれを打つ場合、これは実際に動作しますOswinありがとう。それが助けになりました。 – Vikram

関連する問題