学习日志 211222 部署自用mysql 并使用java程序连接
# 211222
# zookeeper示例
- 同一个集群(此处是sts)可以映射给多个服务
- 一般是不同端口
- k8s描述文件中也可以使用command指令指定启动命令
- 和dockerfile的CMD的优先级?
- 后半部分 略
# 部署自己的mysql集群
- 2个mysql实例 都是主 没有备
- 每个实例给10G硬盘, 500m cpu, 内存?
- 配一个headless 的service (即类型是clusterIP: None)
- 用secret做密码 密码就用 Mysql123
- 用kustomization.yaml技术 目录是 mycluster
## 步骤
- 建目录
- 复制 kustomization.yaml 进目录
- 修改secret, 密码设成Mysql123
- 删除wordpress行
- 复制mysql-deployment.yaml 进目录
- 修改app的label, 改为 mycluster
- mysql的服务名 mycluster-mysql
- pod controller的部分, 把kind改为 StatefulSet
- replicas: 2
- 原strategy部分替换为
```
updateStrategy:
type: RollingUpdate
```
- password部分不动
- pvc template
- 复制一个mysql-persistent-storage段落过来
- 修改name
- 删除原pvc的资源申请
- 给statefulset增加serviceName 字段
- 对应报错
```
error: error validating ".\\mycluster\\": error validating data: ValidationError(StatefulSet.spec): missing required field "serviceName" in io.k8s.api.apps.v1.Stateful
SetSpec; if you choose to ignore these errors, turn validation off with --validate=false
```
- 理由 hostname依赖于serviceName(和无状态集群不同)
- 无状态集群的名字是 deployment名字 + rs名字(版本) + podId
- 限制cpu使用 每个mysql实例使用半个cpu
- 在containers下面增加如下语句
```
resources:
limits:
cpu: "0.5"
requests:
cpu: "0.5"
```
- 重新apply -k
## 校检
- 检查pods
- mycluster-mysql-0 mycluster-mysql-1
- 都是Running状态了
- 尝试连接上去
- 我们的service是headless service 无法从外部访问
- 也没必要从外部访问 内部pod间使用hostname访问
- 现在只能 exec -- bash
- `kubectl exec -ti mycluster-mysql-0 -- bash`
- 上去执行 mysql -u root -p
- 密码输入Mysql123
- 登录成功 mysql正常运行
- 检查用其它pod访问hostname的方式
- mycluster-mysql-0
- 尝试用java程序?
## 用Java程序连接上述数据库
- 在两个mysql实例上都使用create database语句建testdb库
- 使用 -- bash
- 细节 略
- 给springbootdemo工程增加mysql连接能力
- 直接引入mybatis starter 和 mysql驱动
```
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
```
- 编写applications.properties
```
spring.datasource.url=jdbc:mysql://mycluster-mysql-0.mycluster-mysql:3306/testdb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Mysql123
management.endpoint.health.show-details=always
management.health.db.enabled=true
endpoints.health.enabled=true
endpoints.health.sensitive=false
```
- spring.datasource相关的三项
- 注意连接使用的hostname是 mycluster-mysql-0.mycluster-mysql
- 即hostname.servicename 的格式
- mybatis starter会自动启动该默认datasource
- 后4项是要求之前引入过的actuator去输出datasource的健康状态
- 打包更新docker image
- 修改k8s描述文件
- 使用latest版本的镜像
- 增加 imagePullPolicy: Always 在container 层
- 访问 actuator 检查 datasource 启动情况
- http://192.168.2.15:31000/actuator/health
- 有 `"db":{"status":"UP" ...`
### Q&A
- Q: mvn package 报错 缺少mysql驱动类
- A: 引入 mysql-connector-java
- 注意版本 用最新的就完了
- Q: k8s没有更新image版本
- A: 加 imagePullPolicy: Always
- Q: actuator报db启动失败 连接不上
- A: StatefulSet 的内部域名是 `<podname>.<servicename>` 的格式
- 在本例中为 `mycluster-mysql-0.mycluster-mysql`
- 不是 `mycluster-mysql-0`
- Q: 如何检查内部DNS解析纪录
- A: `kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm`
- `nslookup mycluster-mysql-0.mycluster-mysql`
- exit退出时, 该临时pod会被删除 这种方式很适合用来搞些一次性的事情