添加 readOnlyRootFilesystem 后 Kubernetes crashloopbackoff 错误:true
Kubernetes crashloopbackoff error after adding readOnlyRootFilesystem: true
Azure Kubernetes 服务给出了建议——应该为容器强制执行可变(只读)根文件系统
我的部署在没有它的情况下按预期工作,但在添加后 readOnlyRootFilesystem: true
它不起作用,因为容器无法写入。
我也在使用带有 Azure 存储文件的 PVC,它显示绑定成功,但始终显示为空。
这是我的deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-healthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
annotations:
container.apparmor.security.beta.kubernetes.io/redis: runtime/default
spec:
containers:
- name: redis
image: <customer-registry>.azurecr.io/redis:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 250Mi
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: "/mnt/azure"
name: volume
- mountPath: "mnt/secrets-store"
name: secrets-mount
readOnly: true
volumes:
- name: volume
persistentVolumeClaim:
claimName: helloworld-pvc
- name: secrets-mount
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-keyvault"
下面是 pod 的错误:
rm: can't remove '/home/test/mi-4.0.0/tmp/README': Read-only file system
rm: can't remove '/home/test/mi-4.0.0/tmp/work': Read-only file system
如果我使用的是 PVC,那么 pod/container 不应该写入 PVC 吗??
如果有人能帮助解决这个问题,我将不胜感激。
我很乐意提供更多详细信息
的确,read-only 文件系统是首选,如果可能的话。但是,出于某种原因,某些应用程序需要将数据写入磁盘。
您的错误与挂载的卷无关,而是与 /tmp
目录有关。
您可以通过将 empty dir 卷安装到此路径来保持您的只读文件系统并只使该部分可写。
volumes:
- name: tmp
emptyDir: {}
volumeMounts:
- name: tmp
mountPath: /home/test/mi-4.0.0/tmp
请注意,该卷将覆盖安装到的位置。如果您在容器启动时需要此目录中的数据,您可以选择一个 initContainer 来装载相同的卷并向其中添加所需的文件。
Azure Kubernetes 服务给出了建议——应该为容器强制执行可变(只读)根文件系统
我的部署在没有它的情况下按预期工作,但在添加后 readOnlyRootFilesystem: true
它不起作用,因为容器无法写入。
我也在使用带有 Azure 存储文件的 PVC,它显示绑定成功,但始终显示为空。
这是我的deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-healthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
annotations:
container.apparmor.security.beta.kubernetes.io/redis: runtime/default
spec:
containers:
- name: redis
image: <customer-registry>.azurecr.io/redis:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 250Mi
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: "/mnt/azure"
name: volume
- mountPath: "mnt/secrets-store"
name: secrets-mount
readOnly: true
volumes:
- name: volume
persistentVolumeClaim:
claimName: helloworld-pvc
- name: secrets-mount
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-keyvault"
下面是 pod 的错误:
rm: can't remove '/home/test/mi-4.0.0/tmp/README': Read-only file system
rm: can't remove '/home/test/mi-4.0.0/tmp/work': Read-only file system
如果我使用的是 PVC,那么 pod/container 不应该写入 PVC 吗??
如果有人能帮助解决这个问题,我将不胜感激。 我很乐意提供更多详细信息
的确,read-only 文件系统是首选,如果可能的话。但是,出于某种原因,某些应用程序需要将数据写入磁盘。
您的错误与挂载的卷无关,而是与 /tmp
目录有关。
您可以通过将 empty dir 卷安装到此路径来保持您的只读文件系统并只使该部分可写。
volumes:
- name: tmp
emptyDir: {}
volumeMounts:
- name: tmp
mountPath: /home/test/mi-4.0.0/tmp
请注意,该卷将覆盖安装到的位置。如果您在容器启动时需要此目录中的数据,您可以选择一个 initContainer 来装载相同的卷并向其中添加所需的文件。