k8s使用内网拉取镜像显示Container Creating
问题
内网使用harbor进行传输,新创建项目执行kubectl apply -f xx.yaml之后出现此问题
原因查找
- 镜像名称或标签错误
检查:确保您的 Pod 或 Deployment 配置文件中指定的镜像名称和标签是正确的。
解决:修正配置文件中的镜像名称和标签。 - 私有仓库认证问题
检查:
如果您使用的是私有 Docker 仓库,请确认是否已经配置了 Secret 来提供认证信息。
使用 kubectl describe pod 查看 Pod 的详细信息,检查是否有认证相关的错误信息。
解决:
创建一个 Docker Secret 来存储认证信息:
kubectl create secret docker-registry myregistrykey \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-pword> \
--docker-email=<your-email>
在 Pod 或 Deployment 的 YAML 文件中引用此 Secret:
spec:
imagePullSecrets:
- name: myregistrykey
-
网络连接问题
检查:
确认集群节点能够访问互联网(对于公共仓库)或私有仓库所在的网络。
检查节点上的防火墙规则、安全组设置等,确保没有阻止对镜像仓库的访问。
解决:
解决网络连通性问题,确保所有必要的端口开放。 -
镜像仓库不可达或临时故障
检查:
尝试从本地机器或其他环境拉取相同的镜像,以验证仓库是否可用。
解决:
如果仓库暂时不可用,请等待一段时间再试;如果持续不可用,请联系仓库管理员或选择其他可靠的镜像源。 -
镜像不存在
检查:
确认镜像确实存在于仓库中,并且可以通过命令行工具如 docker pull 成功拉取。
解决:
确保推送镜像到仓库,并使用正确的标签。 -
节点资源不足
检查:
使用 kubectl describe node 检查节点状态,确认是否有足够的磁盘空间、内存和 CPU 资源。
解决:
清理不必要的资源或扩展集群容量。 -
Kubernetes 版本兼容性问题
检查:
确认使用的 Kubernetes 版本与镜像版本兼容,特别是如果您使用的是较新的功能或特定于某些版本的特性。
解决:
更新 Kubernetes 版本或调整镜像版本以确保兼容性。
诊断步骤
为了更准确地诊断问题,您可以执行以下操作:
查看 Pod 事件:
kubectl describe pod <pod-name> -n <namespace>
这将显示有关 Pod 的更多信息,包括任何错误消息或警告。
检查节点日志:
kubectl get nodes
ssh <node-ip> # 登录到有问题的节点
sudo journalctl -u kubelet # 查看 kubelet 日志
测试镜像拉取: 在有问题的节点上手动尝试拉取镜像:
docker pull <image-name>:<tag>
这可以帮助确定问题是否与特定节点相关。
示例:创建私有仓库 Secret
假设您有一个私有仓库 myregistry.example.com,并且您需要为它创建一个 Secret:
kubectl create secret docker-registry regcred \
--docker-server=myregistry.example.com \
--docker-username=yourname \
--docker-password='yourpassword' \
--docker-email=you@example.com
然后,在您的 Pod 或 Deployment YAML 文件中添加如下配置:
apiVersion: v1
kind: Pod
metadata:
name: private-reg-pod
spec:
containers:
- name: uses-private-reg
image: myregistry.example.com/private-image:tag
imagePullSecrets:
- name: regcred
通过以上步骤,您应该能够找到并解决导致 Kubernetes 容器一直处于 ContainerCreating 状态的问题。
解决
最后通过第七条,找到了问题的原因。
k describe pod -n qat-watch hrt-data-platform-bff-76f7b5d89b-2v2bv
Name: hrt-data-platform-bff-76f7b5d89b-2v2bv
Namespace: qat-watch
Priority: 0
Service Account: default
Node: node6/192.168.0.146
Start Time: Thu, 05 Dec 2024 21:00:58 +0800
Labels: app=hrt-data-platform-bff
pod-template-hash=76f7b5d89b
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Controlled By: ReplicaSet/hrt-data-platform-bff-76f7b5d89b
Containers:
hrt-data-platform-bff:
Container ID:
Image: register.hrttest.cn/hrt_register/hrt-data-platform-bff:qat-41
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Limits:
cpu: 500m
memory: 1Gi
Requests:
cpu: 100m
memory: 512Mi
Environment: <none>
Mounts:
/data from nfs-data-platform-bff (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-bhtqn (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
nfs-data-platform-bff:
Type: NFS (an NFS mount that lasts the lifetime of a pod)
Server: 192.168.0.147
Path: /data/ais/watch
ReadOnly: false
kube-api-access-bhtqn:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedMount 9m53s (x362 over 12h) kubelet MountVolume.SetUp failed for volume "nfs-data-platform-bff" : mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t nfs 192.168.0.147:/data/ais/watch /var/lib/kubelet/pods/26f3b775-af33-40ae-949d-b1cc0c9e66b3/volumes/kubernetes.io~nfs/nfs-data-platform-bff
Output: mount: /var/lib/kubelet/pods/26f3b775-af33-40ae-949d-b1cc0c9e66b3/volumes/kubernetes.io~nfs/nfs-data-platform-bff: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
Warning FailedMount 4m27s (x248 over 12h) kubelet Unable to attach or mount volumes: unmounted volumes=[nfs-data-platform-bff], unattached volumes=[nfs-data-platform-bff kube-api-access-bhtqn]: timed out waiting for the condition
这里nfs-kol-mp-bff因为复制的之前api-bff的nfs地址导致无法绑定到nfs卷,初始化失败。(只有qat有这个问题)修改重命名之后,问题解决。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hrt-kol-mp-bff
labels:
app: hrt-kol-mp-bff
namespace: qat-watch
spec:
replicas: 1
selector:
matchLabels:
app: hrt-kol-mp-bff
template:
metadata:
labels:
app: hrt-kol-mp-bff
spec:
imagePullSecrets:
- name: harbor-secret
hostAliases:
- hostnames:
- kafka
ip: 192.168.0.124
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- qudat
containers:
- name: hrt-kol-mp-bff
image: register.hrttest.cn/hrt_register/hrt-kol-mp-bff:qat-18
volumeMounts:
- name: nfs-kol-mp-bff
mountPath: /data
resources:
limits:
cpu: 0.5
memory: "1024Mi"
requests:
cpu: 0.1
memory: "512Mi"
volumes:
- name: nfs-kol-mp-bff
nfs:
server: 192.168.0.147
path: /data/ais/watch