kubernetes之镜像拉取策略;

打印 上一主题 下一主题

主题 870|帖子 870|积分 2610


  • 各工作节点负责运行Pod对象,而Pod的核心功能用于运行容器,因此工作节点上必须配置容器引擎,如Dokcer、Containerd等,启动容器时,容器引擎将首先于本地查找指定的镜像文件,不存在的镜像则需要从指定的镜像仓库(Registry)下载至本地;
  • kubernetes支持用户自定义镜像文件的获取方式策略,例如在网络资源紧张的时候可以禁止从仓库中获取文件镜像等,容器的ImagePullPolicy字段用于为其指定镜像获取策略,可用值包括:

    • IfNotPresent: 本地有镜像则使用本地镜像,本地不存在则拉取镜像;(默认值)
    • Always: 每次都尝试拉取镜像;
    • Never: 永不拉取,禁止从仓库下载镜像,如果本地镜像已经存在,kubelet会尝试启动容器,否则,启动失败;

  • 官方文档: https://kubernetes.io/zh-cn/docs/concepts/containers/images/
  • 我们可以通过explain来查看它的属性
    imgaepullpolicy是容器级别的;
  1. root@ks-master01-10:~# 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
复制代码

  • 示例说明;
  1. root@ks-master01-10:~#  cat tomcat-test.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: tomcat-test
  6.   namespace: default
  7. spec:
  8.   containers:
  9.   - name: tomcat
  10.     image: tomcat:latest
  11.     imagePullPolicy: Always
  12. root@ks-master01-10:~# kubectl apply -f tomcat-test.yaml
  13. pod/tomcat-test created
复制代码

  • 现在Pod是正常状态;
  1. root@ks-master01-10:~# kubectl get pods
  2. NAME                          READY   STATUS    RESTARTS      AGE
  3. tomcat-test                   1/1     Running   0             87s
复制代码

  • 我们来看看详细描述;
    定义了使用tomcat:latest镜像,其获取策略为Always,这就意味每次启动容器时,它都会从镜像仓库获取最新版本的镜像文件;
  1. root@ks-master01-10:~# kubectl describe pods tomcat-test
  2. Events:
  3.   Type    Reason     Age   From               Message
  4.   ----    ------     ----  ----               -------
  5.   Normal  Scheduled  82s   default-scheduler  Successfully assigned default/mysql-test to ks-node24-24
  6.   Normal  Pulling    81s   kubelet            Pulling image "tomcat:latest"
  7.   Normal  Pulled     45s   kubelet            Successfully pulled image "tomcat:latest" in 36.41152006s
  8.   Normal  Created    45s   kubelet            Created container tomcat
  9.   Normal  Started    45s   kubelet            Started container tomcat
复制代码

  • IfNotPresent
    对于其他标签的镜像,其默认策略为IfNotPresent,需要注意的是,使用私有仓库中的镜像时通常需要由Registry服务器完成认证才能进行,认证过程要么需要在相关节点上交互执行docker login命令进行,要么就是将认证信息定义为secret资源,通过ImagePullSecrets字段来完成认证信息;


  • 示例
  1. root@ks-master01-10:~# cat httpdpod-test.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: httpd-testpod
  6.   namespace: default
  7. spec:
  8.   containers:
  9.   - name: httpd
  10.     image: registry.cn-hangzhou.aliyuncs.com/lengyuye/httpd:alpine3.14
  11.     imagePullPolicy: IfNotPresent
  12. root@ks-master01-10:~# kubectl apply -f httpdpod-test.yaml
  13. pod/httpd-testpod created
复制代码
来查看下详情;
为什么能拉取私有仓库的镜像,因为docker login认证过。没有认证的话拉取镜像的时候会Error;
  1. root@ks-master01-10:~# kubectl describe pods httpd-testpod
  2. Events:
  3.   Type    Reason     Age    From               Message
  4.   ----    ------     ----   ----               -------
  5.   Normal  Scheduled  4m28s  default-scheduler  Successfully assigned default/httpd-testpod to ks-node24-24
  6.   Normal  Pulling    4m27s  kubelet            Pulling image "registry.cn-hangzhou.aliyuncs.com/lengyuye/httpd:alpine3.14"
  7.   Normal  Pulled     4m24s  kubelet            Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/lengyuye/httpd:alpine3.14" in 3.56652979s
  8.   Normal  Created    4m23s  kubelet            Created container httpd
  9.   Normal  Started    4m23s  kubelet            Started container httpd
复制代码
Pod运行正常;
  1. root@ks-master01-10:~# kubectl get pods
  2. NAME                          READY   STATUS    RESTARTS     AGE
  3. httpd-testpod                 1/1     Running   0            3m26s
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表