web-dev-qa-db-ja.com

kubernetesサービスの着信ポートをDockerコンテナの別のポートにマッピングする

これは私が問題の流れを理解する方法です:

  1. Kubernetesサービスをリクエストするとき(たとえばhttp経由で)、ポート80を使用しています。
  2. リクエストはポッドに転送されます(ポート80のまま)
  3. ポートは、ポート80を公開する(docker)コンテナーに要求を転送します
  4. コンテナがリクエストを処理します

ただし、私のコンテナは別のポート、たとえば3000を公開しています。ステップ2または3で80:3000のようなポートマッピングを作成するにはどうすればよいですか?

Kubernetesのドキュメントにはtargetporthostportのような紛らわしいオプションがありますが、役に立ちませんでした。 kubectl port-forwardデバッグのために、ローカル(開発)マシンのポートのみを特定のポッドに転送しているようです。

これらは、GoogleCloudでサービスを設定するために使用するコマンドです。

kubectl run test-app --image=eu.gcr.io/myproject/my_app --port=80
kubectl expose deployment test-app --type="LoadBalancer"
8
Maiko Kuppe

2番目のコマンドにいくつかの引数を追加する必要があることがわかりました。

kubectl expose deployment test-app --type="LoadBalancer" --target-port=3000 --port=80

これにより、着信httpトラフィック(ポート80)をポート3000のポッドに転送するサービスが作成されます。

このすべてを行うためのより良い方法は、yamlファイルを使用することですservice.yamlおよびdeployment.yamlと呼び出し

kubectl create -f deployment.yaml
kubectl create -f service.yaml

ファイルにはこれらの内容が含まれています

# deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
        - name: user-app
          image: eu.gcr.io/myproject/my_app
          ports:
            - containerPort: 3000

そして

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: test-app
  ports:
  - port: 80
    targetPort: 3000
  type: LoadBalancer

サービスのセレクターは、デプロイメントのラベルと一致する必要があることに注意してください。

10
Maiko Kuppe