一,前言

上一篇,介绍基于 k8s 项目部署流程设计;

本篇,介绍 MySQL 服务的部署;

二,部署 MySQL 服务

部署 MySQL

可以为指定 node 添加污点,专门用于 mysql 部署(当前只有一个节点,不考虑);为了保证mysql容器重启时数据不会丢失:创建 mysql 数据目录,用于存储 mysql 数据,实现 MySQL 数据的持久化;创建 Secret 对象,向为 mysql 容器提供用户名、密码信息;创建 mysql Deployment 配置文件,并创建 deploy 完成 pod 部署;创建 mysql Service 配置文件,并创建 service 解决 ip 漂移问题,对外提供 pod 访问;为 k8s-master 安装 mysql,使 k8s-master 能够使用 mysql 命令,测试数据库使用;

三,MySQL 数据的持久化

容器中的数据是需要保留的,否则容器重启就没了,需要创建数据目录,存储 MySQL 数据;

在本地创建 MySQL 数据文件夹,然后挂载到 MySQL 容器,实现 MySQL 数据的可以持久化

在 k8s-node 节点创建 MySQL 数据文件夹(此文件夹必须为空,否则导致 MySQL 启动失败;

// 创建数据目录文件夹(mysql 运行时的数据目录,约定好的)

[root@k8s-master ~]# mkdir /var/lib/mysql

[root@k8s-master ~]# ll /var/lib/mysql

总用量 0

创建一个新的文件夹:cicd

将所有的配置文件都放在这个cicd目录下

[root@k8s-master ~]# mkdir cicd

[root@k8s-master ~]# cd cicd/

[root@k8s-master cicd]#

四,创建 Secret 对象

通过 Secret 对象,将 MySQL 的用户名、密码传递到镜像中使用;

创建 Secret 对象:mysql-auth

// 创建 secret,generic:基于普通文本格式,--from-literal:从字面量创建

[root@k8s-master cicd]# kubectl create secret generic mysql-auth --from-literal=username=root --from-literal=password=123456

secret/mysql-auth created

[root@k8s-master cicd]# kubectl get secret mysql-auth

NAME TYPE DATA AGE

mysql-auth Opaque 2 17s

[root@k8s-master cicd]# kubectl get secret mysql-auth -o yaml

apiVersion: v1

data:

password: MTIzNDU2

username: cm9vdA==

kind: Secret

metadata:

creationTimestamp: "2022-01-06T07:14:25Z"

managedFields:

- apiVersion: v1

fieldsType: FieldsV1

fieldsV1:

f:data:

.: {}

f:password: {}

f:username: {}

f:type: {}

manager: kubectl-create

operation: Update

time: "2022-01-06T07:14:25Z"

name: mysql-auth

namespace: default

resourceVersion: "1934676"

uid: c4a219d2-3754-4133-8484-9b4caa5a54cd

type: Opaque

[root@k8s-master cicd]# echo MTIzNDU2 | base64 -d

123456

[root@k8s-master cicd]# echo cm9vdA== | base64 -d

root

五,创建 Deployment

创建 mysql Deployment 配置文件,并创建 deploy 完成 pod 部署;

创建 deploy:deployment-cicd-mysql.yaml

[root@k8s-master cicd]# vi deployment-cicd-mysql.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: cicd-mysql

spec:

replicas: 1

selector:

matchLabels:

app: cicd-mysql

template:

metadata:

labels:

app: cicd-mysql

spec:

containers:

- name: cicd-mysql

image: mysql:5.7

imagePullPolicy: IfNotPresent #镜像拉取策略:如果不存在就拉取镜像

args:

- "--ignore-db-dir=lost+found"

ports:

- containerPort: 3306

volumeMounts: #挂载数据卷

- name: mysql-data

mountPath: "/var/lib/mysql" #挂载到容器内的目录

env: #环境变量

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-auth

key: password #引用mysql-auth中的password值

volumes: #数据卷

- name: mysql-data

hostPath: #宿主机路径

path: /var/lib/mysql #宿主机的目录

type: Directory

备注:以下配置文档中有,但视频没用

tolerations:

- key: "mysql"

operator: "Equal"

value: "true"

effect: "NoSchedule"

备注:

mysql 自带 root 用户,只设置 root 用户密码即可使用;

环境变量 env MYSQL_ROOT_PASSWORD 是在 mysql:5.7 的镜像中约定的;

mysql容器启动成功后,会读取到 MYSQL_ROOT_PASSWORD 并设置为密码;

如:docker run mysql:5.7 --env PASSWORD=123

生效配置

[root@k8s-master cicd]# kubectl apply -f deployment-cicd-mysql.yaml

deployment.apps/cicd-mysql created

[root@k8s-master cicd]# kubectl get pods

NAME READY STATUS RESTARTS AGE

cicd-mysql-745975859b-kstnh 0/1 Pending 0 65s

pay-v1-6db6455b8-np2hw 1/1 Running 0 6h38m

user-v1-9f4d589cc-rdmnz 1/1 Running 0 24h

v4-57b4cf7fd9-zcl45 0/1 ImagePullBackOff 0 7d

v4-fb4cd75f5-bf2pf 0/1 ImagePullBackOff 0 2d17h

清理一下资源,删除 pay-v1、user-v1、v4 的 deploy

[root@k8s-master cicd]# kubectl delete deploy pay-v1 user-v1 v4

deployment.apps "pay-v1" deleted

deployment.apps "user-v1" deleted

deployment.apps "v4" deleted

[root@k8s-master cicd]# kubectl get pods

NAME READY STATUS RESTARTS AGE

cicd-mysql-745975859b-kstnh 0/1 Pending 0 4m8s

cicd-mysql-745975859b-kstnh 这个 pod 是 pending 状态

[root@k8s-master cicd]# kubectl describe pods cicd-mysql-745975859b-kstnh

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Warning FailedScheduling 49s (x7 over 4m51s) default-scheduler 0/2 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 1 node(s) had taint {pay-v1: true}, that the pod didn't tolerate.

kubectl logs cicd-mysql-6cbd4f95-g64hh

这是因为,k8s-node 服务器之前配置了 pay-v1: true,需要删除掉污点

// 查看污点

[root@k8s-master cicd]# kubectl describe node k8s-node

Taints: pay-v1=true:NoSchedule

// 删除污点

[root@k8s-master cicd]# kubectl taint nodes k8s-node pay-v1-

node/k8s-node untainted

// 再次查看,没有污点了

[root@k8s-master cicd]# kubectl describe node k8s-node

Taints:

再看 pod 信息,已经在创建中了

[root@k8s-master cicd]# kubectl get pods

NAME READY STATUS RESTARTS AGE

cicd-mysql-745975859b-kstnh 0/1 ContainerCreating 0 20m

但是有些问题,再看一下容器描述

[root@k8s-master cicd]# kubectl describe pods cicd-mysql-745975859b-kstnh

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Warning FailedScheduling 6m58s (x20 over 24m) default-scheduler 0/2 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 1 node(s) had taint {pay-v1: true}, that the pod didn't tolerate.

Normal Scheduled 6m36s default-scheduler Successfully assigned default/cicd-mysql-745975859b-kstnh to k8s-node

Warning FailedMount 2m15s (x2 over 4m33s) kubelet Unable to attach or mount volumes: unmounted volumes=[mysql-data], unattached volumes=[mysql-data default-token-q4qxd]: timed out waiting for the condition

Warning FailedMount 24s (x11 over 6m35s) kubelet MountVolume.SetUp failed for volume "mysql-data" : hostPath type check failed: /var/lib/mysql is not a directory

原因是,pod 在 k8s-node 服务器上部署,但 k8s-node 服务器上并没有/var/lib/mysql目录

所以,需要在 k8s-node 服务器上创建/var/lib/mysql目录

[root@k8s-node ~]# mkdir /var/lib/mysql

删除 pod,再看新启动的 pod,已经正常 Running

(注意:1,不删除 pod 过一会儿也会正常 Running;2,删除 pod后,副本会重新创建)

[root@k8s-master deployment]# kubectl delete pod cicd-mysql-745975859b-kstnh

pod "cicd-mysql-745975859b-kstnh" deleted

[root@k8s-master deployment]# kubectl get pods

NAME READY STATUS RESTARTS AGE

cicd-mysql-745975859b-gpwzh 1/1 Running 0 10s

[root@k8s-master deployment]# kubectl describe pods cicd-mysql-745975859b-gpwzh

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Normal Scheduled 29s default-scheduler Successfully assigned default/cicd-mysql-745975859b-gpwzh to k8s-node

Normal Pulled 25s kubelet Container image "mysql:5.7" already present on machine

Normal Created 25s kubelet Created container cicd-mysql

Normal Started 25s kubelet Started container cicd-mysql

查看日志:

[root@k8s-master deployment]# kubectl logs cicd-mysql-745975859b-gpwzh

2022-01-07T01:39:13.425378Z 0 [Note] mysqld: ready for connections.

Version: '5.7.36' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

mysql 已经启动成功,等待连接

六,k8s-master 安装 mysql 命令

为 k8s-master 安装 mysql,使 k8s-master 能够使用 mysql 命令,测试数据库使用;

由于 k8s-maste 没有安装 mysql 所以不能使用 mysql 命令

1,k8s-maste 安装 mysql

2,可以进入容器中操作

[root@k8s-master deployment]# kubectl exec -it cicd-mysql-745975859b-gpwzh -- bash

root@cicd-mysql-745975859b-gpwzh:/# mysql -uroot -p123456

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 4

Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, 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> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

4 rows in set (0.01 sec)

mysql> show tables;

+----------------+

| Tables_in_cicd |

+----------------+

| users |

+----------------+

1 row in set (0.00 sec)

mysql> select * from users;

Empty set (0.00 sec)

\

创建 cicd 数据库,创建表

mysql> create database cicd;

Query OK, 1 row affected (0.04 sec)

mysql> use cicd;

Database changed

mysql> CREATE TABLE `users` (

-> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',

-> `name` varchar(255) NOT NULL COMMENT '',

-> `age` int(11) NOT NULL COMMENT '',

-> `sex` varchar(255) NOT NULL COMMENT '1 2',

-> PRIMARY KEY (`id`)

-> ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

Query OK, 0 rows affected (0.03 sec)

退出 mysql,退出pod,回到 k8s-master

mysql> exit;

Bye

root@cicd-mysql-745975859b-gpwzh:/# exit

exit

给 k8s-master 安装 mysql:

// 下载MySQL源安装包

wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

// 安装MySQL源

yum -y install mysql57-community-release-el7-11.noarch.rpm

// 安装 mysql

yum install mysql-community-server -y

k8s-master 访问 MySQL

[root@k8s-master ~]# cat /etc/hosts

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

172.17.178.106 k8s-node

172.17.178.105 k8s-master

[root@k8s-master cicd]# mysql -h172.17.178.105 -P3306 -uroot -p123456

mysql: [Warning] Using a password on the command line interface can be insecure.

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.178.105' (111)

还不能访问,因为没有服务

七,创建 Service

由于 pod 的 ip 是会漂移的, 需要通过 Service 访问 pod,需要创建服务

创建 service:service-cicd-mysql.yaml

[root@k8s-master cicd]# vi service-cicd-mysql.yaml

apiVersion: v1

kind: Service

metadata: #源数据

name: service-cicd-mysql

spec: #规格

selector: #选择器

app: cicd-mysql #与deployment配置中的container-name相对应

ports: #将pod的 3306端口代理到宿主机的3306端口

- protocol: TCP

port: 3306

targetPort: 3306 #虚拟端口->真正的端口要看Service启动后实际分配的

type: NodePort #不写就不能访问到pod

生效配置,服务启动

[root@k8s-master cicd]# kubectl apply -f service-cicd-mysql.yaml

service/service-cicd-mysql created

[root@k8s-master cicd]# kubectl get service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 443/TCP 16d

service-cicd-mysql NodePort 10.108.224.96 3306:30509/TCP 11s

service-pay-v1 NodePort 10.97.250.199 80:30114/TCP 2d19h

service-user-v1 NodePort 10.104.13.40 80:31071/TCP 14d

3306:30509 服务的内部端口/外部端口(外部访问 Service 中的 mysql 服务使用的端口号)

数据库端口:访问 Service 的 30509 端口

[root@k8s-master cicd]# mysql -h172.17.178.105 -P30509 -uroot -p123456

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 7

Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, 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> use cicd;

Database changed

mysql> show tables;

+----------------+

| Tables_in_cicd |

+----------------+

| users |

+----------------+

1 row in set (0.00 sec)

mysql> exit;

Bye

数据库配置完成;

八,结尾

本篇,完成了 mysql 服务的创建和测试;

下一篇,介绍后端服务的部署;

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: