サービス
目次
1 サービスとは
1.1 定義
公式 Web サイトのアドレス: Service | Kubernetes
ポッドまたはポッドのグループ上で実行されているネットワーク アプリケーションをネットワーク サービスとして公開する方法。
一般的な定義: サービスは、ポッドにネットワーク サービスを提供する方法です。
1.2 サービスが必要な理由
質問: 一連の Pod (「バックエンド」と呼ばれる) がクラスター内の他の Pod (「フロントエンド」と呼ばれる) に機能を提供する場合、フロントエンドはどのようにして接続先の IP アドレスを把握し、追跡するのでしょうか。バックエンド部分のワークロードを処理するためにそれを使用できますか?
これが画像処理バックエンドの場合、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 クラスターの外部の IP アドレスに公開したい場合があります。
Kubernetes をServiceTypes
使用すると、必要なサービスの種類を指定できます。
-
ClusterIP
: サービスはクラスター内で公開されており、クラスター内の他のオブジェクトからのみアクセスできます。これは通常、内部サービスの検出に使用され、クラスターの外部には公開されません。 -
NodePort
: ノードの特定のポートでサービスを公開し、ノードの IP アドレスとポート番号を通じてサービスにアクセスできるようにします。これは通常、開発およびテスト環境で使用されます。 -
LoadBalancer
: クラウド サービス プロバイダーが提供するロード バランサーを介してサービスをパブリック ネットワークに公開し、外部ユーザーがサービスにアクセスできるようにします。 -
ExternalName
: サービスを DNS 名にマップし、通常は外部サービスへのアクセスに使用される DNS 名を介してサービスにアクセスできるようにします。
6.1 ClusterIP タイプ
-
这是最常用的 Service 类型之一
。クラスター内に仮想 IP アドレスを作成します。このアドレスには、同じクラスター内の他の Pod からアクセスできますが、クラスター外のリクエストからはアクセスできません。このタイプのサービスは通常、データベース サービスやキャッシュ サービスなどの内部サービスを公開するために使用されます。たとえば、Web アプリケーションではデータベースに接続する必要がある場合がありますが、データベースをアプリケーションの外部に公開する必要はありません。現時点では、ClusterIP タイプのサービスを使用して、アプリケーションがデータベースにアクセスできるようにすることができます。
6.2 ノードポートの種類
-
このタイプのサービスはポートを作成し、それを各クラスター ノードにバインドして、外部トラフィックがサービスにアクセスできるようにします。このタイプは通常、Web アプリケーションや API などのパブリック サービスを公開するために使用されます。たとえば、クラスター内で実行されている Web アプリケーションにクラスターの外部からアクセスする必要がある場合、NodePort タイプのサービスを作成し、
nodePort
Service フィールドを指定してそのサービスをクラスターの外部に公開できます。 -
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 サービスの名前であり、ポッドの名前ではありません。