【Kubernetes】リソース?Manifest?k8sの基本用語まとめ

Categories:Kubernetes

リソース

Kubernetesにおいて「リソース」は、k8sアプリケーションである一定の役割を担う「パーツ」のことを指します。たとえばこの前紹介したIngressは、HTTPポートのエクスポーズやルーティングといったネットワーク周りで活躍するリソースです。

代表的なリソース

Pod

1つ以上のコンテナをまとめた、Kubernetesにおける「最小の実行単位」です。k8sクラスタにおいては、IPアドレスはコンテナごとではなく、このPodごとに割り振られます。IPアドレスはPodを(再)起動するたびに設定範囲の中から動的に割り振られる、という特徴があります。

Service

とはいえ、Podを立ち上げるたびにIPアドレスが変わるのは好ましくない、という時も少なくないです。そこで利用されるのがServiceで、このServiceを活用するとPodのIPアドレスを固定化することができます。

Ingress

さて、各PodごとのIPアドレスがServiceで固定化できると、次に気になるのがサービスの公開です。特に公開したいPodが複数になると、そのそれぞれに設定をするのは、運用コストの観点から見てもあまり効率的とは言えません。そこで、IngressがPod公開のための役割を一手に引き受けます。また、ネットワークの負荷分散も担っています。

Ingressはクラスター外からクラスター内ServiceへのHTTPとHTTPSのルートを公開します。トラフィックのルーティングはIngressリソース上で定義されるルールによって制御されます。

Ingress |kubernetes document

ただし、公式ドキュメントにもあるように、Ingressは「HTTPとHTTPS」のルート公開に用いられます。わたしはまだ実務で出会っていないケースですが、それ以外のServiceの公開にはService.Type=NodePortService.Type=LoadBalancerが一般的には使われるようです。

ConfigMap

k8sアプリケーションにおいて、データベースのURIのような、外部に公開する固有値の設定に用いられるリソースです。こちらの記事では「Pod設定」と説明されていますね。

Secret

Secretは「Pod設定」の中でも、通信認証のためのトークンや、パスワードなどの機密情報を保存・管理するためのリソースです。ConfigMapとセットで理解するとわかりやすいかと思います。以下はドキュメントで紹介されている、TLS通信のためのSecretのサンプルです。

apiVersion: v1
kind: Secret
metadata:
  name: secret-tls
type: kubernetes.io/tls
data:
  # the data is abbreviated in this example
  tls.crt: |
        MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
  tls.key: |
        MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...

Volume

k8sでアプリケーションを運用していくと、そこには永続化したいデータが発生したり、保存されたりすることがあります(とくにデータベースまわり)。しかしPodは再起動されるたびに、コンテナ群を初期化するので、長期的なデータの保存には向いていません。そこで、一般的にはKubernetesクラスタの外にある物理的なストレージをマウントして、そこに長期保存したいデータを持ってもらうという方法がとられます。Dockerの知識がある方には常識だとは思いますが、Kubernetesにおいてもその方法をとるために「Volume」が用いられます。

Deployment

さて、実際の運用シーンでは、アプリケーションの可用性を高めるため、Podのレプリケーション(複製)が行われることがあります(というより、よく行われます)。その場面で、KubernetesではPodとそのレプリカが「どのようであって欲しいか」をあらかじめ決めておくことができます。その設定に使われるリソースがDeploymentと、後に述べるStatefulSetです。この2つは、「Podがstatelessか、statefulか」で使い分けます。以下は公式ドキュメントにある、「nginxのPodレプリカを3つ持ちたい」場合のDeploymentの引用です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

StatefulSet

StatefulSetは、先に書いたように、statefulなPod、つまりデータベースなどのレプリケーション設定のために用いるリソースです。

データを永続的に保持するのが難しいpodやコンテナの永続ボリュームを維持するためにステートフルセットというオブジェクトを利用することで解決することができる。

ステートフルセットはpodと永続ボリュームの対応関係を管理し、永続ボリュームのデータ保護を優先するように設計されている。

kubernetesのステートフルセットを利用して障害に強いpodを作成する①

Manifest

Manifestとは、Kubernetesにおける「インフラのコード化」(IaC: Infrastructure as Code)を実現するための設定ファイルです。”Manifest”という名前のファイルがあるわけではなく、service.yamlといったようなKubernetesリソースの設定・構成を定義したファイルの総称です。

リソースの構成をテキストファイルで記述したのがマニフェストファイルです。そもそもKubernetesクラスタ内のリソースはすべてRESTfulとして表示されるようになっています。

https://noumenon-th.net/programming/2019/04/16/manifest01/

Label & Selector

リソースが増えてきたときに役立つグルーピング機能も紹介しましょう。LabelはPodなどのリソースを一定数まとめてグループ化することができます。それらLabelを指定するときには、Selectorを使います。わかりやすい例えとして、こちらの記事にあるように、食材を「青果」「精肉」「鮮魚」や「カレー」と分けて名づけるのがLabel、そのLabelを指定しているのがSelectorです。

返信がありません

コメントを残す

メールアドレスが公開されることはありません。