Kubernetesオブジェクトのサービス

3061 ワード

このセクションを学習する前に、Pod、ReplicaSet、Labelについて基本的な知識を持っていることを確認してください.具体的には、以下の記事を参照してください.
  • KubernetesオブジェクトのPod
  • KubernetesオブジェクトのReplicaSet
  • Kubernetes基本概念のLabel
  • 以前の学習では、ReplicaSetを使用してPodのセットを作成し、可用性の高いサービスを提供することができました.各Podには個別のPod IPが割り当てられるが、次の2つの問題がある.
  • Pod IPはクラスタ内に見られる仮想IPのみであり,外部からアクセスできない.
  • Pod IPはPodの破棄に伴って消失し、ReplicaSetがPodを動的に伸縮すると、Pod IPはいつでもどこでも変化する可能性があり、このサービスへのアクセスが困難になります.

  • したがって,Kubernetesにおけるサービスオブジェクトは,以上の問題を解決する核心的な鍵である.
    1.サービスの作成
    サービスは、同じサービスを提供するPod対外アクセスインタフェースのセットと見なすことができる.サービスにより、アプリケーションはサービス発見と負荷分散を容易に実現できます.
    Serviceは他のKubernetesオブジェクトと同様にyamlまたはjsonファイルで定義されます.また、他のControllerオブジェクトと同様に、Label Selectorを使用して、サービスがどのPodを使用するかを決定します.簡単なサービス定義は次のとおりです.
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        run: nginx
      name: nginx-service
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 81
      selector:
        app: nginx
      type: ClusterIP
    

    上のサービス記述ファイルを簡単に分析します.
  • は、spec.selectorフィールドを使用して、このサービスがどのLabelを使用するかを決定します.この例では、nginxというサービスは、app: nginx Labelを持つすべてのPodを管理します.
  • spec.ports.port: 80は、このサービスが80ポートをリスニングし、すべてのリスニングされた要求を管理するPodに転送することを示す.spec.ports.targetPort: 81は、このサービスが傍受した80ポートの要求が管理するPodの81ポートに転送されることを示しており、このフィールドは省略でき、省略するとspec.ports.portの値に設定される.
  • type: ClusterIP表面このサービスのtypeは、以下で説明する.

  • 2.サービスのタイプ
    Serive定義では、4つのオプションを持つspec.typeフィールドを指定する必要があります.
  • ClusterIP.既定値.このサービスには、Kubernetesシステムが自動的に割り当てた仮想IPであるCluster IPが割り当てられているため、クラスタ内でのみアクセスできます.
  • NodePort.指定したノードのポートを介してサービスを外部に露出します.この方法により、いずれのNodeIP:nodePortにアクセスしても、ClusterIPにルーティングされ、サービスが正常に取得される.
  • LoadBalancer.NodePortに基づいて、cloud providerを使用して外部の負荷イコライザを作成し、リクエストをNodePortに転送します.このモードはクラウドサーバ(AWSなど)でのみ使用できます.
  • ExternalName.サービスをDNS CNAMEレコード方式で指定したドメイン名に転送します(spec.externlName設定).kube-dnsバージョンが1.7以上必要です.

  • 2.1 NodePortタイプ
    サービスの定義時にspec.type=NodePortを指定し、spec.portsを指定します.NodePortの値では、Kubernetesはクラスタ内の各ノードに定義されたこのポートを開き、外部から任意のNodeIP:nodePortを介してこのサービスにアクセスできます.簡単な例を次に示します.
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      labels:
        run: nginx
    spec:
      selector:
        app: nginx
      ports:
      - port: 80
        nodePort: 30001
      type: NodePort
    

    3つのapp:nginx Podが3つの異なるノードで実行されている場合、クライアントが任意のノードにアクセスする30001ポートがこのnginxサービスにアクセスできます.
    2.2 LoadBalancerタイプ
    クラウドサービスプロバイダが外部負荷イコライザをサポートしている場合、spec.type=LoadBalancerでServiceを定義できます.簡単な例は次のとおりです.
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      selector:
        app: MyApp
      ports:
      - protocol: TCP
        port: 80
        targetPort: 9376
      clusterIP: 10.0.171.239
      loadBalancerIP: 78.11.24.19
      type: LoadBalancer
    status:
      loadBalancer:
        ingress:
        - ip: 146.148.47.155
    

    参考記事
  • https://kubernetes.io/docs/concepts/services-networking/service/
  • https://kubernetes.feisky.xyz/zh/concepts/service.html