我是Kubernetes的新手,我正在使用Google Container Registry存储我的私有映像,我创建了一个名为grc-puller-key的秘密密钥
当我使用命令时:
kubectl apply -f deployment.yaml
我遇到了意外的行为。有时pod成功旋转,有时却没有成功。当我失败时,我描述日志并看到我没有拉图像的凭据,但是有时它确实起作用。
这是我的部署地点
apiVersion: apps/v1
kind: Deployment
metadata:
name: portfolio
labels:
app: portfolio
spec:
selector:
matchLabels:
app: portfolio
template:
metadata:
labels:
app: portfolio
spec:
containers:
- name: portfolio
image: gcr.io/phuong-devops/portfolio:v1
ports:
- containerPort: 3000
protocol: TCP
imagePullSecrets:
- name: grc-puller-key
我确定已创建名为 grc-puller-key 的机密。我提供的屏幕截图如下:
答案 0 :(得分:1)
感谢您的帮助,事实证明,当我将服务帐户权限更改为StorageAdmin时,一切正常。但是我不知道为什么会导致这种行为。如果未获得我的容器注册表的授权,则应该一直失败。对?但实际上,它没有。
答案 1 :(得分:0)
我认为 Kubernetes官方文档中的一件事可以在某种程度上解释这种情况。我的猜测是,当部署成功时,它可能已经使用了所需映像的本地副本。看看this部分:
在您的部署中,没有任何明确定义的imagePullPolicy
,并且 kubernetes 使用默认值:
默认的拉取策略为
IfNotPresent
,这会导致Kubelet 如果图像已经存在,则跳过该图像。如果你想 始终用力拉,您可以执行以下操作之一:
- 将容器的
imagePullPolicy
设置为Always
。- 省略
imagePullPolicy
并使用:latest作为要使用的图像标签。- 省略
imagePullPolicy
和要使用的图像标签。- 启用
AlwaysPullImages
准入控制器。请注意,您应该避免使用
:latest
标记,请参阅有关的最佳做法 配置以获取更多信息。
在部署工作时,很可能使用本地映像。您可以通过运行以下命令在Pod
事件中轻松检查它:
kubectl describe pods your-pod
如果您没有看到事件pulling image "image-name"
,则表示此pod已创建,无需合并映像,因此使用了本地映像。在无法拉出图像的情况下,您的Pod
将进入CrashLoopBackOff
状态,并且您会看到事件描述了到底发生了什么。
这实际上是我目前脑海中唯一可以解释这种行为的东西。您可以通过设置以上任意一项来轻松测试它,并检查模式是否发生更改,即如果访问映像注册表存在问题,则部署是否会持续失败。