容器与集群小实训
目录
- 实训简介
- 1. MySQL数据库安装
- 2. MySQL数据库设置远程登录
- 3. 用navicat连接数据库并完成建表
- 4. 制作dockerfile并创建镜像,运行容器
- 5. 构建镜像并推送到阿里云镜像仓库
- 实训总结
实训简介
搭建一主两从k8s集群并部署MySQL(可用docker搭建MySQL),构建Python爬虫镜像,定时爬取网页内容并持久化到数据库,把镜像推送到阿里云镜像仓库。
1. MySQL数据库安装
k8s部署MySQL
1. 搭建一主两从k8s集群
1. 服务器配置
需要三台服务器,ip在同一网段,使其可以互相通信,三台服务器可以连接外网,配置不能太低,要满足docker运行要求,建议2核2g,硬盘20g即可,本次实训用的镜像是CentOS 7.9。
类似于这种:

2. 准备工作
下面这些操作,三台机器都要执行!
关闭防火墙
1 | systemctl stop firewalld |
关闭SELinux
1 | # 永久关闭 |
关闭Swap
1 | # 永久关闭 |
永久关闭的时候需要注释这一行(带swap)

设置主机名
- 192.168.154.130:
hostnamectl set-hostname k8s-master - 192.168.154.131:
hostnamectl set-hostname k8s-node1 - 192.168.154.132:
hostnamectl set-hostname k8s-node2
设置完成后:
1 | #192.168.154.130 |
修改host文件
1 | cat >> /etc/hosts << EOF |
将桥接的 IPv4 流量传递到 iptables
1 | cat > /etc/sysctl.d/k8s.conf << EOF |
使其生效:
1 | sysctl --system |
同步时间
1 | yum install ntpdate -y |
3. 开始安装Kubernetes
三台服务器都需要完成以下配置
安装docker
每台电脑都需要安装docker,可执行一下脚本:
1 |
|
以上脚本执行完之后docker就安装好了
docker
复制以下代码:

然后在中括号下面加上一行代码:
1 | "exec-opts": ["native.cgroupdriver=systemd"] |
添加完成后:
1 | sudo mkdir -p /etc/docker |
添加K8S的yum源
执行以下代码:
1 | cat > /etc/yum.repos.d/kubernetes.repo << EOF |
安装 kubelet、kubeadm 和 kubectl
通过以下命令安装:
1 | yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 |
4. Kubernetes,启动!
启动master
查看版本:
1 | kubeadm version |
如图:

然后执行命令启动:
1 | kubeadm init \ |
注意 --apiserver-advertise-address=192.168.154.130 后面的IP地址需要改成自己mater的IP,然后 --kubernetes-version v1.23.6 的版本注意改成自己K8S的版本。
获取启动信息
查看启动成功的信息

本机执行这些命令(以上面截图的为准):
1 | mkdir -p $HOME/.kube |
启动两个Slave(node节点执行)
还记得上面需要记录下来的命令吗,就是这行:
1 | kubeadm join 192.168.154.130:6443 --token 7vdvuj.5kvyhzz3ks3tspuy \ |
执行它,查看结果:

为 master 安装网络插件
我们在master中执行这一行命令:
1 | kubectl get nodes |
查看结果:

可以看到两个node成功注册,但是没能达到准备状态,因为 STATUS 仍然是 NotReady 状态,我们需要为 master 安装网络插件:
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
看到这个代表安装成功(如果没有安装成功,那么需要将文件下载下来,然后将url替换成下载下来的文件):

但是还需要等一下,因为他正在联网下载依赖呢,然后再次查看,就变为 Ready 状态了:

我这个node1节点有问题,我找了许久还是报错,最后我放弃了,因为一个节点不影响MySQL的部署,我还是决定先继续做实验,回头重新安装k8s试试,应该是漏了某个步骤,而正常的应该是这种:

如果如上图所示,那你的一主两从集群就部署成功了,中间会遇到各种各样的报错,你可以选择执行某些命令时忽略这些错误项,但是还有一些问题是需要自己解决的。
参考:CentOS7上搭建Kubernetes(K8S)集群并部署nginx(kubeadm方式)_k8s高可用 centos+nginx+kubeadm-CSDN博客
2. 在集群上部署MySQL
1. 创建namespace,把mysql部署在单独的名称空间中
1 | kubectl create namespace dev |
2. 创建持久卷PV,用来存储mysql数据文件
1. 定义一个容量大小为1GB的PV,挂载到/nfs/data/01目录
1 | mkdir -p /nfs/data/01 |
2. 编写mysql-pv.yaml文件内容,要创建的pv对象名称:pv-1gi
1 | apiVersion: v1 |
3. 创建该PV对象
1 | kubectl create -f mysql-pv.yaml |
4. 查看创建结果
1 | kubectl get pv |
如图:


3. 创建持久卷声明PVC
1. 创建持久卷声明PVC
编写mysql-pvc.yaml文件内容,要创建的pvc对象名称是:mysql-pvc
1 | apiVersion: v1 |
2. 创建该PVC对象
1 | kubectl create -f mysql-pvc.yaml |
3. 查看创建结果
1 | kubectl get pvc -n dev |
可以看到mysql-pvc对象已经和pv-1gi对象绑定上了:

4. 创建Secret对象用来保存mysql的root用户密码
1. 设置密码为123456,执行创建命令
1 | kubectl create secret generic mysql-root-password --from-literal=password=123456 -n dev |
2. 查看创建结果
1 | kubectl get secret -n dev |


5. 创建service
1. 编辑mysql-svc.yaml文件内容
1 | apiVersion: apps/v1 |
service使用NodePort类型,指定暴露的nodePort端口为31233,我们会在宿主机使用navicat客户端对mysql进行访问。
2. 执行创建命令
1 | kubectl create -f mysql-svc.yaml |
3. 查看创建结果
1 | kubectl get pod,svc -n dev |

docker部署MySQL
1 | docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql |
2. MySQL数据库设置远程登录
k8s进入MySQL容器内部
1 | kubectl exec -it mysql-657494c4df-thlqf /bin/bash -n dev |
其中mysql-657494c4df-thlqf是mysql数据库所在pod的pod名称。
docker进入MySQL容器内部
1 | docker exec -it 容器名or容器id /bin/bash |
配置root用户远程可连接
1 | ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY '123456'; |
创建mydb库并授权给root用户
1 | create database mydb; |
3. 用navicat连接数据库并完成建表
连接k8s下的MySQL数据库
并建表,插入一条测试数据:
1 | create table test0918(col1 varchar(100)); |
然后新建一个后续实验用到的表:
1 | CREATE TABLE product_info( |

(此处找不到原图了,只得先用一张docker最终实验测试成功的截图)
连接docker下的MySQL数据库
建表语句同上

4. 制作dockerfile并创建镜像,运行容器
镜像中需要包含python环境,并且包含爬虫的数据解析包,并包含脚本的自动调度命令。
1. 创建定时任务的Dockerfile
1 | # 使用阿里云的CentOS 7镜像作为基础镜像 |
2. 编写script.sh和mysql.py
script.sh:
1 | python3 /mysql.py >> /var/log/cron.log 2>&1 |
mysql.py:
注意mysql.py中的数据库端口,这里docker中和k8s中并不一样
1 | #!/usr/bin/env python |
3. 利用Dockerfile创建镜像
1 | docker build -t docker-crond . |

4. 运行并进入容器内部,配置定时任务(若crond 未启动,直接运行此命令)
1 | docker run -it docker-crond /bin/bash |
添加如下内容:
1 | */5 * * * * /script.sh >> /var/log/cron.log 2>&1 |
2>&1是一个重定向操作符,用于将标准错误(文件描述符2)重定向到标准输出(文件描述符1)
验证:
1 | crontab -l |

5. 查看数据库结果
脚本运行起来之后,就可以通过navicat查看数据了,脚本调度调度失败,相关的失败日志信息就会写入到
/var/log/cron.log中。
k8s数据库结果:

docker数据库结果:

5. 构建镜像并推送到阿里云镜像仓库
1. 构建镜像
先停止容器,停止前记住容器id:
1 | docker ps |

1 | docker commit 容器id 镜像名:版本号 |

2. 推送到阿里云镜像仓库
1. 准备工作
1. 找到阿里云容器镜像服务ACR,并打开控制台:

2. 找到个人实例,先创建命名空间:

3. 在该命名空间下创建一个镜像仓库my-docker-crond,注意地域:

剩下的根据操作指南操作。
2. 登录阿里云Docker Registry


3. tagandpush


4. 仓库验证

实训总结
这次实训的重点在于搭建一主两从k8s集群,中间我遇到了各种各样的错误,我还是不能找到一个百分百搭建成功的方法,说实话,有点挫败感,不过我依然从中学到了很多知识,了解了k8s的基本架构,更重要的是,我锻炼了解决实际问题的能力。