问题情景
将业务从 swarm迁移至k8s的过程中,遇到了一点证书导出/导入/挂载的问题,已经解决。
容器的证书目录结构
保持原来证书目录结构不变,避免了研发的代码改动。
# tree ./
./
├── 123
│ └── apiclient_cert.p12
├── 456apiclient_cert.p12
└── apiclient_cert.p12
注意:
有个坑,存在两个同名证书文件:apiclient_cert.p12
在后续的证书导入过程中,要显式地区分开。
swarm证书导出
证书原文件丢失或者难找到的情况下,可以从 swarm 容器内 copy 出来。
- 直接用
docker cp
是无法复制.p12
、.pem
等后缀的证书的 - 可以先再容器内 cp成其他后缀(比如
.txt
),再docker cp
就可以了
证书导入k8s
- 将导出的
.txt
证书后缀改回.p12
- 不改也可以,但是在导入时还是要指定为
xxx.p12=xxx.txt
- 不改也可以,但是在导入时还是要指定为
- 用
md5sum
验证一下内容是否一致 - 用
kubectl create secret
导入证书为密文
kubectl -n swarm-migrate create secret generic \
--from-file="\
apiclient_cert.p12,\
456apiclient_cert.p12,\
123apiclient_cert.p12=123/apiclient_cert.p12" \
mycerts
说明:
--from-file=
可以指定多个证书文件,格式 keyname=filepathkeyname
指定命名为xxx.p12
是为了方便挂载密文卷- 注意区别开不同目录级别的同名文件
证书挂载
登录 rancher,在集群 --> 项目 --> 密文
页面可以看到刚创建好的mycerts
再编辑 工作负载
,将证书挂载到指定目录下。
注意:
- 123apiclient_cert.p12 这个文件相对路径为
123/apiclient_cert.p12
- 相对路径 指的是,相对于
容器路径
的文件位置。
验证挂载
在 工作负载 -- Pods -- 执行命令行
- 进入容器验证证书的目录结构:
/opt/xxxpay/certs # ls -l
total 0
lrwxrwxrwx 1 root root 17 Mar 14 15:43 123 -> ..data/123
lrwxrwxrwx 1 root root 35 Mar 14 15:43 456apiclient_cert.p12 -> ..data/456apiclient_cert.p12
lrwxrwxrwx 1 root root 25 Mar 14 15:43 apiclient_cert.p12 -> ..data/apiclient_cert.p12
/opt/xxxpay/certs # ls -l 123/
total 4
-r-------- 1 root root 2876 Mar 14 15:43 apiclient_cert.p12
- 用 md5sum 等工具校验文件内容。