學(xué)習(xí)日志 211222 部署自用mysql 并使用java程序連接
# 211222
# zookeeper示例
- 同一個集群(此處是sts)可以映射給多個服務(wù)
? - 一般是不同端口
? - k8s描述文件中也可以使用command指令指定啟動命令
? ? - 和dockerfile的CMD的優(yōu)先級?
- 后半部分 略
# 部署自己的mysql集群
- 2個mysql實(shí)例 都是主 沒有備
- 每個實(shí)例給10G硬盤, 500m cpu, 內(nèi)存?
- 配一個headless 的service (即類型是clusterIP: None)
- 用secret做密碼 密碼就用 Mysql123
- 用kustomization.yaml技術(shù) 目錄是 mycluster
## 步驟
- 建目錄
- 復(fù)制 kustomization.yaml 進(jìn)目錄
- 修改secret, 密碼設(shè)成Mysql123
- 刪除wordpress行
- 復(fù)制mysql-deployment.yaml 進(jìn)目錄
- 修改app的label, 改為 mycluster
- mysql的服務(wù)名 mycluster-mysql
- pod controller的部分, 把kind改為 StatefulSet
- replicas: 2
- 原strategy部分替換為
? ```
? updateStrategy:
? ? type: RollingUpdate
? ```?
- password部分不動
- pvc template
? - 復(fù)制一個mysql-persistent-storage段落過來
? - 修改name
? - 刪除原pvc的資源申請
- 給statefulset增加serviceName 字段
? - 對應(yīng)報(bào)錯
? ? ```
? ? 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(和無狀態(tài)集群不同)
? - 無狀態(tài)集群的名字是 deployment名字 + rs名字(版本) + podId
- 限制cpu使用 每個mysql實(shí)例使用半個cpu
? - 在containers下面增加如下語句
? ? ```
? ? ? ? resources:
? ? ? ? ? limits:
? ? ? ? ? ? cpu: "0.5"
? ? ? ? ? requests:
? ? ? ? ? ? cpu: "0.5"
? ? ```
- 重新apply -k
## 校檢
- 檢查pods
? - mycluster-mysql-0 mycluster-mysql-1
? - 都是Running狀態(tài)了
- 嘗試連接上去
? - 我們的service是headless service 無法從外部訪問
? - 也沒必要從外部訪問 內(nèi)部pod間使用hostname訪問
? - 現(xiàn)在只能 exec -- bash
? - `kubectl exec -ti mycluster-mysql-0 -- bash`
? - 上去執(zhí)行 mysql -u root -p
? - 密碼輸入Mysql123
? - 登錄成功 mysql正常運(yùn)行
- 檢查用其它pod訪問hostname的方式
? - mycluster-mysql-0
? - 嘗試用java程序?
## 用Java程序連接上述數(shù)據(jù)庫
- 在兩個mysql實(shí)例上都使用create database語句建testdb庫
? - 使用 -- bash
? - 細(xì)節(jié) 略
- 給springbootdemo工程增加mysql連接能力
- 直接引入mybatis starter 和 mysql驅(qū)動
? ```
? ? ? ? <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相關(guān)的三項(xiàng)
? - 注意連接使用的hostname是 mycluster-mysql-0.mycluster-mysql
? - 即hostname.servicename 的格式
? - mybatis starter會自動啟動該默認(rèn)datasource
? - 后4項(xiàng)是要求之前引入過的actuator去輸出datasource的健康狀態(tài)
- 打包更新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 報(bào)錯 缺少mysql驅(qū)動類
- A: 引入 mysql-connector-java
? - 注意版本 用最新的就完了
- Q: k8s沒有更新image版本
- A: 加 imagePullPolicy: Always
- Q: actuator報(bào)db啟動失敗 連接不上
- A: StatefulSet 的內(nèi)部域名是 `<podname>.<servicename>` 的格式
? - 在本例中為 `mycluster-mysql-0.mycluster-mysql`
? - 不是 `mycluster-mysql-0`
- Q: 如何檢查內(nèi)部DNS解析紀(jì)錄
- A: `kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm`
? - `nslookup mycluster-mysql-0.mycluster-mysql`
? - exit退出時, 該臨時pod會被刪除 這種方式很適合用來搞些一次性的事情