k3s搭建MySQL数据库及数据持久化及rancher管理K3s

【环境介绍】

系统环境:CentOS Linux release 7.3 + Docker version 20.10.2 + k3s version v1.20.4+k3s1 + MySQL5.7.33
 
【安装过程】
安装docker
使用脚本安装(前提能连网):

cat > install_docker.sh
#!/bin/bash
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce

#配置docker镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1jk30jsb.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
systemctl enable docker.service
docker -v

然后直接运行脚本:sh install_docker.sh

 

【安装K3S】

当前为单点server节点:

curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_EXEC="--docker" INSTALL_K3S_MIRROR=cn sh -s -

安装完成后,修改配置下,编辑 k3s.service 文件
vim /etc/systemd/system/multi-user.target.wants/k3s.service
在这里需要修改ExecStart的值,将其修改为:
/usr/local/bin/k3s server --docker --no-deploy traefik

重启下 k3s,执行以下两条命令
systemctl daemon-reload
service k3s restart

查看信息,返回正常运行即可:

[root@k8snode1 data]# service k3s status
Redirecting to /bin/systemctl status k3s.service
● k3s.service - Lightweight Kubernetes
Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2021-03-24 14:47:48 CST; 3h 19min ago
Docs: https://k3s.io
Process: 39732 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Process: 39727 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
Main PID: 39734 (k3s-server)
Memory: 503.4M
CGroup: /system.slice/k3s.service
└─39734 /usr/local/bin/k3s server

3月 24 18:03:38 k8snode1 k3s[39734]: I0324 18:03:38.493416 39734 trace.go:205] Trace[21479135]: "Get" url:/api/v1/namespaces/kube-system/endpoints/rancher.io-local-path,user-agent:local-path-provisioner/v0.0.0 (lin...tal time: 640ms):
3月 24 18:03:38 k8snode1 k3s[39734]: Trace[21479135]: ---"About to write a response" 640ms (18:03:00.493)
3月 24 18:03:38 k8snode1 k3s[39734]: Trace[21479135]: [640.641777ms] [640.641777ms] END
3月 24 18:04:18 k8snode1 k3s[39734]: I0324 18:04:18.168017 39734 trace.go:205] Trace[2036722184]: "GuaranteedUpdate etcd3" type:*core.Endpoints (24-Mar-2021 18:04:17.622) (total time: 545ms):
3月 24 18:04:18 k8snode1 k3s[39734]: Trace[2036722184]: ---"Transaction prepared" 203ms (18:04:00.826)
3月 24 18:04:18 k8snode1 k3s[39734]: Trace[2036722184]: ---"Transaction committed" 341ms (18:04:00.167)
3月 24 18:04:18 k8snode1 k3s[39734]: Trace[2036722184]: [545.300086ms] [545.300086ms] END
3月 24 18:04:18 k8snode1 k3s[39734]: I0324 18:04:18.168333 39734 trace.go:205] Trace[2026568965]: "Update" url:/api/v1/namespaces/kube-system/endpoints/rancher.io-local-path,user-agent:local-path-provisioner/v0.0.0...tal time: 545ms):
3月 24 18:04:18 k8snode1 k3s[39734]: Trace[2026568965]: ---"Object stored in database" 545ms (18:04:00.168)
3月 24 18:04:18 k8snode1 k3s[39734]: Trace[2026568965]: [545.942876ms] [545.942876ms] END

查看默认命名空间
kubectl get ns
kubectl get all -n kube-system

 

【搭建PV用于持久化数据】

安装NFS服务

[root@k8snode1 ~]# yum -y install nfs-utils
已加载插件:fastestmirror, langpacks
Repository base is listed more than once in the configuration
Loading mirror speeds from cached hostfile
正在解决依赖关系
......
更新完毕:
nfs-utils.x86_64 1:1.3.0-0.68.el7

作为依赖被升级:
gssproxy.x86_64 0:0.7.0-29.el7 krb5-devel.x86_64 0:1.15.1-50.el7 krb5-libs.x86_64 0:1.15.1-50.el7 krb5-workstation.x86_64 0:1.15.1-50.el7 libini_config.x86_64 0:1.3.1-32.el7 libkadm5.x86_64 0:1.15.1-50.el7

完毕!

启动NFS服务
[root@k8snode1 ~]# systemctl start nfs
[root@k8snode1 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since 三 2021-03-24 10:26:50 CST; 6s ago
Process: 19435 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 19419 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 19417 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 19419 (code=exited, status=0/SUCCESS)
Memory: 0B
CGroup: /system.slice/nfs-server.service

3月 24 10:26:50 k8snode1 systemd[1]: Starting NFS server and services...
3月 24 10:26:50 k8snode1 systemd[1]: Started NFS server and services.

创建个存储的目录,这里定义为v1,当前使用主节点创建(如果需要使用挂载方式具体查看Linux文档)注意这里写IP为自己服务器的IP网段
[root@k8snode1 ~]# mkdir -p /mnt/v1

[root@k8snode1 ~]# cat >> /etc/exports <<EOF
> /mnt/v1 192.168.205.0/24(rw,no_root_squash)
> EOF
[root@k8snode1 ~]# exportfs -arv
exporting 192.168.205.0/24:/mnt/v1
[root@k8snode1 ~]#

[root@k8snode1 ~]# showmount -e
Export list for k8snode1:
/mnt/v1 192.168.205.0/24
[root@k8snode1 ~]#

创建PV,注意IP及命名信息及分配大小:
[root@k8snode1 ~]# cd /mnt/
[root@k8snode1 mnt]# cat >demo-v1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /mnt/v1
server: 192.168.205.152
accessModes: ["ReadWriteMany","ReadWriteOnce","ReadOnlyMany"]
capacity:
storage: 2Gi
[root@k8snode1 mnt]# kubectl apply -f demo-v1.yaml
persistentvolume/pv001 created

查看PV信息,跟上面定义的一致即可:
[root@k8snode1 mnt]# kubectl get pv -A

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWO,ROX,RWX Retain Bound my-mysql/mysql-pvc 3m46s
[root@k8snode1 mnt]# kubectl get pvc -A
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-mysql mysql-pvc Bound pv001 2Gi RWO,ROX,RWX 85s
[root@k8snode1 mnt]#

 

【创建namespace跟创建MySQL的pod】

K3S创建命名空间:

kubectl create namespace my-mysql

cat >mysql-pod.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: archery-mysql
namespace: my-mysql
data:
my.cnf: |                   ###以下是参数配置
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
lower_case_table_names=1
default-time_zone = '+8:00'

innodb_buffer_pool_size = 512M

server-id = 100
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 1
max_binlog_size = 500M

character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

slow_query_log_file = mysql-slow.log
slow_query_log = 1
long_query_time = 1

[client]
default-character-set=utf8mb4

[mysqldump]
quick
quote-names
max_allowed_packet = 1024M


!includedir /etc/mysql/conf.d/

---

apiVersion: apps/v1
kind: Deployment         ###定义类型
metadata:
name: archery-mysql
namespace: my-mysql
labels:
app: archery-mysql
spec:
selector:
matchLabels:
app: archery-mysql
template:
metadata:
labels:
app: archery-mysql
spec:
containers:
- name: archery-mysql
image: mysql:5.7                ###定义数据库版本
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_DATABASE
value: archery      ###默认创建的数据库
- name: MYSQL_ROOT_PASSWORD
value: "123456"    ###默认的数据库密码
volumeMounts:
- mountPath: /var/lib/mysql
name: data
- mountPath: /etc/mysql/my.cnf
name: config
subPath: my.cnf
resources:          ###资源限制
requests:
memory: "512Mi"
cpu: "200m"
limits:
memory: "2048Mi"
cpu: "1000m"
volumes:   ###定义数据持久化的参数
- name: data
hostPath:
path: /mnt/v1/mysql/data       ###上面定义的nfs目录 提前创建目录 mkdir -p /mnt/v1/mysql/data
type: DirectoryOrCreate
- name: config
configMap:
name: archery-mysql

---

apiVersion: v1
kind: Service
metadata:
name: archery-mysql
namespace: my-mysql
labels:
app: archery-mysql
spec:
type: NodePort     ###设置映射端口
ports:
- port: 3306
nodePort: 32311
selector:
app: archery-mysql

 

运行yaml文件

[root@k8snode1 mysql]# kubectl apply -f mysql-pod.yaml
configmap/archery-mysql created
deployment.apps/archery-mysql created
service/archery-mysql created

查看创建的信息,这里需要等一会

[root@k8snode1 mysql]# kubectl get pods -n my-mysql 指定命名空间
NAME READY STATUS RESTARTS AGE
archery-mysql-7658488545-8wp4x 0/1 ContainerCreating 0 102s

查看容器中数据库的日志

[root@k8snode1 soft]# kubectl logs -n my-mysql --tail=100 -f archery-mysql-7658488545-8wp4x
2021-03-24 09:02:53+00:00 [Note] [Entrypoint]: Creating database archery

出现以下信息则正常,日志与正常安装MySQL排错一致:

 

 

查看最后的状态:

root@k8snode1 mysql]# kubectl get pods -n my-mysql
NAME READY STATUS RESTARTS AGE
archery-mysql-7658488545-8wp4x 1/1 Running 0 6m15s

连接数据库及查看持久化数据:

kubectl exec -it archery-mysql-7658488545-8wp4x -n my-mysql -- mysql -uroot -p123456

 

 【k3s导入rancher】

rancher安装,这里使用阿里云镜像指定版本,因为前几次创建总是创建不上,可能是网络原因

docker run -itd -p 80:80 -p 443:443 \
--restart=unless-stopped \
-e CATTLE_AGENT_IMAGE="registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.4.2" \
registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.4.2

 

rancher配置,访问IP后,然后修改密码,修改为中文,效果如下

k3s导入到rancher中

点击添加集群,然后选择导入选项

定义集群名称,然后创建

 

 

 

需要在K3S端执行最后的命令,连接到当前rancher,然后点击完成

K3S执行脚本,没有报错即可,如果有异常,多次执行:

 

 

到rancher上面查看状态

 

 查看主机:

 

 创建项目查看命名空间的容器

直接点击集群名

 

 点击添加项目,然后把对应的命名空间移动到新建的项目中

 

 

 查看对应的项目

 

 这样就可以看到命名空间的容器信息(注意我这里新建了命名空间统一管理)

命令查看:kubectl get pods -n archery

 

 查看具体容器信息进行维护

 

 【总结】

rancher时常挂掉,重启后一直报错[INFO] Waiting for k3s to start,建议做好虚拟机快照测试;

 

 

posted @ 2021-03-24 18:35  zetan·chen  阅读(2045)  评论(0编辑  收藏  举报