掛載MySQL數據卷
在k8s集群中掛載MySQL數據卷 需要安裝一個NFS。
在主節點安裝NFS
yum install -y nfs-utils rpcbind
在主節點創建目錄
mkdir -p /nfs
chmod 777 /nfs
更改歸屬組與用戶
chown -R nfsnobody:nfsnobody /nfs
配置共享目錄
echo "/nfs *(insecure,rw,sync,no_root_squash)" > /etc/exports
創建mysql共享目錄
mkdir -p /nfs/mysql
啟動服務
systemctl start rpcbind
systemctl start nfs
設置開啟啟動
systemctl enable rpcbind
systemctl enable nfs
創建MySQL Deployment
編寫一個 mysql.yaml 配置文件:
apiVersion: apps/v1 # apiserver的版本
kind: Deployment # 副本控制器deployment,管理pod和RS
metadata:
name: mysql # deployment的名稱,全局唯一
namespace: default # deployment所在的命名空間
labels:
app: mysql
spec:
replicas: 1 # Pod副本期待數量
selector:
matchLabels: # 定義RS的標簽
app: mysql # 符合目標的Pod擁有此標簽
strategy: # 定義升級的策略
type: RollingUpdate # 滾動升級,逐步替換的策略
template: # 根據此模板創建Pod的副本(實例)
metadata:
labels:
app: mysql # Pod副本的標簽,對應RS的Selector
spec:
nodeName: k8s-worker01 # 指定pod運行在的node
containers: # Pod里容器的定義部分
- name: mysql # 容器的名稱
image: mysql:5.7 # 容器對應的docker鏡像
volumeMounts: # 容器內掛載點的定義部分
- name: time-zone # 容器內掛載點名稱
mountPath: /etc/localtime # 容器內掛載點路徑,可以是文件或目錄
- name: mysql-data
mountPath: /var/lib/mysql # 容器內mysql的數據目錄
- name: mysql-logs
mountPath: /var/log/mysql # 容器內mysql的日志目錄
ports:
- containerPort: 3306 # 容器暴露的端口號
env: # 寫入到容器內的環境容量
- name: MYSQL_ROOT_PASSWORD # 定義了一個mysql的root密碼的變量
value: "root"
volumes: # 本地需要掛載到容器里的數據卷定義部分
- name: time-zone # 數據卷名稱,需要與容器內掛載點名稱一致
hostPath:
path: /etc/localtime # 掛載到容器里的路徑,將localtime文件掛載到容器里,可讓容器使用本地的時區
- name: mysql-data
hostPath:
path: /data/mysql/data # 本地存放mysql數據的目錄
- name: mysql-logs
hostPath:
path: /data/mysql/logs # 本地存入mysql日志的目錄
將 mysql.yaml 配置文件上傳至虛擬機的 /root 目錄下,在 /root 目錄下執行命令:
kubectl create -f mysql.yaml
執行添加服務的命令(這行不執行應該也不影響結果):
kubectl apply -f mysql.yaml
編寫一個提供對外訪問的service mysql-svc.yaml:
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 30001
selector:
app: mysql
將 mysql-svc.yaml 配置文件上傳至虛擬機的 /root 目錄下,在 /root 目錄下執行命令:
kubectl create -f mysql-svc.yaml
訪問數據庫並驗證其運行正常
kubectl get pod
kubectl exec -it mysql-999dcb98f-srxff -- mysql -u root -p
(密碼也是root)
mysql開放遠程連接:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
flush privileges; #刷新權限表,使配置生效
開啟防火牆端口
systemctl start firewalld.service
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=30001/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
systemctl stop firewalld.service
systemctl disable firewalld.service
要開放6443端口(k8s集群連接地址)和30001端口(k8s集群mysql端口)
查看已安裝的mysql
kubectl get pod
kubectl get svc
mysql服務安裝在default命名空間中,查看其所在節點:
kubectl get pod -n default -o wide
此次部署的mysql服務被我們指定運行在了 k8s-worker01 節點上。
在本地用SQLyog連接到k8s集群的mysql:
創建一個名為 test 的數據庫:
將本地數據導入搭建好的mysql服務器-test數據庫:
可以看到,數據已成功導入。
在k8s集群中查看mysql數據庫:
可看到中文數據出現亂碼問題。
查看數據庫的字符編碼類型:
show variables like '%char%';
將查詢結果集設置為utf8后再查看數據:
set character_set_results=utf8;
已經可以正常顯示中文了。
總結
到這里,我們就成功地在k8s集群上部署了一個mysql、公布該mysql使其可以在外部進行訪問、向mysql數據庫中導入數據並設置其查詢結果集支持中文顯示,整個搭建過程還是有點繁瑣的,如果不熟悉k8s集群一些概念,可能會遇到挺多小問題。
這里分享我自己的搭建過程,希望其他人在學習過程中能從我的筆記中得到一些幫助!
