Contents
リソース
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=NodePortやService.Type=LoadBalancerが一般的には使われるようです。
ConfigMap
k8sアプリケーションにおいて、データベースのURIのような、外部に公開する固有値の設定に用いられるリソースです。こちらの記事では「Pod設定」と説明されていますね。
Secret
Secretは「Pod設定」の中でも、通信認証のためのトークンや、パスワードなどの機密情報を保存・管理するためのリソースです。ConfigMapとセットで理解するとわかりやすいかと思います。以下はドキュメントで紹介されている、TLS通信のためのSecretのサンプルです。
apiVersion: v1kind: Secretmetadata: name: secret-tlstype: kubernetes.io/tlsdata: # 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/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: 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です。