【Kubernetes】第二十二篇 - k8s 部署 MySQL 服务(secret、deployment、service)

这篇具有很好参考价值的文章主要介绍了【Kubernetes】第二十二篇 - k8s 部署 MySQL 服务(secret、deployment、service)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,前言

上一篇,介绍基于 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:             <none>

再看 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       <none>        443/TCP          16d
service-cicd-mysql   NodePort    10.108.224.96   <none>        3306:30509/TCP   11s
service-pay-v1       NodePort    10.97.250.199   <none>        80:30114/TCP     2d19h
service-user-v1      NodePort    10.104.13.40    <none>        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 服务的创建和测试;

下一篇,介绍后端服务的部署;文章来源地址https://www.toymoban.com/news/detail-773966.html

到了这里,关于【Kubernetes】第二十二篇 - k8s 部署 MySQL 服务(secret、deployment、service)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)

    上一节讲解了K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群),这里来看看 K8s使用Helm部署mysql集群(主从数据库集群) 无本地存储: 当重启的时候,数据库消失 (1).打开官网的应用中心 打开应用中心,搜索mysql (2).安装  1).添加repo仓库 2).安装 具体命令如下:  3).自动生成

    2024年01月21日
    浏览(81)
  • 【从零开始学习C++ | 第二十二篇】C++新增特性(下)

    目录 前言: 类型推导: constexpr: 初始化列表: 基于范围的for循环: 智能指针之unique ptr Lambda表达式: 总结:         本文我们将继续介绍   C++ 11 新增十大特性的剩余六个,如果没有看过介绍前四个特性的小伙伴的可以点进我C++的专栏就可以看到。 类型推导(

    2024年02月14日
    浏览(63)
  • Kubernetes基础(二十一)-k8s的服务发现机制

    Kubernetes(K8s)是一个强大的容器编排平台,提供了丰富的功能来简化容器化应用的管理。其中之一重要的特性就是服务发现机制,它使得应用程序能够在K8s集群中动态地发现和访问其他服务。本文将深入研究K8s中的服务发现机制,探讨其原理、使用方法以及通过详细的示例演

    2024年02月20日
    浏览(49)
  • 【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes 是一个强大的容器编排平台,可以帮助我们管理和部署容器化应用。MySQL 是一个流行的关系型数据库,在生产环境中通常需要高可用性和数据持久性。 本文将介绍如何在 Kubernetes 中部署 MySQL 集群,以确保数据的高可用性和持久

    2024年04月17日
    浏览(49)
  • Kubernetes基础(二十三)-k8s持久化存储详解

    1.1 介绍 在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet会重新启动容器,但容器运行时产生的数据文件都将会丢失,之后容器会以最干净的状态启动。另外,当一个Pod运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用Volume解决。Pod只需要通

    2024年03月17日
    浏览(50)
  • Kubernetes基础(二十)-k8s存储对象Storage Classes

    在Kubernetes中,Storage Classes是用于定义不同存储配置的资源。它们允许开发者抽象存储的物理细节,使其更易于管理和使用。通过Storage Classes,可以定义存储的类型、性能、卷大小等参数,使得应用程序能够根据需求选择合适的存储。 Storage Classes工作的基本原理是通过定义标

    2024年02月19日
    浏览(43)
  • Kubernetes(K8s)从入门到精通系列之十二:安装和设置 kubectl

    Kubernetes 命令行工具 kubectl, 让你可以对 Kubernetes 集群运行命令。 你可以使用 kubectl 来部署应用、监测和管理集群资源以及查看日志。 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.27 版本的客户端能与 v1.26、 v1.27 和 v1.28 版本的控制面通信。 用最新兼容

    2024年02月14日
    浏览(45)
  • Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

    wordpress是用于快速搭建博客系统。 该yaml文件创建一个mysql,并且生成一个service,service对外暴露的端口是3306 我们发现,搭建成功了,用浏览器访问192.168.56.101:30493,发现访问成功了! 在集群中,pod之间可以通过service 的name进行访问,不仅仅是ip,这就意味着,service中不仅帮

    2024年02月12日
    浏览(98)
  • Kubernetes(K8S)集群部署

    目录 一、创建3台虚拟机 二、为每台虚拟机安装Docker 三、安装kubelet 3.1 安装要求 3.2 为每台服务器完成前置设置 3.3 为每台服务器安装kubelet、kubeadm、kubectl 四、使用kubeadm引导集群 4.1 master服务器 4.2 node1、node2服务器 4.3 初始化主节点 4.4 work节点加入集群 五、token过期怎么办?

    2024年02月07日
    浏览(84)
  • yum部署kubernetes(k8s)集群、k8s常用资源管理

    目录 一、环境搭建 1、准备环境 1)计算机说明,建议系统版本7.4或者7.6 2)修改所有主机的计算机名设置host文件  2、安装master节点 1)安装etcd配置etcd 2)安装k8s-master节点 3)配置apiserver 4)配置controller和scheduler 5)启动k8s服务 3、安装k8s-master上的node 1)安装node 2)配置kube

    2024年02月13日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包