日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

發(fā)布時(shí)間:2023/12/10 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上一篇"通過(guò)實(shí)例快速掌握k8s(Kubernetes)核心概念"講解了k8s的核心概念,有了核心概念整個(gè)骨架就完整了,應(yīng)付無(wú)狀態(tài)程序已經(jīng)夠了,但還不夠豐滿。應(yīng)用程序分成兩種,無(wú)狀態(tài)和有狀態(tài)的。一般的前段和后端程序都是無(wú)狀態(tài)的,而數(shù)據(jù)庫(kù)是有狀態(tài)的,他需要把數(shù)據(jù)存儲(chǔ)起來(lái),這樣即使斷電,數(shù)據(jù)也不會(huì)丟失。要?jiǎng)?chuàng)建有狀態(tài)的程序,還需要引入另外一些k8s概念。它們雖然不是核心,但也很重要,共有三個(gè),持久卷,網(wǎng)絡(luò)和參數(shù)配置。掌握了這些之后,基本概念就已經(jīng)做到了全覆蓋,k8s就已經(jīng)入門(mén)了。我們通過(guò)搭建MySQL來(lái)熟悉這些k8s概念。容器本身是無(wú)狀態(tài)的,一旦出現(xiàn)問(wèn)題它會(huì)被隨時(shí)銷毀,它存儲(chǔ)的數(shù)據(jù)也就丟失了。MySQL需要一個(gè)能保存數(shù)據(jù)的持久層,在容器被銷毀之后仍然存在,k8s叫它持久卷。

創(chuàng)建和驗(yàn)證MySQL鏡像:

在k8s上安裝MySQL之前,先用Docker驗(yàn)證一下MySQL鏡像:

docker run --name test-mysql -p 3306:33060 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

“root”是根(root)用戶的password,這里是在創(chuàng)建MySQL容器時(shí)指定“root”用戶的password。“test-MySQL”是容器的名字。“mysql:5.7”用的是docker庫(kù)里的“MySQL”5.7版本。這次沒(méi)有用最新的8.0版,因?yàn)樾掳娓郧暗目蛻舳瞬患嫒?#xff0c;需要修改很多東西。所用的鏡像是全版的Linux,因而文件比較大,有400M。

容器建好了之后,鍵入“docker logs test-mysql”,查看日志。

...

2019-10-03T06:18:50.439784Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.17' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

2019-10-03T06:18:50.446543Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060

查看容器狀態(tài)。

vagrant@ubuntu-xenial:~$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

3b9c50420f5b mysql:latest "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 3306/tcp, 33060/tcp test-mysql

為了驗(yàn)證MySQL,需要在虛機(jī)上安裝MySQL客戶端。

sudo apt-get -y -f install mysql-client

完成之后,鍵入“docker inspect test-mysql”找到容器IP地址, 下面顯示"172.17.0.2"是容器IP地址。

vagrant@ubuntu-xenial:~$ docker inspect test-mysql

...

"Gateway": "172.17.0.1",

"IPAddress": "172.17.0.2",

"IPPrefixLen": 16,

"IPv6Gateway": "",

...

鍵入“mysql -h 172.17.0.2 -P 3306 --protocol=tcp -u root -p”登錄到MySQL,"172.17.0.2"是MySQL的IP地址,“3306”是MySQL端口,是在創(chuàng)建鏡像時(shí)設(shè)定的對(duì)外開(kāi)放的端口,“root”是用戶名,“-p”是password的參數(shù)選項(xiàng)。敲入命令后,系統(tǒng)要求輸入password,輸入后,顯示已成功連接到MySQL。

vagrant@ubuntu-xenial:~$ mysql -h 172.17.0.2 -P 3306 --protocol=tcp -u root -p

...

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

Your MySQL connection id is 3

Server version: 5.7.27 MySQL Community Server (GPL)

...

在k8s上安裝MySQL

在k8s上安裝MySQL分成三個(gè)部分,創(chuàng)建部署文件,創(chuàng)建服務(wù)文件和安裝測(cè)試。

部署(Deployment)文件

下面是部署配置文件。在上一篇文章中已經(jīng)詳細(xì)講解了文件格式,所有的k8s的配置文件格式都是相同的。“template”之上是部署配置,從“template”向下是Pod配置。從“containers”開(kāi)始是Pod里面的容器配置。“env:”是環(huán)境變量,這里通過(guò)環(huán)境變量來(lái)設(shè)置數(shù)據(jù)庫(kù)的用戶名和口令,后面還會(huì)詳細(xì)講解。MySQL的端口是“3306”

apiVersion: apps/v1

kind: Deployment # 類型是部署

metadata:

name: mysql-deployment # 對(duì)象的名字

spec:

selector:

matchLabels:

app: mysql #用來(lái)綁定label是“mysql”的Pod

strategy:

type: Recreate

template: # 開(kāi)始定義Pod

metadata:

labels:

app: mysql #Pod的Label,用來(lái)標(biāo)識(shí)Pod

spec:

containers: # 開(kāi)始定義Pod里面的容器

- image: mysql:5.7

name: mysql-con

imagePullPolicy: Never

env: # 定義環(huán)境變量

- name: MYSQL_ROOT_PASSWORD # 環(huán)境變量名

value: root # 環(huán)境變量值

- name: MYSQL_USER

value: dbuser

- name: MYSQL_PASSWORD

value: dbuser

args: ["--default-authentication-plugin=mysql_native_password"]

ports:

- containerPort: 3306 # mysql端口

name: mysql

服務(wù)(Service)文件

下面是服務(wù)配置文件,這個(gè)與上一篇講的配置基本相同,這里就不解釋了。

apiVersion: v1

kind: Service

metadata:

name: mysql-service

labels:

app: mysql

spec:

type: NodePort

selector:

app: mysql

ports:

- protocol : TCP

nodePort: 30306

port: 3306

targetPort: 3306

安裝測(cè)試:

有了配置文件后,下面就開(kāi)始創(chuàng)建MySQL。在創(chuàng)建時(shí)要按照順序,依次進(jìn)行,先從最底層的對(duì)象開(kāi)始創(chuàng)建。

創(chuàng)建部署和服務(wù):

kubectl apply -f mysql-deployment

kubectl apply -f mysql-service.yaml

查看服務(wù):

vagrant@ubuntu-xenial:~$ kubectl get service

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

kubernetes ClusterIP 10.96.0.1 443/TCP 3h42m

mysql-service NodePort 10.102.253.32 3306:30306/TCP 3h21m

“mysql-service”的端口(PORT(S))有兩個(gè),“3306”是k8s內(nèi)部端口,“30306”是外部端口。由于“NodePort”已經(jīng)打開(kāi)了對(duì)外端口,這時(shí)就可以在虛擬機(jī)上通過(guò)“30306”端口訪問(wèn)MySQL。

vagrant@ubuntu-xenial:~$ mysql -h localhost -P 30306 --protocol=tcp -u root -p

Enter password:

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

Your MySQL connection id is 6

Server version: 5.7.27 MySQL Community Server (GPL)

...

mysql>

這時(shí)本地虛機(jī)已經(jīng)與k8s聯(lián)通了,下一步就可以在宿主機(jī)( 筆記本)上用圖形客戶端來(lái)訪問(wèn)MySQL了。我是在Vagrant里設(shè)定了私有網(wǎng)絡(luò),設(shè)定的虛機(jī)IP地址是 "192.168.50.4”,就用這個(gè)地址和30306端口來(lái)訪問(wèn)MySQL。

網(wǎng)絡(luò):

這里的網(wǎng)絡(luò)有兩層含義,一層是k8s網(wǎng)絡(luò),就是讓k8s內(nèi)部服務(wù)之間可以互相訪問(wèn),并且從k8s集群外部可以訪問(wèn)它內(nèi)部的服務(wù)。另一層是宿主機(jī)(筆記本)和虛機(jī)之間的網(wǎng)路,就是在宿主機(jī)上可以訪問(wèn)虛機(jī)。這兩層都通了之后,就可以在宿主機(jī)直接訪問(wèn)k8s集群里面的MySQL。

k8s網(wǎng)絡(luò):

k8s的網(wǎng)絡(luò)也有兩層含義,一個(gè)是集群內(nèi)部的,k8s有內(nèi)部DNS,可以通過(guò)服務(wù)名進(jìn)行尋址。另一個(gè)是從集群外部訪問(wèn)集群內(nèi)部服務(wù),一共有四種方式,詳情請(qǐng)見(jiàn)“Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?”

LoadBalancer:Load Balancer不是由K8s來(lái)管理的。k8s通過(guò)Load Balancer把外部請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部服務(wù)。這種方法要求有Load Balancer,一般云環(huán)境里會(huì)提供,但自己的本地環(huán)境就沒(méi)有了。不過(guò)Minikube提供了一個(gè)程序可以模擬Load Balancer。你只要鍵入“minikube tunnel ”,它就會(huì)模擬Load Balancer,對(duì)請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)。只不過(guò)當(dāng)你在使用“Load Balancer”時(shí)(在Minikube環(huán)境里),每次運(yùn)行服務(wù)時(shí)產(chǎn)生的IP和端口是隨機(jī)的,不能控制,使用起來(lái)不太方便,但在正式環(huán)境里就沒(méi)有這個(gè)問(wèn)題。

下面是服務(wù)信息,“EXTERNAL-IP”是"pending",說(shuō)明外部網(wǎng)絡(luò)不通。

$ kubectl get service

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

kubernetes ClusterIP 10.96.0.1 443/TCP 31d

nginx-service LoadBalancer 10.104.228.212 80:31999/TCP 45h

下面是在運(yùn)行“minikube tunnel ”(在另一個(gè)窗口運(yùn)行)之后的服務(wù)信息,“EXTERNAL-IP”是 “10.104.228.212”。這時(shí)Minikube的LoadBalancer已經(jīng)起作用了,現(xiàn)在就可以通過(guò)IP地址從外部訪問(wèn)k8s內(nèi)部的服務(wù)了,“80”是k8s內(nèi)部端口,“31999”是k8s對(duì)外端口。

$ kubectl get service

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

kubernetes ClusterIP 10.96.0.1 443/TCP 31d

nginx-service LoadBalancer 10.104.228.212 10.104.228.212 80:31999/TCP 45h

這是一種比較好的方式,但不能控制它的IP地址和端口,因此我暫時(shí)沒(méi)有采用它。

NodePort:這種方法可以在每個(gè)Node上開(kāi)放一個(gè)對(duì)外端口,每一個(gè)指向這個(gè)端口的請(qǐng)求都被轉(zhuǎn)發(fā)給一個(gè)服務(wù)。它的好處是你可以指定一個(gè)固定的端口(端口的取值范圍只能是30000–32767),這樣我在筆記本上訪問(wèn)MySQL時(shí)就不用更換端口了。 如果你不指定,系統(tǒng)會(huì)隨機(jī)分配一個(gè)。它的缺點(diǎn)是每個(gè)端口只能有一個(gè)服務(wù),而且端口取值受限制,因此不適合生產(chǎn)環(huán)境。但在Windows環(huán)境,由于我用Vagrant固定了虛機(jī)的IP地址,這個(gè)問(wèn)題就不存在了。因此它是最好的選擇。

ClusterIP: 這個(gè)只能在k8s集群內(nèi)部尋址。

Ingress: 這是推薦的方法,一般在生產(chǎn)環(huán)境中使用。Load balancer的問(wèn)題是每一個(gè)服務(wù)都要有一個(gè)Load balancer,服務(wù)多了之后會(huì)很麻煩,這時(shí)就會(huì)用Ingress,它的缺點(diǎn)是配置起來(lái)比較復(fù)雜。Minikube自帶了一個(gè)基于Nginx的Ingress控制器,只需運(yùn)行“minikube addons enable ingress”,就行了。但I(xiàn)ngress的設(shè)置較復(fù)雜,因此這里沒(méi)有用它。

虛擬機(jī)網(wǎng)絡(luò):

這里講的是宿主機(jī)(筆記本)和虛機(jī)之間的互相訪問(wèn),主要是從宿主機(jī)訪問(wèn)虛機(jī)。我用的是Vagrant, 因此要在Vagran的配置文件(Vagrantfile)里進(jìn)行配置。它有兩種方法:

端口轉(zhuǎn)發(fā):它可以把筆記本上特定端口的請(qǐng)求轉(zhuǎn)發(fā)到虛機(jī)的指定端口,還是比較方便的。只是如果事先不知道是哪個(gè)端口,或端口是變化的,就比較麻煩。Vagrant的配置命令:“config.vm.network "forwarded_port", guest: 3306, host: 3306, auto_correct: true”

私有網(wǎng)絡(luò):這是一種很靈活的方式。可以給宿主機(jī)和虛機(jī)各自設(shè)定一個(gè)固定的IP地址,這樣可以雙向互訪。任何端口都沒(méi)有問(wèn)題,唯一的缺點(diǎn)就是你要事先確定IP地址。詳情請(qǐng)參見(jiàn)“Vagrant reverse port forwarding?”。Vagrant的配置命令:“config.vm.network "private_network", ip: "192.168.50.4”

當(dāng)配置私有網(wǎng)絡(luò)時(shí),需要在筆記本的VirtualBox上配置“Host-only Adapter”,如下圖所示。

但這會(huì)造成在Vagrant啟動(dòng)Minikube時(shí)產(chǎn)生如下錯(cuò)誤:“VBoxManage.exe: error: Failed to create the host-only adapter”。這是VirtualBox的一個(gè)Bug,你可以下載一個(gè)軟件解決,詳見(jiàn)這里. 這個(gè)軟件已經(jīng)是四年之前的了,開(kāi)始還擔(dān)心是否與現(xiàn)在的VirtualBox版本兼容,結(jié)果很好用,而且它是一個(gè)單獨(dú)運(yùn)行的軟件,不會(huì)與現(xiàn)在的軟件沖突。只要在啟動(dòng)虛機(jī)之前,用管理員身份運(yùn)行這個(gè)補(bǔ)丁就行了。另外一個(gè)問(wèn)題是,我原來(lái)使用的是5.x版的VirtualBox,上圖中只能選“NAT”,不能選“Host-only Adapter”,升級(jí)到6.X之后才能選“Host-only Adapter”。但當(dāng)虛機(jī)重新啟動(dòng)之后,它會(huì)自動(dòng)變回“NAT”,不過(guò)私有網(wǎng)絡(luò)還是可用。

創(chuàng)建持久卷(PersistentVolume):

k8s卷的概念包括卷和持久卷。

卷(volume):

卷是k8s的存儲(chǔ)概念,它依附于Pod,不能單獨(dú)存在。但它不是在容器層。因此如果容器被重新啟動(dòng),卷仍然在。但如果Pod重新啟動(dòng),卷就丟失了。如果一個(gè)Pod里有多個(gè)容器,那么這些容器共享Pod的卷。你可以把卷看成是一個(gè)目錄,里面可以存儲(chǔ)各種文件。k8s支持各種類型的卷,例如本地文件系統(tǒng)和各種云存儲(chǔ)。

持久卷(PersistentVolume):

是對(duì)卷的一個(gè)封裝,目的是為了更好地管理卷。它的生命周期不需要與Pod綁定,它可以獨(dú)立于Pod存在。

持久卷申請(qǐng)(PersistentVolumeClaim):

是對(duì)持久卷資源的一個(gè)申請(qǐng),你可以申請(qǐng)?zhí)囟ǖ拇鎯?chǔ)容量的大小和訪問(wèn)模式,例如讀寫(xiě)模式或只讀模式。k8s會(huì)根據(jù)持久卷申請(qǐng)分配適合的持久卷,如果沒(méi)有合適的,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)。持久卷申請(qǐng)是對(duì)持久卷的一個(gè)抽象,就像編程里的接口(Interface),它可以有不同的具體實(shí)現(xiàn)(持久卷)。例如,阿里云和華為云支持的存儲(chǔ)系統(tǒng)不同,它生成的持久卷也不相同。持久卷是與特定的存儲(chǔ)實(shí)現(xiàn)綁定的。那你要把程序從阿里云移植到華為云,怎么保證配置文件的兼容性呢?你就用持久卷申請(qǐng)來(lái)做這個(gè)接口,它只規(guī)定存儲(chǔ)容量大小和訪問(wèn)模式,而由阿里云和華為云自動(dòng)生成各自云里滿足這個(gè)接口需求的持久卷. 不過(guò),它還有一個(gè)限制條件,那就是持久卷申請(qǐng)和持久卷的StorageClass需要匹配,這使它沒(méi)有接口靈活。后面會(huì)詳細(xì)講解。

動(dòng)態(tài)持久卷:

在這種情況下,你只需創(chuàng)建持久卷申請(qǐng)(不需要單獨(dú)創(chuàng)建持久卷),然后把持久卷申請(qǐng)與部署綁定。系統(tǒng)會(huì)按照持久卷申請(qǐng)自動(dòng)創(chuàng)建持久卷。下面是持久卷申請(qǐng)配置文件。其中“storage:1Gi”,是指申請(qǐng)的空間大小是1G。

持久卷申請(qǐng)配置文件:

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-pv-claim

labels:

app: mysql

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 1Gi #持久卷的容量是 1 GB

```

**掛載持久卷申請(qǐng)的部署:**

下面是掛載了持久卷申請(qǐng)的部署配置文件。它通過(guò)把持久卷申請(qǐng)當(dāng)做持久卷來(lái)使用,與Pod進(jìn)行綁定。請(qǐng)閱讀文件里有關(guān)持久卷的注釋。

```shell

apiVersion: apps/v1

kind: Deployment

metadata:

name: mysql-deployment

spec:

selector:

matchLabels:

app: mysql

strategy:

type: Recreate

template:

metadata:

labels:

app: mysql

spec:

containers:

- image: mysql:5.7

name: mysql-con

imagePullPolicy: Never

env:

- name: MYSQL_ROOT_PASSWORD

value: root

- name: MYSQL_USER

value: dbuser

- name: MYSQL_PASSWORD

value: dbuser

args: ["--default-authentication-plugin=mysql_native_password"]

ports:

- containerPort: 3306

name: mysql

volumeMounts: # 掛載Pod上的卷到容器

- name: mysql-persistent-storage # Pod上卷的名字,與“volumes”名字匹配

mountPath: /var/lib/mysql # 掛載的Pod的目錄

volumes: # 掛載持久卷到Pod

- name: mysql-persistent-storage # 持久卷名字, 與“volumMounts”名字匹配

persistentVolumeClaim:

claimName: mysql-pv-claim # 持久卷申請(qǐng)名字

這里只指定了Pod的掛載目錄,并沒(méi)有指定虛擬機(jī)(宿主機(jī))的目錄,后面會(huì)講到如何找到虛擬機(jī)的目錄(系統(tǒng)自動(dòng)分配掛載目錄)。

運(yùn)行部署:

鍵入“kubectl apply -f mysql-volume.yaml”創(chuàng)建持久卷申請(qǐng),在創(chuàng)建它的同時(shí),系統(tǒng)自動(dòng)創(chuàng)建持久卷。

查看持久卷申請(qǐng)

vagrant@ubuntu-xenial:~/dockerimages/kubernetes/mysql$ kubectl get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

mysql-pv-claim Bound pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa 1Gi RWO standard 10m

查看持久卷申請(qǐng)?jiān)敿?xì)信息

vagrant@ubuntu-xenial:/mnt$ kubectl describe pvc mysql-pv-claim

Name: mysql-pv-claim

Namespace: default

StorageClass: standard

Status: Bound

Volume: pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa

Labels: app=mysql

...

顯示持久卷:

vagrant@ubuntu-xenial:/mnt$ kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa 1Gi RWO Delete Bound default/mysql-pv-claim standard 24h

鍵入“kubectl describe pv pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa”, 顯示持久卷詳細(xì)信息。從這里可以看出,虛擬機(jī)上的持久卷在如下位置:“Path: /tmp/hostpath-provisioner/pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa”。

vagrant@ubuntu-xenial:/mnt$ kubectl describe pv pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa

Name: pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa

Labels:

Annotations: hostPathProvisionerIdentity: 19948fdf-e67f-11e9-8fbd-026a5b40726f

pv.kubernetes.io/provisioned-by: k8s.io/minikube-hostpath

Finalizers: [kubernetes.io/pv-protection]

StorageClass: standard

Status: Bound

Claim: default/mysql-pv-claim

Reclaim Policy: Delete

Access Modes: RWO

VolumeMode: Filesystem

Capacity: 1Gi

Node Affinity:

Message:

Source:

Type: HostPath (bare host directory volume)

Path: /tmp/hostpath-provisioner/pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa

HostPathType:

Events:

查看MySQL目錄信息:

vagrant@ubuntu-xenial:/tmp/hostpath-provisioner/pvc-ac6c88d5-ef5a-4a5c-b499-59715a2d60fa$ ls -al

total 188488

drwxrwxrwx 6 999 docker 4096 Oct 4 13:23 .

drwxr-xr-x 3 root root 4096 Oct 4 12:58 ..

-rw-r----- 1 999 docker 56 Oct 4 12:58 auto.cnf

-rw------- 1 999 docker 1679 Oct 4 12:59 ca-key.pem

-rw-r--r-- 1 999 docker 1107 Oct 4 12:59 ca.pem

-rw-r--r-- 1 999 docker 1107 Oct 4 12:59 client-cert.pem

-rw------- 1 999 docker 1679 Oct 4 12:59 client-key.pem

-rw-r----- 1 999 docker 668 Oct 4 13:21 ib_buffer_pool

-rw-r----- 1 999 docker 79691776 Oct 4 13:23 ibdata1

-rw-r----- 1 999 docker 50331648 Oct 4 13:23 ib_logfile0

-rw-r----- 1 999 docker 50331648 Oct 4 12:58 ib_logfile1

-rw-r----- 1 999 docker 12582912 Oct 4 13:24 ibtmp1

drwxr-x--- 2 999 docker 4096 Oct 4 12:58 mysql

drwxr-x--- 2 999 docker 4096 Oct 4 12:58 performance_schema

-rw------- 1 999 docker 1679 Oct 4 12:59 private_key.pem

-rw-r--r-- 1 999 docker 451 Oct 4 12:59 public_key.pem

-rw-r--r-- 1 999 docker 1107 Oct 4 12:59 server-cert.pem

-rw------- 1 999 docker 1675 Oct 4 12:59 server-key.pem

drwxr-x--- 2 999 docker 4096 Oct 4 13:18 service_config

drwxr-x--- 2 999 docker 12288 Oct 4 12:58 sys

持久卷的回收模式:

當(dāng)持久卷和持久卷申請(qǐng)被刪除后,它有三種回收模式。

保持(Retain):當(dāng)持久卷申請(qǐng)被刪除后,持久卷仍在。你可以手動(dòng)回收持久卷里的數(shù)據(jù)。

** 刪除(Delete)**:持久卷申請(qǐng)和持久卷都被刪除,底層存儲(chǔ)的數(shù)據(jù)也會(huì)被刪除。當(dāng)使用動(dòng)態(tài)持久卷時(shí),缺省的模式是Delete。當(dāng)然,你可以在持久卷被創(chuàng)建之后修改它的回收模式。

** 回收(Recycle)**:這種方式已經(jīng)不推薦使用了,建議用Retain代替。

靜態(tài)持久卷:

動(dòng)態(tài)持久卷的一個(gè)問(wèn)題是它的缺省回收模式是“刪除”,這樣當(dāng)虛機(jī)重新啟動(dòng)后,持久卷會(huì)被刪除。當(dāng)你重新運(yùn)行部署時(shí),k8s會(huì)創(chuàng)建一個(gè)新的MySQL,這樣原來(lái)MySQL里的新建信息就會(huì)丟失,這是我們不愿意看到的。雖然你可以手動(dòng)修改回收方式為“保持”,但還是要手動(dòng)回收原來(lái)持久卷里的數(shù)據(jù)。

一個(gè)解決辦法是把持久卷建在宿主機(jī)上,這樣即使虛機(jī)出了問(wèn)題被重新啟動(dòng),MySQL里的新建信息依然不會(huì)丟失。如果是在云上,就會(huì)有專門(mén)的的存儲(chǔ)層,如果是本地,大致有三種方式:

Local:把存儲(chǔ)從宿主機(jī)掛載到k8s集群上. 詳情請(qǐng)參見(jiàn):"Volumes".

HostPath:也是把存儲(chǔ)從宿主機(jī)掛載到k8s集群上,但它有許多限制,例如只支持單節(jié)點(diǎn)(Node),而且只支持“ReadWriteOnce”模式。詳情請(qǐng)參見(jiàn): "hostPath as volume in kubernetes".

NFS:網(wǎng)絡(luò)文件系統(tǒng),這種是最靈活的,但需要安裝NFS服務(wù)器。詳情請(qǐng)參見(jiàn):"Kubernetes Volumes Guide".

我選擇了比較簡(jiǎn)單的“Local”方式。在這種方式下,必須單獨(dú)創(chuàng)建持久卷,不能 只創(chuàng)建持久卷申請(qǐng)而讓系統(tǒng)自動(dòng)創(chuàng)建持久卷。

下面是使用“Local”方式的配置文件,它把持久卷和持久卷申請(qǐng)寫(xiě)在了一個(gè)文件里。當(dāng)用“Local”方式時(shí),需要設(shè)置“nodeAffinity”部分,其中“values:- minikube” 的“Minikube”是k8s集群Node的名字,“Minikube”只支持一個(gè)Node,既是“Master Node”,又是“Worker Node”。

持久卷和申請(qǐng)的配置文件:

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-pv

spec:

capacity:

storage: 1Gi

volumeMode: Filesystem

accessModes:

- ReadWriteOnce

storageClassName: standard #持久卷存儲(chǔ)類型,它需要與持久卷申請(qǐng)的類型相匹配

local:

path: /home/vagrant/database/mysql #宿主機(jī)的目錄

nodeAffinity:

required:

nodeSelectorTerms:

- matchExpressions:

- key: kubernetes.io/hostname

operator: In

values:

- minikube # Node的名字

---

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-pv-claim

labels:

app: mysql

spec:

accessModes:

- ReadWriteOnce

# storageClassName: # 這里的存儲(chǔ)類型注釋掉了

resources:

requests:

storage: 1Gi #1 GB

如果不知道Node名字,可用如下命令查看:

vagrant@ubuntu-xenial:/$ kubectl get node

NAME STATUS ROLES AGE VERSION

minikube Ready master 6d3h v1.15.2

改用靜態(tài)持久卷之后,只有持久卷配置文件發(fā)生了變化,部署和服務(wù)的配置文件沒(méi)有變。重新運(yùn)行持久卷和部署,成功之后,即使重啟虛擬機(jī),MySQL里面的新建內(nèi)容也沒(méi)有丟失。

注意這里storageClassName的用法。k8s規(guī)定持久卷和持久卷申請(qǐng)的storageClassName必須匹配,這時(shí)才會(huì)把持久卷分配給持久卷申請(qǐng)。我們這里的持久卷申請(qǐng)沒(méi)有指定storageClassName,這時(shí)系統(tǒng)會(huì)使用缺省的storageClass。

查看是否安裝了缺省的storageClass

vagrant@ubuntu-xenial:/$ kubectl get sc

NAME PROVISIONER AGE

standard (default) k8s.io/minikube-hostpath 6d3h

vagrant@ubuntu-xenial:/$

查看缺省的storageClass詳細(xì)信息

vagrant@ubuntu-xenial:/$ kubectl describe sc

Name: standard

IsDefaultClass: Yes

Annotations: storageclass.kubernetes.io/is-default-class=true

Provisioner: k8s.io/minikube-hostpath

Parameters:

AllowVolumeExpansion:

MountOptions:

ReclaimPolicy: Delete

VolumeBindingMode: Immediate

Events:

從這里可以看出,Minikube安裝了缺省的storageClass,它的名字是“standard”。上面的持久卷申請(qǐng)里沒(méi)有指定storageClass,因此系統(tǒng)使用缺省的storageClass與之匹配,而上面的持久卷的storageClassName是“standard”,正好能配上。詳情請(qǐng)見(jiàn)“Dynamic Provisioning and Storage Classes in Kubernetes”

踩過(guò)的坑:

使用Hyper-V還是VirtualBox

Hyper-V和VirtualBox是不兼容的,只能選一個(gè)(當(dāng)然你可以在這兩者之間切換,但太麻煩了)。我在Windows上裝了VirtualBox,運(yùn)行正常。進(jìn)入Vagrant之后,安裝了“ubuntu”版的Linux。這時(shí),當(dāng)你啟動(dòng)Minikube時(shí),可以鍵入“minikube start --vm-driver=virtualbox”,但系統(tǒng)顯示“This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory”。我按照網(wǎng)上的建議去修改BIOS的“VT-X/AMD-v”,但我的BIOS就沒(méi)有這個(gè)選項(xiàng)。其他的方法也都試過(guò)了,沒(méi)有一個(gè)成功的。但因?yàn)橐呀?jīng)裝了VirtualBox,就不能用Hyper-V了。就只能用另外一個(gè)方法,使用命令“minikube start --vm-driver=none”。幸好這個(gè)方法工作得很好。

當(dāng)用“minikube start --vm-driver=virtualbox”時(shí),你是先建了虛擬機(jī),再在虛擬機(jī)上運(yùn)行Minikube。當(dāng)用“minikube start --vm-driver=none”時(shí),是直接在宿主機(jī)上運(yùn)行Minikube。但由于我的Windows版本不能直接支持k8s,我已經(jīng)在Windows上裝了Linux虛機(jī),并用Vagrant進(jìn)行管理。如果用“minikube start --vm-driver=virtualbox”,就是在Linux虛機(jī)上又裝了一個(gè)虛機(jī)。現(xiàn)在用“minikube start --vm-driver=none”,表面上看是在宿主機(jī)上運(yùn)行,實(shí)際上已經(jīng)運(yùn)行在Windows的Linux虛機(jī)上了。

登錄k8s集群

當(dāng)用“minikube start --vm-driver=none”啟動(dòng)Minikube時(shí),不能用“minikube ssh”登錄k8s集群,因?yàn)檫@時(shí)已經(jīng)沒(méi)有虛機(jī)了,是直接安裝在宿主機(jī)上,因此不需要“minikube ssh”。但你可以登錄到Pod上,可用如下命令:" kubectl exec -ti mysql-deployment-56c9cf5857-fffth -- /bin/bash"。其中“mysql-deployment-56c9cf5857-fffth”是Pod名字。

創(chuàng)建重名PV或PVC

當(dāng)原來(lái)的PV或PVC還在,而你又創(chuàng)建了一個(gè)新的PV, 并與原來(lái)的重名,則會(huì)得到如下錯(cuò)誤:The persistentvolumeclaim "mysql-pv-claim" is invalid: spec: forbidden: is immutable after creation except resources.requests for bound claims. 這時(shí),你需要將原來(lái)的PV或PVC刪掉,再重新創(chuàng)建新的。

索引:

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!

總結(jié)

以上是生活随笔為你收集整理的mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。