本人在修改mysql的配置文件后执行了kubectl delete pod mysql-test-0 -n orche,正常情况下这个操作让pod重新更新配置,然后再用kubectl get po -n orche
查看pod运行状态时总显示ErrImagePull。
解决方法一:
如果网络不通外网,修改mysql的yaml文件添加
spec:
containers:
- name: mysql-test
image: mysql:8.0
imagePullPolicy: Never #主要是这个选项,也可以是IfNotPresent
ports:
- containerPort: 3306
介绍一下imagePullPolicy,它是 Kubernetes 中用来控制容器镜像的拉取策略的设置。它定义了 Kubernetes 在启动或重启容器时如何处理镜像的拉取。
imagePullPolicy
可以设置为以下几种值:
Always
: 每次启动或重启容器时都拉取镜像。这是最常用的设置,特别是在使用最新版本的镜像时。例如,在持续集成和持续部署(CI/CD)环境中,经常使用Always
以确保总是使用最新的镜像版本。
IfNotPresent
: 仅当本地不存在镜像时才拉取镜像。如果镜像已经存在于节点上,它将使用本地镜像,而不是重新拉取。这可以节省带宽和时间,尤其是在镜像不经常更新的情况下。
Never
: 从不拉取镜像,仅使用本地镜像。如果镜像在节点上不存在,则容器将无法启动。这种设置通常用于在开发和测试过程中使用本地构建的镜像。
然后再执行
kubectl delete pod mysql-test-0 -n orche
kubectl get po -n orche
注意:这里查看节点用到的镜像之前删除时,自己飘到的节点
查看节点目前飘到哪个节点上了
kubectl get nodes -o wide
如果所在的节点上没有mysql对应版本的镜像,是起不来的
解决方法二
针对只有特点节点上有mysql:8.0的镜像的情况,要确保 Pod 在特定的节点上运行,你可以使用 Kubernetes 的调度机制来指定节点
执行
kubectl get nodes --show-labels
查看集群中所有节点的标签,针对控制节点举例会显示这么多:
eta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=tgq207
kubernetes.io/os=linux
node-role.kubernetes.io/control-plane=
node-role.kubernetes.io/master=
node.kubernetes.io/exclude-from-external-load-balancers=
processor=cpu
使用标签:
vim mysql_test.yaml
spec:
nodeSelector:
kubernetes.io/hostname: tgq207 #添加再template下面,不能直接添加再statefulset的spec下面
kubectl apply -f mysql_test.yaml
kubectl get po -n orche -o wide
可以看到节点已经到指定的节点上,不在cu07了
注:
排除节点: 如果你想排除某些节点,可以使用标签选择器(如
node.kubernetes.io/exclude-from-external-load-balancers
)来避免在这些节点上调度 Pod在 StatefulSet 的配置中,
nodeSelector
不能直接用于StatefulSet
的规范(spec)部分。要在 StatefulSet 中指定节点选择器,你应该在 Pod 模板中使用nodeSelector
,因为 StatefulSet 会在其 Pod 模板中定义调度策略。