今日覚えて帰ること
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 digestnginx@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333
.
digest が何かわからないので調査します。
端的でわかりやすい説明があったので引用します。
コンテナ イメージ ダイジェストはコンテナ イメージを一意かつ不変的に識別します。ダイジェストを使用してイメージをデプロイすると、イメージタグでデプロイする際のデメリットを回避できます。
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
に修正すれば完了です。