【クラウドネイティブ|Kubernetesをゼロから学ぶ】 17. Kubernetesコアテクノロジー サービス

この記事はコラム「k8sをゼロから学ぶ」に収録されています
前回の記事:k8spodのコンテナ検出と起動戦略クリックジャンプ

ここに画像の説明を挿入

サービスをすばやく理解する

前に、Deployment はサービスをサポートするマイクロサービス Pod の数を保証するだけで、これらのサービスへのアクセス方法の問題を解決しないことを学びました。Pod は実行中のサービスの単なるインスタンスであり、あるノードでいつでも停止し、別のノードで新しい IP を使用して新しい Pod を開始する可能性があるため、明確な IP とポート番号でサービスを提供することはできません。

サービスを安定的に提供するには、サービスの検出機能と負荷分散機能が必要です。サービス検出によって行われる作業は、クライアントがアクセスするサービスに対応するバックエンド サービス インスタンスを見つけることです。K8S クラスターでは、クライアントがアクセスする必要があるサービスは Service オブジェクトです。各サービスはクラスター内の有効な仮想 IP に対応し、サービスは仮想 IP を介してクラスター内でアクセスされます。

K8S クラスターでは、マイクロサービスの負荷分散は kube-proxy によって実装されます。kube-proxy は、k8s クラスター内のロード バランサーです。これは分散プロキシ サーバーであり、K8S の各ノードに 1 つずつあります。この設計は、そのスケーラビリティの利点を反映しており、サービスにアクセスする必要があるノードが増えるほど、負荷分散機能を提供する kube-proxy が増えます。可用性ノードも増加します。対照的に、通常はサーバー側の負荷分散にリバース プロキシを使用しますが、リバース プロキシの高可用性の問題をさらに解決する必要があります。

サービスの存在意義

Pod が切断されないようにする [Service Discovery]

Pod が作成されるたびに IP アドレスに対応するため、この IP アドレスは有効期間が短く、Pod が更新されるたびに変更されます. フロントエンド ページに複数の Pod があり、また、バックエンドに複数の Pod があるため、相互にアクセスする場合、登録センターを通じて Pod の IP アドレスを取得し、対応する Pod にアクセスする必要があります。
画像の説明を追加してください

Pod アクセス ポリシーの定義 [負荷分散]

The Pod at the front end of the page has access the Pod at the back end through the Service layer, and the Service can also perform loadbalancing here. 負荷分散には、次のような多くの実装戦略があります。

  • ランダム
  • ポーリング
  • 応答率
    画像の説明を追加してください

Pod と Service の関係

ここで、ポッドとサービスの間の関連付けは、依然としてラベルとセレクター [コントローラーと同じ] に基づいています。

画像の説明を追加してください
サービスにアクセスするときは、実際には IP アドレスが必要ですが、この IP はポッドの IP アドレスではなく、仮想 IP です。vip

一般的なサービスの種類

サービスには 3 つの一般的なタイプがあります。

  • ClusterIp: クラスター内のアクセス
  • NodePort: 外部アクセス アプリケーションによって使用されます
  • LoadBalancer: 外部アクセス アプリケーション、パブリック クラウドに使用

サービスの構成情報を含むファイルをエクスポートできます

kubectl expose deployment web --port=80 --target-port=80 --dry-run -o yaml > service.yaml

service.yaml は次のようになります

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
status:
  loadBalancer: {
    
    }

If we don't set it, the first method, ClusterIp, is used by default, つまり, it can only be used within the cluster. type フィールドを追加して、サービス タイプを設定できます。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: NodePort
status:
  loadBalancer: {
    
    }

コマンドを変更した後、次を使用してポッドを作成します

kubectl apply -f service.yaml

次に、NodePort タイプに正常に変更されたことを確認できます。最後に残った方法は、LoadBalanced: パブリック クラウドを使用した外部アクセス アプリケーションです。

通常、ノードはイントラネット上に配置され、外部ネットワークには通常アクセスできないため、アクセスするにはどうすればよいでしょうか?

  • 外部ネットワーク経由でアクセスできるマシンを探し、nginx とリバース プロキシをインストールします。
  • アクセス可能なノードを nginx に手動で追加する

LoadBalancer を使用すると、nginx の機能と同様の負荷分散コントローラーが存在するため、自分で nginx に追加する必要はありません。

レイヤー 4 負荷分散サービス: 概念と原理の解釈

サービスを提供する理由

kubernetes では、Pod にはライフサイクルがあり、Pod が再起動すると、その IP が変更される可能性があります。すべてのサービスが Pod の IP アドレスを書き込んで停止すると、Pod がハングまたは再起動し、再起動したばかりの Pod に関連付けられている他のサービスが、関連付けられている Pod を見つけることができなくなります。この問題を解決するには、kubernetes で定義しますService リソース オブジェクトを使用して、Service はサービス アクセス エントリを定義します。これを介して、クライアントはサービスの背後にあるアプリケーション クラスタ インスタンスにアクセスできます。サービスは、Pod のグループの論理コレクションであり、Service によってアクセスできます。通常は、次の方法で実装されます。タグセレクター。
画像の説明を追加してください
1. ポッドの IP は頻繁に変更されます. サービスはポッドのプロキシです. クライアントがアクセスするときは、サービスにアクセスするだけでよく、リクエストはポッドにプロキシされます.

2. k8s クラスター外からはポッド IP にアクセスできないため、k8s クラスター外からアクセスできるサービスを作成する必要があります。

サービス概要

サービスは固定アクセス レイヤーです. クライアントは、サービスの IP とポートにアクセスすることで、サービスに関連付けられたバックエンド ポッドにアクセスできます. このサービスの動作は、kubernetes クラスターにデプロイされたアクセサリ (kubernetes dns サービス) に依存します(異なるkubernetes dnsサービス). デフォルトで使用されるdnsのバージョンも異なります. 1.11より前のバージョンはkubeDNSを使用し、新しいバージョンはcorednsを使用します. サービスの名前解決はdnsアタッチメントに依存するため、デプロイする必要があります. k8s が展開された後. dns アタッチメント、kubernetes は、ネットワーク機能 (IP の割り当てなど) をクライアントに提供するために、サードパーティのネットワーク プラグイン (flannel、calico など) に依存する必要があります。各 K8s ノードには、kube-proxy と呼ばれるコンポーネントがあります. kube-proxy のこのコンポーネントは、apiserver のサービス リソースに関する変更情報を常に監視します. マスター上の apiserver と対話し、いつでも apiserver に接続して、 Kubernetes固有のリクエストメソッドwatch(監視)により実現されるサービスリソースに関するリソース変更状況サービスリソースの内容が変更(作成、削除など)されると、その操作はetcdに格納され、次に、バックエンド固有のポッド リソースのルールへのリクエストをスケジュールします。このルールは、サービスの実装方法に応じて iptables または ipvs になる場合があります (ルールは自分で構成できます)。たとえば、新しいサービスが作成された場合、サービスには IP があり、この IP のネットワーク セグメントは、クラスターの作成時に構成されます (デフォルトは 10)。

サービスの仕組み

k8s がサービスを作成すると、ラベル セレクター (ラベル セレクター) に従って Pod を検索し、それに応じてサービスと同じ名前のエンドポイント オブジェクトを作成します. Pod アドレスが変更されると、エンドポイントも変更され、 service はフロントエンド クライアント リクエストを受け取ります。 の場合、エンドポイント経由でアクセスするために転送する Pod のアドレスを見つけます。(Podがどのノードに転送されるかは、負荷分散kube-proxyによって決定されます)

[root@k8smaster node]# kubectl get endpoints
NAME         ENDPOINTS             AGE
kubernetes   192.168.11.139:6443   15d
[root@k8smaster node]# kubectl get pods -n kube-system -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP               NODE     
kube-apiserver-k8smaster            1/1     Running   4          15d   192.168.11.139   k8smaster 
apiserver是绑定了宿主机的网络ip,apiserver这个pod,封装的k8sapiservice服务端口是443,这个service关联的pod是apiserver,ednpoints列表里编写的也是apiserverpod的ip和端口

kubernetes クラスターには 3 種類の IP アドレスがあります

1、Node Network(节点网络):物理节点或者虚拟节点的网络,如 ens33 接口上的网路地址
[root@k8smaster node]# ip addr
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:94:59:0f brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.139/24 brd 192.168.11.255 scope global noprefixroute dynamic ens3

2、Pod network(pod 网络),创建的 Pod 具有的 IP 地址 
[root@k8smaster node]#  kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE  
frontend-d5tr9              1/1     Running   0          23h   10.244.2.30   k8snode    <none>          
Node Network 和 Pod network 这两种网络地址是我们实实在在配置的,其中节点网络地址是配置在节点接口之上,而 pod 网络地址是配置在 pod 资源之上的,因此这些地址都是配置在某些设备之上的,这些设备可能是硬件,也可能是软件模拟的 
 
3、Cluster Network(集群地址,也称为 service network),这个地址是虚拟的地址(virtual ip),没有配置在某个接口上,只是出现在 service 的规则当中。 
[root@xianchaomaster1 ~]# kubectl get svc 
[root@k8smaster node]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   15d

最後に書く

作成するのは簡単ではありません。コンテンツが役立つと思われる場合は、3 つのリンクをフォローしてサポートしてください。間違いがあればコメントで指摘していただければ修正します!
現在更新中のシリーズ:ゼロからk8sを学ぶ ご覧
いただきありがとうございます 記事には個人的な理解が混在しています 誤りがある場合は、私に連絡して指摘してください〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45400861/article/details/126659678