K8s 1.15下安装Istio 1.5.0时istiod因istio-token权限异常启动失败求助
故障根因补充
K8s 1.15版本的Service Account Token投射卷(Projected Volume)默认权限逻辑为-rw-------(600),属主为节点上的root用户,该权限由kubelet在挂载卷时直接设置,容器内部即使将volumeMount设为readOnly: false也没有修改权限,所以你尝试在代码中修改文件权限会失败。
排查建议
- 检查istiod启动日志,确认是否存在
istiod running without access to K8S tokens的警告信息,匹配源码中读取token失败后关闭CA功能的分支,确认故障点和权限问题一致。 - 进入istiod异常Pod的终端,执行
ls -l /var/run/secrets/tokens/istio-token确认文件权限和属主,执行id确认当前运行用户为1337,验证用户确实无读取权限。
可行解决方案
方案一:切换Istio JWT策略(最兼容方案)
Istio 1.5.0默认使用第三方JWT策略需要读取投射的istio-token,你可以将策略切换为兼容旧版本K8s的第一方JWT模式,直接使用默认的ServiceAccount Token,避开权限问题。
安装时添加参数即可:
istioctl install --set values.global.jwtPolicy=first-party-jwt
如果是已安装的环境,修改istiod的Deployment,添加环境变量JWT_POLICY=first-party-jwt即可生效。
方案二:修改投射卷默认权限
如果需要保留第三方JWT策略,直接修改istiod Deployment的volumes字段下的istio-token配置,添加defaultMode: 420(对应权限644,所有用户可读),配置示例:
volumes: - name: istio-token projected: sources: - serviceAccountToken: path: istio-token expirationSeconds: 3600 audience: istio-ca defaultMode: 420
注意该配置是在volumes层级修改,不是volumeMounts层级,你之前调整的readOnly参数不生效就是因为没有修改卷本身的默认挂载权限。
方案三:临时兼容方案(仅测试环境可用)
如果需要快速验证问题,可以临时修改istiod的securityContext配置,将runAsUser改为0,使用root用户运行istiod,即可正常读取token文件。但该方案不符合最小权限安全原则,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

