kubestronautへの道 ~CKS編 その15 killer coda「Image Use Digest」~

tech article

今日覚えて帰ること

digest

  • イメージを指し示すポインタ
  • 変更不可能(イミュータブル)
  • ハッシュ値で表される

Image Use Digest

Use an image digest instead of tag

Image tags can be overwritten, digests not.

Create a Pod named crazy-pod which uses the image digest nginx@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333 .

digest が何かわからないので調査します。

コンテナ イメージのダイジェストについて  |  Google Kubernetes Engine (GKE)  |  Google Cloud

端的でわかりやすい説明があったので引用します。

コンテナ イメージ ダイジェストはコンテナ イメージを一意かつ不変的に識別します。ダイジェストを使用してイメージをデプロイすると、イメージタグでデプロイする際のデメリットを回避できます。

pod のイメージを指定するときはタグでイメージを識別することが多いと思います。
タグは任意に設定することができ可読性が高いので、人間が識別する際にはよく用いられる方法です。

ただし注意しなければいけないのが、タグは変更可能なポインタである、ということです。
例えば、latest というタグはそのタイミングで最新版のイメージを指し、古くなってしまったイメージのタグはタイムスタンプやバージョンを設定する、という風に運用することができます。

この運用は便利な反面、タイミングによってlatestタグを持つイメージの実体が変わってしまうというデメリットがあります。

一方、ダイジェストはコンテナイメージを一意に定めるポインタです。
そのため、pod のイメージをダイジェストで指定すると、その pod は常に同一のイメージを指し示す、といった運用が可能になります。

では実際に解いていきましょう。

イメージが指定されているので、そのイメージを用いて pod を立ち上げればOKです。

controlplane $ k run crazy-pod --image=nginx@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333
pod/crazy-pod created

Switch deployment from using tag to digest

Convert the existing Deployment crazy-deployment to use the image digest of the current tag instead of the tag.

deployment でタグの代わりにダイジェストを指定するよう修正しろ、と言っています。

pod の設定を -o yaml で出力して、grep でイメージを検索します。

controlplane $ k get po
NAME                              READY   STATUS    RESTARTS   AGE
crazy-deployment-dfbdc89d-2655s   1/1     Running   0          3m50s
crazy-deployment-dfbdc89d-qflcc   1/1     Running   0          3m50s
crazy-deployment-dfbdc89d-vthkf   1/1     Running   0          3m50s
crazy-pod                         1/1     Running   0          3m7s

controlplane $ k get po crazy-deployment-dfbdc89d-2655s -o yaml | grep image
  - image: httpd:2.4.52-alpine
    imagePullPolicy: IfNotPresent
    image: docker.io/library/httpd:2.4.52-alpine
    imageID: docker.io/library/httpd@sha256:c7b8040505e2e63eafc82d37148b687ff488bf6d25fc24c8bf01d71f5b457531

imageID の @ 以降がダイジェストです。
あとは deployment を修正すればOKです。

controlplane $ k edit deployments.apps crazy-deployment 

///

spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: crazy-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: crazy-deployment
    spec:
      containers:
      - image: httpd:2.4.52-alpine
        imagePullPolicy: IfNotPresent
        name: httpd
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

httpd:2.4.52-alpine を
sha256:c7b8040505e2e63eafc82d37148b687ff488bf6d25fc24c8bf01d71f5b457531
に修正すれば完了です。

タイトルとURLをコピーしました