在Ubuntu20.04上安装minikube(Kubernetes执行环境),并部署WordPress开发环境【包含简单的Kubernetes技术介绍】
总结
本书将在Ubuntu 20.04上安装minikube(Kubernetes执行环境),并构建一个基于Kubernetes的WordPress开发环境。另外,在本书的第0章中,我们将在考虑Kubernetes的优势时与其他各种IT基础设施环境进行比较。
0. 什么是Kubernetes(如果您知道,请从下一章开始阅读)
Kubernetes的特点很简单。
-
- インフラをコード化することで全く同じ環境を再現できる。
-
- Kubernetes上にあるアプリケーションへのリソース割り当て(ネットワークやストレージなど)をコード化して管理できる。
-
- アプリケーションの起動停止が容易である。(コマンド1つで起動停止できる)
-
- 複数ノードのDocker環境を用意できるので障害に強い。(Dockerについては後述)
- ただしYAMLファイル(Kubernetesに展開するアプリケーションやネットワークなどの指示書)の書式やKubernetesのコマンドを理解する必要がある。
对不同的基础设施和Kubernetes进行比较。
在实际构建Kubernetes上的WordPress之前,本章将回顾各种IT基础设施,从『物理PC』到『云上的Kubernetes』,并考虑构建WordPress开发环境(用于创建布局之后在互联网上发布)的模式。
0-1. 物理个人电脑
在这里,我们假设您将在Windows笔记本电脑或台式电脑上直接安装WordPress开发环境,并进行下面的说明。
如果要在物理计算机上安装WordPress开发环境,您需要事先安装XAMPP(一种集成安装了Apache,MySQL和PHP的软件包),然后按照WordPress官方网站上的安装方法进行操作。
优点:
-
- 手元にPC1台あればすぐに開発環境の構築に取り掛かれます。
- 本パターンが最も参考書やQiita記事が多いので開発環境構築や構築時のトラブル解決がしやすいと思います。
缺点:
-
- PCに入れているアプリケーションとの依存性問題でWordPressのインストールや起動、想定している動作が実現できない可能性があります。
- WordPress開発環境を誤った操作で壊してしまった場合、再度環境を構築する手間が発生します。
0-2. 虚拟机
在这里我们假设在Windows 10物理电脑上安装虚拟化软件如Hyper-V或者VMware Workstation Player等。首先需要在物理电脑上设置好虚拟化软件。然后,使用虚拟化软件在Windows操作系统上安装虚拟操作系统(本例中使用免费的Ubuntu操作系统)。接下来,确认WordPress官方网站上列出的运行要求和安装步骤,并进行环境配置。
优点:
-
- 新規に真っ白な状態のOSを仮想化ソフトにインストールするので、アプリケーションの依存性問題を考えずにWordPress環境構築ができます。
- スナップショットが取得できる仮想化ソフトであれば、万が一にWordPress開発環境を壊しても元の状態に戻せます。
缺点:
-
- 物理PC(仮想化ソフトのインストール元)にOSを動かすので、物理PCの処理能力が高くないと効果が発揮されません。
- 複数のWordPress開発環境を何台も同時に稼働させる場合は仮想ソフト上にOSを複数台動かすため、物理PCに潤沢な処理能力がない限りリソース不足が発生する可能性があります。
0-3. Docker
Docker是一种容器化平台。
以下假定在此处安装Linux(Ubuntu和CentOS)的docker-ce。此外,在本模式中,出于说明的便利,将主机操作系统视为Linux(Ubuntu)。
容器是什么?
在Docker的术语中,有一个称为”容器”的词语。简单来说,容器是运行在宿主操作系统(例如Ubuntu或CentOS)的Linux内核上的虚拟环境。在虚拟化软件上,实际操作系统在运行,但容器作为一个进程来运行。下面附上了简化的WordPress和Docker的配置图。有关Docker的详细操作方法,请参考Docker官方网站。
请务必查看本书作者之前在Qiita上创建的有关使用Docker构建WordPress环境的文章。您可以使用Docker来启动WordPress容器。
优点:
-
- プロセスとしてWordPressやMySQLが起動するので、実際のOSを起動している仮想化ソフトより軽量化されます。またWordpressコンテナを複数台起動させてもリソース不足は発生しにくいです。
-
- Docker Imageと呼ばれる概念があり、アプリケーションを動かすための引数やファイルなどが入った作業イメージを保管することができます。これを配布しDockerが使用できる環境で起動することで、どの環境でも同一の動きを再現することができます。
-
- 特にチームで開発するときに利点があり、カスタマイズしたDocker Imageを1つ保存しておきチーム間で共有すればどのPCでも同じ動きが再現できます。前パターンのような各個人でそれぞれ環境を用意するよりも手間が掛からず、「このPCではWordPressが動かない」のような環境の違いによるエラーが発生しにくくなります。
-
- Docker公式や有志が作成したDocker Imageを配布しているDocker Hubからダウンロードすることができ、WordPressだけでなくnginxやtomcatなど様々な製品を試すことができます。
Docker Composeと言われるツールを利用することでITインフラをコード化することができます。これによりOSインストールからミドルウェア導入まで手動で行っていたことをDocker内で自動化することができます。
中文中的一个选项是:缺点:
-
- Dockerは基本的にコマンドラインの操作が必須となります。GUIでOSを設定していた方やコマンドラインに不慣れな方は抵抗感があると思いますが、Dockerに慣れるとすぐにWordPressだけでなくnginxやtomcatなどの様々な開発環境をすぐに用意できるので学習することをお勧めします。
- dockerコマンドと呼ばれるDockerを操作するための専用コマンドを学習することが必須となります。
0-4. 关于Kubernetes(将在本文中涉及)
我们将假设在主机操作系统(Ubuntu)上安装了Kubernetes环境搭建工具minikube,并进行以下说明。
Docker相比较的优点:
-
- コンテナオーケストレーションツール(コンテナを自動的に起動させるツール)としてのメリットがあります。Kubernetesでは基本的にマニュフェスト(YAMLファイル)と呼ばれる、アプリケーションやネットワークなどの構成を記述したテキストファイルを作成します。その後、作成したマニュフェストを実行すると自動的に記述したアプリケーションやネットワークなどがKubernetes上に構成されます。
-
- Pod(簡略化して説明するとDockerのコンテナに相当)を自己修復する機能があります。Dockerでは1度削除したコンテナは自動で復旧しませんが、Kubernetesの機能であるDeploymentを利用することでPodを削除しても自動でPodを立ち上げ直します。例えばPod内で不具合が発生して勝手にPodが落ちても、Deploymentが記述されていることマニュフェストに記述された元のPodを立ち上げ直します。
- 次章ではKubenetesの学習用途のKubernetes環境であるminikubeを利用して実際にWordPressを起動します。(minikubeは1つのノードしかないため、本番用途では後述します「クラウド上のKubernetes」を利用することをお勧めします。)
缺点:
-
- 複数ノードでKubernetesを試したい際は構築難易度やハードウェア調達の観点で後述します「クラウド上にKubenetes」環境を利用することをお勧めします。
- トラブルシューティングに関する文献(主にKubenetesのGitHubやstackoverfowは日本語よりも英語が多いです。またKubernetesは早いペースでバージョンアップされますが、バージョンアップ情報も英語がほとんどです。
0-5. 云中的虚拟机
在这种情况下,我们考虑使用云服务提供商Amazon Web Services (AWS)和Microsoft Azure提供的虚拟机(在AWS上是Amazon EC2,在Azure上是Azure Virtual Machines)来搭建WordPress开发环境。
与传统的个人电脑相比,优点:
-
- 数分で仮想マシンを用意することができるため、すぐに構築に取り掛かることができます。
-
- ハードウェアの管理は全てクラウド事業者のデータセンターに任せるので、ハードウェア障害を気にせずにWordPress開発環境構築やWordPressの学習に集中できます。
- 特にクラウド上に作成した仮想マシンにDockerをインストールすることで、ホストOS(物理PC)に負荷をかけずにWordPressや様々な製品(nginxやtomcatなど)の学習を進めることができます。
缺点:
-
- クラウド上の仮想マシンを利用すると1分ごとに課金が発生しますのでコスト管理を気にする必要があります。
-
- 例えばAzure料金計算ツールからB2S(Dockerを安定稼働できるメモリ4GBを搭載したUbuntu)を選択すると39.76ドル(約4,333円)の月額料金が発生すると表示されます。
-
- 企業でクラウドを使用する場合はサーバの電気代削減や災害対策費用削減(AWSは311発生時も東京のデータセンターが止まらなかった)などコスト面でのメリットはあります。しかし個人利用ではクラウドのインターネット上にWordPress公開やクラウドの自己学習用途として使用する場合を除き、コスト面で考えるとクラウドの仮想マシンを利用せず物理PCに仮想OSやDockerを入れた方がお得です。
- クラウドによる突発的な障害が発生することがあります。障害発生時間帯は仮想マシンが使用できなくなる可能性があります。Azureでの過去の障害履歴
给即将开始使用云端服务的人的建议。
強烈建議在使用云端服务时,先设定复杂的密码、双重认证和用户权限管理,然后再构建虚拟机。
假设忘记关闭,并持续启动上述B2S一个月,仅需要约4,333日元,但如果第三方接管了云账户,则可能面临巨额费用的索赔。作为最糟糕的情况,第三方可能会自行使用高价值的虚拟机(NC24rs V3:搭载GPU、448GB内存的虚拟机)用于加密货币挖矿,每小时收费18.5美元(约2016日元),一个月放置下来可能收费13,471美元(约1,468,188日元)。因此,请务必在构建虚拟机之前设置好安全措施。
0-6. 云端的Kubernetes
以下我将以使用由AWS提供的Kubernetes服务Amazon Elastic Kubernetes Service和由Azure提供的Kubernetes服务Azure Kubernetes Service为例进行说明。
优点(与主机操作系统上的Kubernetes相比):
-
- 複数ノードが用意されたKubernetesを利用できます。前述しましたminikubeは1つのノードしか持たず、自分で複数ノードの環境を作成しようとすると潤沢なスペックを備えた複数のホストOSを準備すること、構築難易度が高いため簡単に用意することができません。しかしクラウド上のKubernetesを利用すれば数分程度で用意することができます。
- クラウド上のKubernetesで複数ノードを用意することで自動的にリソースが開いているノードにPodを配置します。これによりminikubeのようにリソース不足になりません。また障害でノード1つ壊れても、自動的に残っているノードにPodを割り振ります。そのため個人利用ではメリットを実感できませんが、企業が利用すれば可用性の面(障害が起きても事業を継続できる)でメリットを得ることができます。
缺点:
-
- クラウド上のKubernetesも課金対象です。Azure料金計算ツールで最安プランである「B2S」で1ノードにつき月額39.71ドル(約4,327円)が発生します。
- 複数ノードを用意すると高額になります。最低限のノード数を計算してからクラウド上のKubernetesを利用することをお勧めします。
1.搭建minikube
-
- 请您参考本书作者的《在Ubuntu20.04.1 LTS上安装minikube》一文,并进行minikube的安装。
执行以下命令来确认minikube节点已创建:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 96s v1.20.2
执行以下命令来确认初始状态下没有任何Pod:
$ kubectl get pods
No resources found in default namespace.
2. MySQL 的部署(部署 MySQL 应用程序)
本章将在Kubernetes(Minikube)上部署MySQL。
-
- 执行以下命令,在vi编辑器中创建MySQL的YAML文件。
$ vi mysql.yaml
将以下YAML文件写入并保存在启动的vi编辑器中。
apiVersion: v1 # 定义要使用的Kubernetes API版本
kind: Service # 定义Pod的网络服务资源
metadata: # 指定Pod的名称和标签
labels:
app: wordpress-app
name: mysql
name: mysql-service
spec: # 在spec中描述资源的规格
selector: # 引用具有相同标签的资源
app: wordpress-app
name: mysql
type: ClusterIP # 分配仅在Kubernetes集群内可访问的虚拟IP
ports:
– name: mysql-port
port: 3306
protocol: TCP
targetPort: mysql-port
—
apiVersion: v1
kind: PersistentVolume # 定义一个持久卷(存储)的PersistentVolume
metadata:
name: pv-mysql-data
labels:
app: wordpress-app
name: mysql
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: pv-mysql
hostPath:
path: “/data/pv-mysql-file”
type: DirectoryOrCreate
—
apiVersion: v1
kind: PersistentVolumeClaim # 定义一个请求使用持久卷的PersistentVolumeClaim资源
metadata:
name: pvc-mysql
labels:
app: wordpress-app
name: mysql
spec:
accessModes:
– ReadWriteOnce
storageClassName: pv-mysql
resources:
requests:
storage: 1Gi
—
apiVersion: apps/v1
kind: Deployment # 定义具有自我修复功能的Pod的Deployment资源
metadata:
labels:
app: wordpress-app
name: mysql
name: mysql
spec:
replicas: 1 # 定义要创建的Pod数量
selector:
matchLabels:
app: wordpress-app
name: mysql
template:
metadata:
labels:
app: wordpress-app
name: mysql
spec:
containers:
– name: mysql-app
image: mysql:5.7 # 指定在MySQL的DockerHub上找到的DockerImage的名称和版本
env: # 描述在MySQL的DockerHub上找到的参数
– name: MYSQL_ROOT_PASSWORD
value: “wordpressroot2021”
– name: MYSQL_DATABASE
value: “wordpress”
– name: MYSQL_USER
value: “wordpressdb”
– name: MYSQL_PASSWORD
value: “wordpress2021”
ports:
– containerPort: 3306
name: mysql-port
protocol: TCP
volumeMounts:
– name: volume-data
mountPath: “/var/lib/mysql”
volumes:
– name: volume-data
persistentVolumeClaim:
claimName: pvc-mysql
执行以下命令,部署MySQL。
$ kubectl apply -f mysql.yaml
service/mysql-service created
persistentvolume/pv-mysql-data created
persistentvolumeclaim/pvc-mysql created
deployment.apps/mysql created
执行以下命令,确认Pod和在YAML文件中描述的资源已在Kubernetes上部署。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-6984bd6c59-2vmqx 1/1 Running 0 49s
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
mysql 1/1 1 1 57s
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 6h58m
mysql-service ClusterIP 10.105.191.82 3306/TCP 63s
$ kubectl get persistentvolume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-mysql-data 1Gi RWO Delete Bound default/pvc-mysql pv-mysql 101s
$ kubectl get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-mysql Bound pv-mysql-data 1Gi RWO pv-mysql 115s
3. WordPress的部署
本章将在Kubernetes(minikube)上部署WordPress。
4. 清理整理
在本章中,我们将对Pod进行重新启动和停止的操作。
・重新启动Pod
(YAMLファイル上でDeploymentリソースを定義したPodに対して)
$ kubectl delete pod (pod名)
例:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-6984bd6c59-2vmqx 1/1 Running 3 42d
nginx-7dfd8f6dcc-hchlp 1/1 Running 0 7s
wordpress-75588f7598-xvv9n 1/1 Running 3 42d
$
$ kubectl delete pod nginx-7dfd8f6dcc-hchlp
pod "nginx-7dfd8f6dcc-hchlp" deleted
$
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-6984bd6c59-2vmqx 1/1 Running 3 42d
nginx-7dfd8f6dcc-sfjt5 1/1 Running 0 6s (Pod名が自動的に変わる)
wordpress-75588f7598-xvv9n 1/1 Running 3 42d
$
停止Pod
(YAMLファイル上でDeploymentリソースを定義したPodに対して)
$ kubectl delete (Deployment名)
例:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mysql 1/1 1 1 42d
nginx 1/1 1 1 20d
wordpress 1/1 1 1 42d
$
$ kubectl delete deployment nginx
deployment.apps "nginx" deleted
$
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-6984bd6c59-2vmqx 1/1 Running 3 42d
nginx-7dfd8f6dcc-lm7nt 0/1 Terminating 0 5m31s
wordpress-75588f7598-xvv9n 1/1 Running 3 42d
$
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-6984bd6c59-2vmqx 1/1 Running 3 42d
wordpress-75588f7598-xvv9n 1/1 Running 3 42d (nginxのpodが再起動されない)
$
删除网络或服务
$ kubectl delete service (Service名)
例:
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42d
mysql-service ClusterIP 10.105.191.82 <none> 3306/TCP 42d
nginx-service NodePort 10.109.139.11 <none> 80:32408/TCP 20d
wordpress-external-service NodePort 10.97.224.226 <none> 80:30180/TCP 42d
$
$ kubectl delete service nginx-service
service "nginx-service" deleted
$
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42d
mysql-service ClusterIP 10.105.191.82 <none> 3306/TCP 42d
wordpress-external-service NodePort 10.97.224.226 <none> 80:30180/TCP 42d
$
删除YAML文件中的所有资源。
$ kubectl delete -f (YAMLファイル)
例:
$ kubectl apply -f nginx/nginx.yaml
service/nginx-service created
deployment.apps/nginx unchanged
$
$ kubectl get pods | grep nginx
nginx-7dfd8f6dcc-sfjt5 1/1 Running 0 9m20s
$
$ kubectl get service | grep nginx
nginx-service NodePort 10.109.144.112 <none> 80:31519/TCP 49s
$
$ kubectl delete -f nginx/nginx.yaml
service "nginx-service" deleted
deployment.apps "nginx" deleted
$
$ kubectl get pods | grep nginx
nginx-7dfd8f6dcc-sfjt5 0/1 Terminating 0 12m
$
$ kubectl get service | grep nginx
$
最后
在第0章中,我们比较了“物理计算机”与“基于云端的Kubernetes”,并思考了Kubernetes的优点。接着,在第1至第3章中,我们实际上创建了一个基于Kubernetes的WordPress开发环境。通过实际演示,我们认识到使用Kubernetes可以通过代码(YAML文件)立即部署应用程序,省去了手动安装应用程序的麻烦。作为有效的用例,例如在团队中准备各种验证环境(不仅限于WordPress,也包括nginx和tomcat等)的情况下,使用Kubernetes可以立即构建环境,减少了手动安装和依赖问题导致的故障排除时间,使开发人员能够专注于应用程序开发。