使用Kubernetes部署WordPress应用程序
总之
为了更深入地了解Kubernetes,我参与了以下Kubernetes官方教程:
https://kubernetes.io/ja/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
由于仅仅实施可能显得单调乏味,所以我们在推进过程中对理解模糊的部分进行了深入挖掘。
环境
Windows 11
农民工作台:1.8.1
准备
准备以下3个文件。
-
- mysql部署.yaml
-
- wordpress部署.yaml
- 自定义.yaml
1. MySQL部署文件.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels: #「labels」という項目は色々な場所に出てくるので注意が必要。ここではKey=app,value=wordpressというラベルをServiceに付与している。
app: wordpress
spec:
ports:
- port: 3306 #Serviceの3306ポートへのアクセスをPodの3306ポートに紐づける。
selector: #ServiceをどのPodと紐づけるかを指定するのがselector。ここではapp: wordpress/tier: mysqlラベルが付与されたPodを紐づけている。
app: wordpress
tier: mysql
clusterIP: None #"None"を指定することで、"Headless"とよばれるServiceになる。Headless Serviceではクラスタ内DNSからPodのIPを取得し、Podに負荷分散する(DNSラウンドロビン)。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce #単一ノードからRead/Writeが可能。
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels: #Deploymentに付与するラベル。
app: wordpress
spec:
selector:
matchLabels: #どのPodをDeploymentの対象とするかを指定する。今回はapp: wordpressとtier: mysqlの2つのラベルを持つPodをDeploymentの対象にしている。
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels: #Podに付与するラベル。spec.selector.matchLabelsと一致している必要がある。
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:8.0
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password #mysql-passというsecretリソースの、passwordというkeyに対応するvalueを取得する
- name: MYSQL_DATABASE
value: wordpress #ここではsecretリソースから取得せず、そのままPWをべた書きしている。
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql #マウント先
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
为什么有 PVC 的清单,但没有光伏电池?
由于在PVC清单中未指定StorageClass, 将使用默认的StorageClass。
$ kubectl get sc -A
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 81d
本地路径(local-path)是一个StorageClass。它从集群创建开始就存在。
PROVISIONER 是 rancher.io/local-path,此 Provisioner 会自动进行 PV 的规划,因此可以不需要明确创建 PV。
另外,在部署清单中没有指定副本集的数量。在这种情况下,我稍后会确认副本集数量和Pod数量。
2. 博客部署.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer #LoadBalancerでは外部疎通性のある仮想IPが払い出されますが、利用できる環境がクラウド環境などに限られるので今回はIPが払い出されません。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:6.2.1-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
3. 自定义.yaml文件
Kustomize是一个用于管理Kubernetes清单的工具。
似乎是通过名为kustomization.yaml的文件进行管理。其他名称不可用。
secretGenerator:
- name: mysql-pass
literals:
- password=<お好きなパスワードを指定>
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
创建资源 (CJ01)
在包含三个预先准备好的文件的目录中执行
$ kubectl apply -k ./
secret/mysql-pass-m9tcmtc8h7 created
service/wordpress created
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created
deployment.apps/wordpress-mysql created
我们将确认资源是否已创建。
秘密
$ kubectl get secret
NAME TYPE DATA AGE
mysql-pass-m9tcmtc8h7 Opaque 1 2m15s
聚氯乙烯
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wp-pv-claim Bound pvc-4334b6cd-9ace-4938-bbdb-064be1e95f6e 20Gi RWO local-path 5m33s
mysql-pv-claim Bound pvc-f9f14a60-603c-4d67-8f38-17abd603fc0c 20Gi RWO local-path 5m33s
光伏发电
如前所述,PV已自动创建。
需要说明的是,通过PVC创建的PV的名称以“pvc-”开头。
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-4334b6cd-9ace-4938-bbdb-064be1e95f6e 20Gi RWO Delete Bound default/wp-pv-claim local-path 5m45s
pvc-f9f14a60-603c-4d67-8f38-17abd603fc0c 20Gi RWO Delete Bound default/mysql-pv-claim local-path 5m45s
复制集
每个复制集的数量都是一个。
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
wordpress-77f4df4cbc 1 1 1 7m42s
wordpress-mysql-6745f5dc49 1 1 1 7m42s
豆荚
每个Pod数量也都变为了一个。
$ kubectl get pod
NAMESPACE NAME READY STATUS RESTARTS AGE
default wordpress-77f4df4cbc-zkh8p 1/1 Running 0 8m1s
default wordpress-mysql-6745f5dc49-m778z 1/1 Running 0 8m1s
我們將最後再確認是否能夠訪問。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 74d
wordpress LoadBalancer 10.43.129.204 <pending> 80:30652/TCP 10m
wordpress-mysql ClusterIP None <none> 3306/TCP 10m
WordPress服务的端口为80:30652。
80是负载均衡器的端口,30652是节点的端口。
由于本次负载均衡器没有分配外部IP(待定),因此需要直接访问节点。
节点的IP是172.27.28.244,所以URL为http://172.27.28.244:30652。
请转到以下选项