工作
却说社畜以来,做了兼职 半吊子 运维,用 k8s 部署些前后端。现在疫情影响,大家广泛应用远程办公工具,这公务交流显然要用专业工具。先前试用 slack,但毕竟在美帝受墙干扰,且免费版限制多,于是决定切换到自架 mattermost
matternost
Mattermost is a flexible, open source messaging platform
that enables secure team collaboration
根据官网 吹逼 宣传,mattermost 是个开源的团队交流工具,看 UI 也和 slack 相近,用起来应该没有问题,甚至还用中文。注意到还有 helm 版 。有了这个可部署方便多了
踩坑
于是按照文档开始部署,坑就来了。
1. toyaml error
首先按所需变量一填,没想到报 toYaml error。原本以为 github 撞墙,下回来 tgz 在🐧☁️上开 darkhttpd ,没想到不是这个问题。没办法看下 yaml,原来是 resource 要填。原以为是 mattermost 的变量,没想到是 k8s 的 resource。以前创的时候用🐧☁️图形化没注意到😓
2. pod has unbound PersistentVolumeClaims
填上 resource 后接着来,这下没报错了。跑去集群一看,没启动起来,报pod has unbound PersistentVolumeClaims
。以为硬盘不够,一看也还有空间。跑去集群——存储看看,没想到🐧☁️开存储最少开 10G,而 mattermost plugins 开 1G。是 1G 开不出来
3. read only file system
再改配置开 10G,终于跑起来了。想着终于部署完了,进入后台开始配置,一点保存没想到又报错,看 log 发现报open /mattermost/config/config.json: read-only file system
。配置是只读,这就没道理。逛下 github issue 发现 mattermost/mattermost-helm#100 有报这个问题,原来 matternost 把配置做 secret 而只读,总不能改个配置就重新部署一下。按照评论使用extraInitContainers
把 config.json 拷去 data 空间,就可以读了。
extraInitContainers
使用了一个 alpine 来执行 cp 命令,这些配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| extraInitContainers: - name: copy-config image: "alpine:latest" imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /mattermost/config/config.json name: config-json subPath: config.json - mountPath: /mattermost/data name: mattermost-data command: ["/bin/ash", "-c", "cp -f /mattermost/config/config.json /mattermost/data/config.json"] extraEnvVars: - name: MM_CONFIG value: "/mattermost/data/config.json"
|
按🐧☁️ key-value 写显然要命,就得想想用其他方法。这种写作 yaml 最方便,看 helm 可以用 -f 指定文件,按🐧☁️文档 可以用 helm 客户端连进去,于是先开 kubectl 内网访问,后开 helm 连接进去。
4.permission denied
这次用 yaml 创出来了再去配置又报 open /mattermost/data/config.json: permission denied
,我寻思 mattermost 还能对自己 data 空间没权限,再逛逛 issue 发现 mattermost/mattermost-helm#120 使用 busybox 来赋予权限。按照这样先赋权后拷贝,应该就可以有权限更改了。
终章
经过这些配置后发现在 5.13.2 版本下没问题,估计 tgz 只适配 5.13.2 版本。列出示例配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| resources: limits: cpu: 500m memory: 1Gi requests: cpu: 100m memory: 512Mi
persistence: plugins: size: 10Gi extraEnvVars: - name: MM_CONFIG value: "/mattermost/data/config.json"
extraInitContainers: - name: set-plugins-owner command: - sh - -c - chown -R 2000:2000 /mattermost/plugins - chgrp 2000 /mattermost/plugins image: busybox:1.29.2 imagePullPolicy: IfNotPresent resources: {} securityContext: privileged: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /mattermost/plugins name: mattermost-plugins - name: set-data-owner command: - sh - -c - chown -R 2000:2000 /mattermost/data - chgrp 2000 /mattermost/data image: busybox:1.29.2 imagePullPolicy: IfNotPresent resources: {} securityContext: privileged: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /mattermost/data name: mattermost-data - name: copy-config image: "alpine:latest" imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /mattermost/config/config.json name: config-json subPath: config.json - mountPath: /mattermost/data name: mattermost-data command: ["/bin/ash", "-c", "cp -f /mattermost/config/config.json /mattermost/data/config.json"]
|