学习日志 21-12-16 K8s入门 - 制作Java镜像并部署
K8s入门 - 制作Java镜像并部署
===========================
# 参考
- https://dockerize.io/guides/docker-spring-boot-guide
# spring-boot 原版打包
- 用了start.spring.io做的spring boot 初始工程
- 用了web starter
- 加了个controller 处理对web根路径的请求
- 直接使用mvn clean package打包
- 结果
- 在target目录获得了一个可执行jar包
- 类似`springbootdemo-0.0.1-SNAPSHOT.jar`
- 该jar包可以不依赖其它任何jar包, 只靠自己就可以提供8080端口上的web服务了
- 下一步做docker image 目标
- 提供java的可执行环境 + 上述jar包
# Docker化
- Dockerfile
- base image - openjdk:11-jre-slim
- slim linux + openjdk 11
- os级
- WORKDIR - /app
- COPY 看本机 到 镜像 的桥梁
- 源 可扫行java文件 本机 windows系统 或 编译机
- 目标 image 上的目标路径
- EXPOSE - 8080
- 打开 8080 端口
- 待验证 k8s 可以根据这个指示打开对应的端口
- CMD - `["java", "-jar", "springbootdemo-0.0.1-SNAPSHOT.jar"]`
- 启动docker主进程的指令
- 待验证 k8s logs 指令会监听该进程的标准输出
- 改参考 另一篇文档
- https://cloud.tencent.com/developer/article/1580841
- 原因之前文档是采用docker命令调用docker 客户端打包
- 我们希望 使用mvn 插件调用docker 客户端打包
- 安装docker客户端
- 这里会自动安装一个docker的服务端集群 但我们其实并不需要这个
- 我们只需要docker客户端的打包能力
- 修改pom, 增加dockerfile plugin
- 执行`mvn dockerfile:build`
- 结果
- 生成了 `target\springbootdemo-0.0.1-SNAPSHOT-docker-info.jar`
- 总结
- 安装docker客户端 可以使用docker命令行针对Dockerfile生成镜像
- 也可以使用maven插件调用docker客户端完成相同的过程
- dockerfile:build
- dockerfile:push
- docker打包和maven打包很相似, 从以下方面讲
- 都有个客户端
- apache-maven
- docker desktop
- 客户端都负责构建(build)
- 都是根据一个关键文件进行构建
- maven是通过pom.xml文件进行构建
- docker是通过Dockerfile文件进行构建
- 构建都会产生一个结果
- maven的构建结果一般是一个jar包
- docker的构建结果是image
- 都有本地 和 远程 的概念
- docker本地库 通过docker客户端可以查看
- maven 本地库 一般在 ~/.m2
- docker 远程中心库 dockerhub
- maven 远程中心库 maven central
- 通过push命令可以把本地的结果推到远程中心库上
- 都有全局定位符的概念
- maven的全局定位符是 GroupId ArtifactId version
- docker的全局定位符是 name tag
- 都有一个配置文件指示用哪个中心库之类的
- .m2/settings.xml
- .docker/config.json
# 搭建一个私有docker registry
- https://www.linuxtechi.com/setup-private-docker-registry-kubernetes/
## 登录node 创建证书
- win10下用hyper-v建的minikube集群, 其master node的直接连接登录 用户名/密码
- https://www.jppinto.com/2020/01/username-and-password-for-minikube-virtual-machine/
- The default login is, username: “docker“, password: “tcuser“.
- 目的
- 私有registry应该是走https协议 需要证书
- 原文档使用NFS在多个nodes中共享证书
- 通过k8s yaml要求node把证书所在的目录开放给pod
- 我们的做法是假设只有minikube一个node, 那么仅在该node上创建证书即可
- 使用默认密码, 走hyper-v直连minikube这个node
- 创建证书的过程参考 上述文档
## 创建deployment 和 service
- 参考 上述文档中 private-registry.yaml 部分
- `kubectl apply -f ` 部署pod
- 校验 略
- 复制证书给worker node 我们没有worder node 略
- 参考 上述文档中 private-registry-svc.yaml 部分
- `kubectl apply -f` 部署service
- 改windows的etc/hosts 域名解析记录
- minikube ip 是 类似 172.26.81.175
- 自己想个域名 k8s-master
- 修改 `C:\Windows\System32\drivers\etc\hosts`
- 新增 172.26.81.175 k8s-master
- ping k8s-master 校验hosts修改结果
- 尝试使用这个私有registry
- `docker images` 查看本地镜像
- 使用tag重命名镜像, 带host前缀, 指示使用私有的k8s-master 库
- 参考 文档
- `docker push`
### Q&A
- Q: certificate is not valid for any names, but wanted to match k8s-master
- A: 当时创建证书时没填 common name 字段
- 直接上minikube node重新生成证书 同时参考下一个问题 使用SANs
- 参考 文档
- 重启deployment
- kubectl rollout restart deployments/<deployment-name>
- Q: certificate relies on legacy Common Name field xxx
- A: 设法用SANs签名方式 再生成一次证书
```
sudo openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout ./certs/registry.key -x509 -days 3650 \
-out ./certs/registry.crt -subj "/CN=k8s-master" \
-addext "subjectAltName = DNS:k8s-master"
```
- Q: certificate signed by unknown authority
- A: 参考 https://stackoverflow.com/questions/36041648/docker-ssl-cert-for-windows
- 从minikube的node上把证书下载下来
- 可以ssh 到 minicube_ip 用户名密码见上述minikube node默认用户名密码
- docker/tcuser
- 直接cat证书内容, 复制出来即可
- windows 版的docker客户端新增信任证书 ?
- 根据上述贴子的另一个回复, docker win10新版会直接采用windows已安装的证书
- 因此只需要双击刚复制出来的证书, 通过win10界面安装该证书即可
- 重启docker客户端(不知道是不是必须)
- 重新docker push 成功!
# 国内常用docker registry
- alibaba
- 要注册 略