【クラウドネイティブ】kubernetesでのサービスディープラーニング

サービス

目次

1 サービスとは

2つの特徴

3 サービスとポッドの関係

4 サービスの利用

5マルチポート

6種類タイプ

7 内部通信


1 サービスとは

1.1 定義

公式 Web サイトのアドレス: Service | Kubernetes

ポッドまたはポッドのグループ上で実行されているネットワーク アプリケーションをネットワーク サービスとして公開する方法。

一般的な定義: サービスは、ポッドにネットワーク サービスを提供する方法です。

1.2 サービスが必要な理由

質問: 一連の Pod (「バックエンド」と呼ばれる) がクラスター内の他の Pod (「フロントエンド」と呼ばれる) に機能を提供する場合、フロントエンドはどのようにして接続先の IP アドレスを把握し、追跡するのでしょうか。バックエンド部分のワークロードを処理するためにそれを使用できますか?

画像-20230307133342270

これが画像処理バックエンドの場合、3 つのコピーが実行されます。これらのコピーは交換可能です。フロントエンドはどのバックエンド コピーを呼び出すかを気にする必要はありません。ただし、このグループのバックエンド プログラムを構成する Pod は実際に変更される可能性があるため、フロントエンド クライアントは知る必要はなく、知る必要がなく、このグループのバックエンドのステータスを追跡する必要もありません。Service によって定義された抽象化により、この接続を分離できます

2つの特徴

  • サービスはラベルを介して対応するポッドを関連付けます

  • Servcie ライフサイクルは Pod にバインドされていないため、Pod の再作成によって IP が変更されることはありません。

  • トラフィックを別のポッドに自動的に転送するロードバランシング機能を提供します

  • クラスターの外部にアクセスポートを提供します

  • クラスターにはサービス名を通じてアクセスできます。

3 サービスとポッドの関係

4 サービスの利用

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
      restartPolicy: Always
  selector:
    matchLabels:
      app: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - port: 8080 #service 端口
      targetPort: 80 #容器端口
      nodePort: 31001 #node 节点端口 固定在 30000-32767 之间
  type: NodePort

注意:节点端口固定在 30000-32767 之间

5マルチポート

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
      restartPolicy: Always
  selector:
    matchLabels:
      app: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - port: 8080 #service 端口
      name: write
      targetPort: 80 #容器端口
      nodePort: 31001 #node 节点端口 固定在 30000-32767 之间
    - port: 8081
      name: read
      targetPort: 80
      nodePort: 31002
​
  type: NodePort

6種類タイプ

サービス | Kubernetes

一部のアプリケーションの特定の部分 (フロントエンドなど) については、Kubernetes クラスターの外部の IP アドレスに公開したい場合があります。

Kubernetes をServiceTypes使用すると、必要なサービスの種類を指定できます。

  • ClusterIP: サービスはクラスター内で公開されており、クラスター内の他のオブジェクトからのみアクセスできます。これは通常、内部サービスの検出に使用され、クラスターの外部には公開されません。

  • NodePort: ノードの特定のポートでサービスを公開し、ノードの IP アドレスとポート番号を通じてサービスにアクセスできるようにします。これは通常、開発およびテスト環境で使用されます。

  • LoadBalancer: クラウド サービス プロバイダーが提供するロード バランサーを介してサービスをパブリック ネットワークに公開し、外部ユーザーがサービスにアクセスできるようにします。

  • ExternalName: サービスを DNS 名にマップし、通常は外部サービスへのアクセスに使用される DNS 名を介してサービスにアクセスできるようにします。

6.1 ClusterIP タイプ

  • 这是最常用的 Service 类型之一クラスター内に仮想 IP アドレスを作成します。このアドレスには、同じクラスター内の他の Pod からアクセスできますが、クラスター外のリクエストからはアクセスできません。このタイプのサービスは通常、データベース サービスやキャッシュ サービスなどの内部サービスを公開するために使用されます。たとえば、Web アプリケーションではデータベースに接続する必要がある場合がありますが、データベースをアプリケーションの外部に公開する必要はありません。現時点では、ClusterIP タイプのサービスを使用して、アプリケーションがデータベースにアクセスできるようにすることができます。

6.2 ノードポートの種類

  • このタイプのサービスはポートを作成し、それを各クラスター ノードにバインドして、外部トラフィックがサービスにアクセスできるようにします。このタイプは通常、Web アプリケーションや API などのパブリック サービスを公開するために使用されます。たとえば、クラスター内で実行されている Web アプリケーションにクラスターの外部からアクセスする必要がある場合、NodePort タイプのサービスを作成し、nodePortService フィールドを指定してそのサービスをクラスターの外部に公開できます。

  • typeこのフィールドを に設定するNodePort、Kubernetes コントロール プレーンは--service-node-port-rangeフラグで指定された範囲 (デフォルト: 30000 ~ 32767) にポートを割り当てます。

6.3 ロードバランサの種類

  • このタイプのサービスは NodePort に似ていますが、クラウド プロバイダーにロード バランサを作成します。このタイプは通常、クラウド プラットフォームにアプリケーションをデプロイするために使用されます。クラウド プラットフォームのロード バランサーは、クラスター内のノードにトラフィックを分散します。このタイプのサービスはクラウド プラットフォームでのみ使用でき、クラウド ベンダーからのサポートが必要です。

6.4 外部名型

  • このタイプのサービスでは、アクセスする必要がある任意の CNAME DNS エントリにサービスを転送できます。他のタイプのサービスとは異なり、リクエストをポッドにプロキシしません。代わりに、構成された外部アドレスにリクエストを転送します。このタイプのサービスは通常、サービスをクラスター外の他のサービスにプロキシするために使用されます。たとえば、外部ネットワーク上でサービスを実行していて、そのサービスを Kubernetes クラスターで使用したい場合は、タイプ ExternalName のサービスを作成して、サービスの DNS を Kubernetes クラスターに解決できます。

7 内部通信

7.1 ポッドの作成

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql/mysql-server:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: root
        ports:
        - name: mysql
          containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - name: mysql
    port: 3306
    targetPort: 3306
    type: ClusterIP
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      containers:
      - name: nginx
        image: nginx:latest
        #command: ["/bin/sh", "-c"]
        #args:
        #- apt-get update && apt-get install -y mysql-client && nginx -g 'daemon off;'
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 8081
    targetPort: 80
    type: ClusterIP

7.2 相互アクセス

# mysql にアクセスするには nginx と入力します
$ mysql -h mysql -uroot -ppassword 
# 注: ここでの mysql は MySQL サービスの名前であり、ポッドの名前ではありません。

おすすめ

転載: blog.csdn.net/weixin_53678904/article/details/132308877