PodとPodテンプレート

ベストプラクティスのこの部分では、チャートマニフェストの、PodとPodテンプレート部分の フォーマットについて説明します。

以下のリソースのリスト(非網羅的)がPodテンプレートを使用します:

  • Deployment
  • ReplicationController
  • ReplicaSet
  • DaemonSet
  • StatefulSet

イメージ

コンテナイメージは固定されたタグ、もしくはイメージのSHAを使用するべきです。イメージはlatest, head,canaryタグや、その他"浮いている"タグは使用するべきではありません。

イメージは、簡単に入れ替えられるように、values.yamlに定義しても 良い でしょう。

image: {{ .Values.redisImage | quote }}

イメージとタグは、それぞれ別のフィールドとしてvalues.yamlに定義しても 良い でしょう:

image: "{{ .Values.redisImage }}:{{ .Values.redisTag }}"

ImagePullPolicy

helm createはデフォルトで以下のようにして、deployment.yamlimagePullPolicyIfNotPresentに設定します:

imagePullPolicy: {{ .Values.image.pullPolicy }}

そして、values.yaml:

image:
  pullPolicy: IfNotPresent

同様に、KubernetesはimagePullPolicyが定義されていない場合、デフォルトでIfNotPresentに 設定します。IfNotPresent以外の値が必要な場合、単純にvalues.yamlの値を必要な値に更新 してください。

Podテンプレートはselectorを宣言するべき

全てのPodテンプレートセクションはselectorを指定するべきです。例えば:

selector:
  matchLabels:
      app.kubernetes.io/name: MyName
template:
  metadata:
    labels:
      app.kubernetes.io/name: MyName

これはセットとPodの関係を作るため、良い慣習です。

しかし、Deploymentのようなセットでは、これはさらに重要になります。これがないと、 全ての ラベルのセットが一致するPodを選択するために使用され、もし、バージョンやリリース日のように、 変化するラベルを使用していた場合、これが壊れることになります。