この記事の紹介
1. サービスの詳細説明と基本的な使い方
1. サービスの定義
Service は Kubernetes のコア概念の 1 つです. Service を作成すると、同じ機能を持つコンテナー アプリケーションのグループに統一されたエントリ アドレスが提供され、バックエンドの各コンテナー アプリケーションに要求の負荷が分散されます。
yaml 形式の完全なサービス定義ファイルは次のとおりです。
apiVersion: v1 #版本号
kind: Service
metadata: #元数据
name: string #Service名称
namespace: string #命名空间,默认为default
labels: #自定义标签属性列表
- name: string
annotations: #自定义注解属性列表
- name: string
spec: #详细描述
selector: [] #Label Selector配置
type: string #Service的类型
clusterIP: string #虚拟服务的IP地址
sessionAffinity: string #是否支持Session
ports: #Service需要暴露的端口列表
- name: string #端口名称
protocol: string #端口协议,支持TCP/UDP,默认TCP
port: int #服务监听的端口号
targetPort: int #需要转发到后端Pod的端口号
nodePort: int
status:
loadBalancer: #外部负载均衡器
ingress:
ip: string #外部负载均衡器IP地址
hostname: string #主机名
2. サービスの基本的な利用方法
一般に、外部にサービスを提供するアプリケーションは、何らかのメカニズムを介して実装する必要があります。コンテナー アプリケーションの場合、最も簡単な方法は、TCP/UDP メカニズムを介して実装し、IP ポート番号をリッスンすることです。
次のケース: 基本的な機能を備えたサービスを作成します。
apiVersion: v1
kind: ReplicationController
metadata:
name: mywebapp
spec:
replicas: 2
template:
metadata:
name: mywebapp
labels:
app: mywebapp
spec:
containers:
- name: mywebapp
image: tomcat
ports:
- containerPort: 8080
次に、kubectl get pods -l app=mywebapp -o yaml | grep podIP
コマンドて Pod の IP アドレスとポート番号を取得し、最後に使用curl podIP:8080
して Tomcat サービスにアクセスします。
ただし、Pod の IP とポート番号を介して直接アプリケーション サービスにアクセスすることは信頼できないことを知っておく必要があります。Pod が配置されているノードに障害が発生した場合、Pod は Kubenetes によって別のノードにスケジュール変更され、Pod アドレスが変化する。
この問題を回避するには、最初に yaml ファイルを構成して Service を定義し、次に kubectl create を介してそれを作成します。これにより、Service のアドレスを介してバックエンド Pod にアクセスできるようになります。
次のケース: 最初に Service yaml ファイルvim
を定義します。
apiVersion: v1
kind: Service
metadata:
name: mywebapp-svc
spec:
ports:
- port: 8081
targetPort: 8080
selector:
app: mywebapp
次に、コマンドで作成したサービスの IP アドレスをkubectl get svc
取得。
最後に、コマンドcurl IP:8081
を使用して Pod にアクセスします。
ここでは、サービスを定義するファイルで 8081 を使用して 8080 をマップするため、8081 のポート番号を使用します。
3. マルチポートサービス
コンテナー アプリケーションは複数のポートでサービスを提供する必要がある場合もあるため、Service の定義では、複数のアプリケーション サービスに対応する複数のポートに設定できます。形式は次のとおりです。
apiVersion: v1
kind: Service
metadata:
name: mywebappService
spec:
ports:
- port: 8080
targetPort: 8080
name: web
- port: 8005
targetPort: 8005
name: management
selector:
app: mywebapp
4. 外部サービス サービス
一部の特別なサービス環境では、アプリケーション システムは外部データベースをバックエンド サービスとして接続するか、別のクラスター内のサービスをサービスのバックエンドとして使用する必要があります。これは、サービスを作成无Label Selector
する。形式は次のとおりです。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
-----------------------
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- IP: 目标pod IP
ports:
port: 8080
ラベル セレクターのないサービスと通常のサービスの違いは、ラベルを指定するためのセレクター ラベルがなくEndpoints
、同名
アクセスする Pod にマップするために指定されたメタデータを作成する必要があることです。
2. 本サービスの存在意義
1. Pod が切断されないようにする (サービス ディスカバリ)
通常、Web サイトはフロントエンドとバックエンドの 2 つの部分で構成されており、バックエンド サービスにはフロントエンド ページでの操作を通じてアクセスします。たとえば、フロントエンドに 3 つの Pod、バックエンドに 3 つの Pod がある場合、このアクセス プロセスもフロントエンド Pod を介してバックエンド Pod に入ります.最も一般的な方法は、Pod の IP を介してアクセスすることです住所。
ただし、Pod の IP アドレスは固定ではなく、たとえばアップグレードのロールバックや更新が行われると、IP アドレスが変更されます。Pod にアクセスし、数分後に再び Pod にアクセスすると、何らかの操作により IP が存在しなくなります。これを Pod の切断と呼びます。
Service はこの問題を解決するだけである. 具体的な実装方法は, 各 Pod が独自の IP と名前を使用して Service (登録センター) に「登録」を行ってから運用することである. アクセスする際には, まず Service にアクセスして登録用途を見つける. IP を確認してから、もう一度アクセスしてください。Pod の IP が変更された場合、サービス IP の変更ができるだけ早く通知されるため、他のサービスは再度アクセスするときに新しい IP を使用します。
2. Pod アクセス ポリシーのセットを定義する (負荷分散)
フロントエンドの Pod がバックエンドにアクセスし、バックエンドに複数の Pod がある場合、どの Pod にアクセスするかが問題になります。このとき、アクセス要求を異なる Pod に均等に分散できるようにする役割、つまり実装が Service に求められます负载均衡
。割り当てルールは、Pod アクセス ポリシーの定義も実装する などに基づく响应时间
、割り当て并发量
られる、または に従って割り当てられます。空闲时间
3. Pod と Service の関係
まず、次のように、Pod と Service も Label と selector ラベルを介してリンクされます。
#service中
selector:
app: redis
#pod中
labels:
app: redis
次に、Pod のサービス ディスカバリと負荷分散は、サービスを通じて実装されます。
サービスの 4 つ、3 つの一般的なタイプ
- ClusterIP: 通常、クラスター内で使用されます。
- NodePort: 外部からアプリケーションにアクセスするときに使用されます。
- LoadBalancer: 外部からアプリケーションにアクセスするときに使用され、パブリック クラウド環境でも使用できます。