使用 StatefulSet 部署 Mysql
-
数据库环境准备是应用的前置准备工作
-
先在 node 节点上安装 mysql
- $
sudo yum install mysql-server -y
安装 - $
sudo systemctl start mysqld
启动 - $
sudo systemctl enable mysqld
设置开启启动 - $
sudo mysql_secure_installation
设置安全选项 - $
mysql --version
查看版本
- $
-
我们在 node1 这个 work 节点部署,准备 app-mysql.yaml
yamlapiVersion: v1 kind: Service metadata: name: mysql-nodeport spec: ports: - port: 3306 nodePort: 30306 selector: app: mysql type: NodePort --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: "mysql" replicas: 1 # 虽然您要求不要副本,但StatefulSet通常需要至少一个副本 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0.36 env: - name: MYSQL_ROOT_PASSWORD value: "password" ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-config mountPath: /etc/mysql/conf.d - name: mysql-data mountPath: /var/lib/mysql volumes: - name: mysql-config hostPath: path: /tmp/mysql/conf.d type: DirectoryOrCreate - name: mysql-data hostPath: path: /tmp/mysql/data type: DirectoryOrCreate
-
$
kubectl create -f app-mysql.yaml
创建confservice/mysql-nodeport created statefulset.apps/mysql created
-
$
kubectl get all
confNAME READY STATUS RESTARTS AGE pod/mysql-0 1/1 Running 0 27s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 35h service/mysql-nodeport NodePort 10.1.183.195 <none> 3306:30306/TCP 27s NAME READY AGE statefulset.apps/mysql 1/1 27s
-
$
mysql -u root -P 30306 -h node1.k8s -p
confEnter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.36 MySQL Community Server - GPL Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
- 输入密码 password 就可以登录了
-
注意,在低版本的一些 mysql 中的配置会有不同,而且可能需要加上如下,不会意外退出
confcommand: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 30; done;" ]
-
现在,我们可以创建一个新的数据库了
-
$
create database blogDBTest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
confQuery OK, 1 row affected, 2 warnings (0.06 sec)
-
查看 $
show databases
conf+--------------------+ | Database | +--------------------+ | blogDBTest | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.03 sec)
-
可见,mysql数据库环境准备好了,这里只做了单实例的
-
注意,这个配置有很多的优化点,比如:集群副本,存储,密码加密等
- 密码这块,参考下面的配置
-
仅供参考,可关注我之前的博文以及持续关注 ...
为应用程序配置 Service 和 Development
1 ) 先说明下博客应用的底层配置
-
比如,当前博客应用的application.yml
yamlspring: thymeleaf: mode: HTML profiles: active: dev comment.avater: /images/avatar.png server: port: 5000
-
可以看到应用程序启动后的端口是 5000
-
继续看下其 Dockerfile 文件
yamlFROM openjdk:8-jdk-alpine3.7 VOLUME /tmp ADD target/blog.jar /blog.jar EXPOSE 5000 ENTRYPOINT ["java", "-jar", "/blog.jar"]
-
可见容器内对外暴露的也是 5000 的端口
-
application-dev.yml 文件中做了一些数据库相关的配置,如下
yamlspring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://${MYSQL_SERVER:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB_NAME_TEST:blogDB}?useUnicode=true&characterEncoding=utf-8 username: ${MYSQL_USER_TEST: root} password: ${MYSQL_PASSWORD_TEST: password}
2 )现在进入正题,应用程序的配置
-
$
vi app-blog.yaml
这个是博客应用程序的yaml文件yamlapiVersion: v1 kind: Service metadata: name: k8sblog spec: selector: app: k8sblog type: NodePort ports: - port: 5000 targetPort: 5000 nodePort: 30002 --- apiVersion: apps/v1 kind: Deployment metadata: name: k8sblog spec: selector: matchLabels: app: k8sblog template: metadata: labels: app: k8sblog spec: hostAliases: - ip: "10.211.10.2" hostnames: - "art.local" # 这里是我们的私有镜像中心 containers: - name: k8sblog image: 10.211.10.2:8081/docker-local/k8sblog:1.1 ports: - containerPort: 5000 env: - name: MYSQL_PORT value: "30306" - name: MYSQL_SERVER value: "node1.k8s" - name: MYSQL_DB_NAME_TEST value: blogDB - name: MYSQL_USER_TEST value: "root" - name: MYSQL_PASSWORD_TEST valueFrom: secretKeyRef: name: mysql-password-test key: MYSQL_PASSWORD_TEST imagePullSecrets: - name: regcred-local
-
这里的密码加密的生成,这里上面的可以进行参考,之前博文也有其他方式,请持续关注
- $
kubectl create secret generic mysql-password-test --from-literal=MYSQL_PASSWORD_TEST=password
- $
-
$
kubectl create -f app-blog.yaml
创建 -
$
kubectl get po
查看app成功运行 -
以上仅仅是一种演示,仅供参考
从私有镜像中心拉取/同步应用镜像
1 ) 拉取
- 从上面的yaml中,可以看到,
image: 10.211.10.2:8081/docker-local/k8sblog:1.1
这个配置 - 这个就是私有镜像中心拉取的
2 )上传同步
- 当应用程序修改源码后,需要重新打包, 重新将镜像传到镜像中心
- $
mvn package
- $
docker build -t 10.211.10.2:8081/docker-local/k8sblog:1.1 .
- $
docker push 10.211.10.2:8081/docker-local/k8sblog:1.1
- 注意,每次发版都要升级版本
3 )关于设置镜像拉取密码
-
从上面可以看到, 有如下配置
confimagePullSecrets: - name: regcred-local
-
这个就是在私有镜像中心设置的拉取镜像时的密码
-
$
kubectl create secret docker-registry regcred-local --docker-server=10.211.10.2:8081 --docker-username=admin --docker-password=password --docker-email=xxx@qq.com
- 这里
regcred-local
就代表你的用户名和密码加密后的code - $
kubectl describe secret regcred-local
可以看到加密了和之前的其他secret 一样的效果
- 这里
空间隔离
1 ) 关于空间隔离
- 空间的隔离,一般都是指的是 namespace
- default 命名空间可以用于测试,测试完成后需要归类到某个命名空间下
- 之前所有的 pod 都是运行在 default 命名空间中的
- $
kubectl get ns
查看所有命名空间 - $
kubectl create ns test
创建 test 命名空间
2 )创建相关环境的秘钥
-
$
kubectl create secret generic mysql-password-test --from-literal=MYSQL_PASSWORD_TEST=password -n test
- 创建 test 环境命名空间的 mysql 秘钥
-
$
kubectl create secret docker-registry regcred-local --docker-server=10.211.10.2:8081 --docker-username=admin --docker-password=password --docker-email=xxx@qq.com -n test
- 创建 test 环境命名空间的 拉取镜像的 秘钥
-
同时,我们可以在上述 yaml 配置下的 metadata 中添加命名空间
confmetadata: namespace: test
-
$
kubectl get secret -n test
查看test空间下创建的所有秘钥
私有镜像仓库管理
- 在本地研发测试的时候,不是直接部署到 docker-test, docker-prod
- 可以在local本地建空间来测试,比如在 docker-local下继续建
- docker-local-test
- docker-local-prod
- 这样在研发的时候就可以进行本地测试 test 和 prod了
- 同样,在 yaml 中对应的镜像地址可以修改,之前是这样的
- $
10.211.10.2:8081/docker-local/k8sblog:1.1
- $
- 现在没有必要改成如下的配置
- $
10.211.10.2:8081/docker-local-test/k8sblog:1.1
或 - $
10.211.10.2:8081/docker-local-prod/k8sblog:1.1
- $
- 只需要这样,使用虚拟镜像地址
- $
10.211.10.2:8081/docker/k8sblog:1.1
- 注意,所有的仓库都在 docker 组下
- 可以在 Set Me Up 中设置
- $
- 注意,实际使用中需要使用 API 和脚本去做镜像从一个仓库拷贝到另一个仓库的操作