⚠️ 过时提示:本文写于 2020 年,基于 Kubernetes 1.18 + Docker 作为容器运行时。当前 K8s 已迭代至 1.30+,容器运行时已全面切换为 containerd,部分命令和配置已不适用。请以 Kubernetes 官方文档 为准,本文仅作历史参考。

一、 写作背景

K8S 基础系统搭建完毕后(包括 rook-ceph、dashboard、harbor、prometheus、ingress等),对kubeadm、kubelet等应用进行了升级,服务重启后发现 Harbor 不能正常启动,排查结果为 pod harbor-database-0 没有正常启动故有此解决方案。

本文以 dashboard 为管理端进行可视化管理,相应命令行操作会提及,但不会太详细。

二、排查过程

经对各 pod 的日志进行查看发现 harbor-database-0这个 pod 对pvc上已经存在的数据没有了读写权限

# kubectl logs -n harbor gxsk-harbor-database-0 database

FATAL: data directory "/var/lib/postgresql/data" has group or world access
DETAIL: Permissions should be u=rwx (0700).

三、harbor-database解决方法

网上介绍需要修改 pod 试了一下,直接修改 pod 的配置文件,容易出错,在这里使用修改 Stateful Sets 相关配置的方法修改 pod

# kubectl -n harbor  edit statefulsets.apps gxsk-harbor-database

# 大约在230行左右,修改 initContainers 的参数如下,其中 chmod -R 700 /var/lib/postgresql/data 是新增内容

    initContainers:
    - args:
      - -c
      - chown -R 999:999 /var/lib/postgresql/data && chmod -R 700 /var/lib/postgresql/data

statefulsets

修改后保存文件,系统会自动重新部署该服务,如果没有部署,则将其部署个数先改为0,然后再改为1,强制重新部署一下。

# 先改为0,删除已有但启动不成功的 pod
kubectl scale -n harbor statefulset gxsk-harbor-database --replicas=0

# 然后再改为1,添加一个 pod
kubectl scale -n harbor statefulset gxsk-harbor-database --replicas=1

# 静待成功部署

四、

Unable to attach or mount volumes: unmounted volumes=[job-logs], unattached volumes=[job-logs default-token-bpdnw jobservice-config]: timed out waiting for the condition

四、举一反三

其它业务也多为类似权限问题,均在相应位置给指定目录赋权即可解决。

五、 文章引用

九析带你轻松完爆 helm3 harbor