pod常见状态

invalidImageName:node节点无法解析镜像名导致的镜像无法下载

ImageInspectError: 无法校验镜像,镜像不完整导致

ErrImageNeverPull: 策略禁止拉取镜像,镜像中心权限是私有等

RegistryUnavailble:镜像服务器不可用,网络原或harbor宕机

ErrImagePull: 镜像拉取出错,超时或下载被强制终止

CreateContainerConfigError: 不能创建kubelet使用的容器配置

RunContainerError: pod运行失败,容器中没有初化为PID为1的守护进程等 

ContainersNotInitalized: pod没有初始化完毕

ContainersNotReady: pod没有准备完毕

ContainerCreateing: pod正在创建中

PodInitalzing:pod正在初始化中

DockerDaemonNotReady: node节点docker服务没有启动

NetworkPluginNotReady:网络插件没有启动

Uns#chedulable: pod不能被调度,kube-scheduler没有匹配到合适的node节点

PodScheduled: pod正处于调度中,在kube-scheduler刚开始调度的时候,还没有将pod分配到指定的node,在筛选出合适的节点后就会更新etcd数据。将pod分配到指定的node

Pending:正在创建Pod但是Pod中的容器还没有全部被创建完成【处于此状态 Pod应该检查Pod的依赖的存储是否有权限挂载等】

Failed:Pod中有容器启动失败而导致pod工作异常

Unkown: 由于某种原因无法获得pod的当前状态,通常是由于与pod所在的node节点通信错误

Initalized:所有pod初始化容器已经完成了

ImagePullBackOff: pod所在的node节点下载镜像失败。(原因包括无效的镜像名称,或从私有仓库拉取而没有 ​imagePullSecret​​)

Running: pod内部的容器已经被创建并且启动

Ready:表示pod已经可以提供访问服务

Error: pod启动过程中发生错误

NodeLost: pod所在节点失联

Waiting: pod等待启动

Terminating: Pod正在被销毁

CrashLoopBackOff: 容器启动失败,kubelet正在将它重启

镜像拉取策略官网

​https://kubernetes.io/zh-cn/docs/concepts/containers/images/#pre-pulled-images​

镜像拉取策略查询

# 查询镜像拉取有多少种策略
[root@k8s-deploy ~]# kubectl explain deployments.spec.template.spec.containers.imagePullPolicy
KIND: Deployment
VERSION: apps/v1

FIELD: imagePullPolicy <string>

DESCRIPTION:
Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always
if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.
More info:
https://kubernetes.io/docs/concepts/containers/images#updating-images

Possible enum values:
- `"Always"` means that kubelet always attempts to pull the latest image.
Container will fail If the pull fails.
- `"IfNotPresent"` means that kubelet pulls if the image isn't present on
disk. Container will fail if the image isn't present and the pull fails.
- `"Never"` means that kubelet never pulls an image, but only uses a local
image. Container will fail if the image isn't present

镜像拉取策略解释

可能的枚举值:

     - `"Always"` 表示 kubelet 总是尝试拉取最新的镜像。

     如果拉取失败,容器将失败。(如果镜像标签为latest。那需要使用Always每次从公网拉取最新镜像

     - `"IfNotPresent"` 表示kubelet 会先拉取本地的镜像,本地没有镜像,会从公网拉取最新镜像

     如果拉取失败,容器将失败。(推荐使用

     - `"Never"` 表示 kubelet 从不拉取镜像,而只使用本地

     镜像。 如果镜像不存在,容器将失败

默认镜像拉取策略

当你(或控制器)向 API 服务器提交一个新的 Pod 时,你的集群会在满足特定条件时设置 ​​imagePullPolicy ​​字段:

  • 如果你省略了 ​​imagePullPolicy​​​ 字段,并且容器镜像的标签是 ​​:latest​​​, ​​imagePullPolicy​​​ 会自动设置为 ​​Always​​。
  • 如果你省略了 ​​imagePullPolicy​​​ 字段,并且没有指定容器镜像的标签, ​​imagePullPolicy​​​ 会自动设置为 ​​Always​​。
  • 如果你省略了 ​​imagePullPolicy​​​ 字段,并且为容器镜像指定了非 ​​:latest​​​ 的标签, ​​imagePullPolicy​​​ 就会自动设置为 ​​IfNotPresent​​。

私有镜像拉取配置方式

创建一个基于现有凭证的 Secret拉取私有镜像

说明:

官网: https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/

Pod 只能引用位于自身所在名字空间中的 Secret,因此需要针对每个名字空间重复执行上述过程。

如果你已经运行了 docker login 命令,你可以复制该镜像仓库的凭证到 Kubernetes:

kubectl create secret generic myregistrykey \
--from-file=.dockerconfigjson=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson \
-n test

如果你需要更多的设置(例如,为新 Secret 设置名字空间或标签), 则可以在存储 Secret 之前对它进行自定义。 请务必:

  • 将 data 项中的名称设置为 ​​.dockerconfigjson​
  • 使用 base64 编码方法对 Docker 配置文件进行编码,然后粘贴该字符串的内容,作为字段 ​​data[".dockerconfigjson"]​​ 的值
  • 将 ​​type​​​ 设置为 ​​kubernetes.io/dockerconfigjson​

或 使用 Docker Config 创建 Secret

kubectl create secret docker-registry myregistrykey \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址>

在这里:

  • ​<your-registry-server>​​​ 是你的私有 Docker 仓库全限定域名(FQDN)。 DockerHub 使用 ​​https://index.docker.io/v1/​​。
  • ​<your-name>​​ 是你的 Docker 用户名。
  • ​<your-pword>​​ 是你的 Docker 密码。
  • ​<your-email>​​ 是你的 Docker 邮箱。

这样你就成功地将集群中的 Docker 凭证设置为名为 ​​myregistrykey​​ 的 Secret。

查询secrets

kubectl get secrets -n test


secerts解密

[root@k8s-deploy ~]# kubectl get secret myregistrykey --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
{
"auths": {
"registry.cn-shenzhen.aliyuncs.com": {
"auth": "eW...jkx"
}
}
}

# 将doker的config.json转为可读格式
echo "eW...jkx" | base64 --decode

在deploymeny的yaml文件配置,

spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey

将 ImagePullSecrets 添加到服务账号的配置方式

官网:​​https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-service-account/​

此这种方式是建立在第一种方式的前提下,再把ImagePullSecrets的配置加入到每个命名空间的default服务账号。令其使用该 Secret 用作 ​imagePullSecret​​。

第一步:使用 Docker Config 创建 Secret。操作过程。见上述

第二步 将镜像拉取 Secret 添加到服务账号

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

你也可以使用 ​kubectl edit​,或者如下所示手动编辑 YAML 清单:

kubectl get serviceaccounts default -o yaml > ./sa.yaml

​sa.yaml​ 文件的输出类似这样:

apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
resourceVersion: "243024"
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6

使用你常用的编辑器(例如 ​​vi​​​),打开 ​​sa.yaml​​​ 文件,删除带有键名 ​​resourceVersion​​​ 的行,添加带有 ​​imagePullSecrets:​​ 的行,最后保存文件。

所得到的 ​​sa.yaml​​ 文件类似于:

apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
imagePullSecrets:
- name: myregistrykey

最后,使用新更新的 ​sa.yaml​ 文件替换服务账号。

kubectl replace serviceaccount default -f ./sa.yaml

验证镜像拉取 Secret 已经被添加到 Pod 规约

现在,在当前命名空间中创建使用默认服务账号的新 Pod 时,新 Pod 会自动设置其 ​​.spec.imagePullSecrets​​ 字段:

kubectl run nginx --image=nginx --restart=Never
kubectl get pod nginx -o=jsonpath='{.spec.imagePullSecrets[0].name}{"\n"}'

输出为:

myregistrykey