K8s新手系列之Pod中容器的镜像拉取计谋

打印 上一主题 下一主题

主题 1751|帖子 1751|积分 5253

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
概述

在 Kubernetes(K8s)里,容器镜像拉取计谋(ImagePullPolicy)决定了 K8s 在创建或重启 Pod 时,如那边理容器镜像的拉取操作。这一计谋能够确保使用的镜像始终是最新的,或者使用当地已有的镜像以提拔部署服从。
可以使用kubectl explain pod.spec.containers.imagePullPolicy查看资源的详细文档:
示例:
  1. [root@master01 ~]# kubectl explain pod.spec.containers.imagePullPolicy
  2. KIND:     Pod
  3. VERSION:  v1
  4. FIELD:    imagePullPolicy <string>
  5. DESCRIPTION:
  6.      Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always
  7.      if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.
  8.      More info:
  9.      https://kubernetes.io/docs/concepts/containers/images#updating-images
  10.      Possible enum values:
  11.      - `"Always"` means that kubelet always attempts to pull the latest image.
  12.      Container will fail If the pull fails.
  13.      - `"IfNotPresent"` means that kubelet pulls if the image isn't present on
  14.      disk. Container will fail if the image isn't present and the pull fails.
  15.      - `"Never"` means that kubelet never pulls an image, but only uses a local
  16.      image. Container will fail if the image isn't present
复制代码
通过文档可以发现,镜像拉取计谋有三个范例,分别是Always、IfNotPresent、Never
也可以通过官方文档来查看:https://kubernetes.io/docs/concepts/containers/images#updating-images
镜像拉取计谋分类详解

Never

Never表示永不拉取镜像,kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在当地, kubelet 会尝试启动容器;否则,会启动失败。
示例:
  1. [root@master01 ~/pod]# cat pod-tomcat.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: pod-tomcat
  6. spec:
  7.   containers:
  8.   - name: container-tomcat
  9.     image: tomcat:8.0
  10.     # 指定镜像拉取策略为Never
  11.     imagePullPolicy: Never
  12.     ports:
  13.     - name: http
  14.       containerPort: 8080
  15. # 创建pod
  16. [root@master01 ~/pod]# kubectl apply -f pod-tomcat.yaml
  17. pod/pod-tomcat created
  18. # 查看pod
  19. [root@master01 ~/pod]# kubectl get po pod-tomcat
  20. NAME         READY   STATUS              RESTARTS   AGE
  21. pod-tomcat   0/1     ErrImageNeverPull   0          111s
  22. # 查看详情,发现并没有拉取镜像
  23. [root@master01 ~/pod]# kubectl describe po pod-tomcat
  24. Name:             pod-tomcat
  25. ...省略万字内容
  26. Events:
  27.   Type     Reason             Age                  From               Message
  28.   ----     ------             ----                 ----               -------
  29.   Normal   Scheduled          2m7s                 default-scheduler  Successfully assigned default/pod-tomcat to node02
  30.   Normal   SandboxChanged     2m5s                 kubelet            Pod sandbox changed, it will be killed and re-created.
  31.   Warning  ErrImageNeverPull  25s (x12 over 2m6s)  kubelet            Container image "tomcat:8.0" is not present with pull policy of Never
  32.   Warning  Failed             25s (x12 over 2m6s)  kubelet            Error: ErrImageNeverPull
复制代码
IfNotPresent

如果当地有镜像就使用当地的,如果没有就去远程仓库拉取
示例:
  1. [root@master01 ~/pod]# cat pod-tomcat.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: pod-tomcat
  6. spec:
  7.   containers:
  8.   - name: container-tomcat
  9.     image: tomcat:8.0
  10.     # 指定镜像拉取策略为IfNotPresent
  11.     imagePullPolicy: IfNotPresent
  12.     ports:
  13.     - name: http
  14.       containerPort: 8080
  15. # 创建pod
  16. [root@master01 ~/pod]# kubectl apply -f pod-tomcat.yaml
  17. pod/pod-tomcat created
  18. # 查看pod
  19. [root@master01 ~/pod]# kubectl get pod pod-tomcat
  20. NAME         READY   STATUS    RESTARTS   AGE
  21. pod-tomcat   1/1     Running   0          43s
  22. #查看pod详情
  23. [root@master01 ~/pod]# kubectl describe pod pod-tomcat
  24. Name:             pod-tomcat
  25. Namespace:        default
  26. ##...省略万字内容
  27. Events:
  28.   Type    Reason     Age   From               Message
  29.   ----    ------     ----  ----               -------
  30.   Normal  Scheduled  64s   default-scheduler  Successfully assigned default/pod-tomcat to node02
  31.   Normal  Pulling    63s   kubelet            Pulling image "tomcat:8.0"
  32.   Normal  Pulled     23s   kubelet            Successfully pulled image "tomcat:8.0" in 40.129798231s (40.129811976s including waiting)
  33.   Normal  Created    23s   kubelet            Created container container-tomcat
  34.   Normal  Started    23s   kubelet            Started container container-tomcat
复制代码
Always

如果当地有镜像,则对比当地镜像和远程仓库的摘要信息,若相同则使用当地缓存,若差别则重新拉取镜像。
如果当地没有镜像,则无需对比摘要信息,直接拉取镜像。
示例:
  1. [root@master01 ~/pod]# cat pod-tomcat.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: pod-tomcat
  6. spec:
  7.   containers:
  8.   - name: container-tomcat
  9.     # 镜像更改为latest
  10.     image: tomcat:latest
  11.     # 指定镜像拉取策略为Always
  12.     imagePullPolicy: Always
  13.     ports:
  14.     - name: http
  15.       containerPort: 8080
  16. # 创建pod
  17. [root@master01 ~/pod]# kubectl apply -f pod-tomcat.yaml
  18. pod/pod-tomcat created
  19. #查看pod
  20. [root@master01 ~/pod]# kubectl get pod pod-tomcat
  21. NAME         READY   STATUS    RESTARTS   AGE
  22. pod-tomcat   1/1     Running   0          4m53s
  23. # 查看pod详情
  24. [root@master01 ~/pod]# kubectl describe pod pod-tomcat
  25. Name:             pod-tomcat
  26. Namespace:        default
  27. ## ...省略万字内容
  28. Events:
  29.   Type    Reason     Age    From               Message
  30.   ----    ------     ----   ----               -------
  31.   Normal  Scheduled  5m39s  default-scheduler  Successfully assigned default/pod-tomcat to node02
  32.   Normal  Pulling    5m38s  kubelet            Pulling image "tomcat:latest"
  33.   Normal  Pulled     4m55s  kubelet            Successfully pulled image "tomcat:latest" in 43.43020764s (43.430224485s including waiting)
  34.   Normal  Created    4m55s  kubelet            Created container container-tomcat
  35.   Normal  Started    4m55s  kubelet            Started container container-tomcat
复制代码
镜像默认的拉取计谋

官网的描述是如许的:

  • 如果你省略了 imagePullPolicy 字段,并且你为容器镜像指定了摘要, 那么 imagePullPolicy 会自动设置为 IfNotPresent。
  • 如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latest, imagePullPolicy 会自动设置为 Always。
  • 如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always。
  • 如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent
简单点来说就是如果没有指定镜像的版本,或者指定镜像的版本为 :latest,那么镜像拉取计谋就是 Always。否则就是 IfNotPresent

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表