Kubernetes本地环境搭建
目录
(1) 概要
(2) 准备・前提条件
(3) 构建步骤
– (3-1) 文件夹结构
– (3-2) DockerDesktop 设置
– (3-3) Docker 本地环境设置
– (3-4) 使用的 Kubernetes 要素四个
– (3-5) 启动 DB Pod
– (3-6) 启动 API Pod
– (3-7) 启动 FRONT Pod
– (3-8) 浏览器操作确认
(1) 简介
本文将使用DockerDesktop,并创建以下技术配置的”本地Kubernetes环境”。
- Go
- MySQL
- TypeScript
- React
ローカル環境でもKubernetesを使用し、「本番環境」や「検証環境」でもKubernetesを使用している場合に、環境間の差異を無くすことができます。環境間の差異により、ローカルではうまくいっていても本番環境でポッドが起動しない等のエラーを未然に防ぎましょう!
Kubernetes初学者にとっても無料でKubernetesをいじれるのでおすすめです!
準備和前提條件
【所需准备的物品】
-
- VSCode等のエディタ
-
- DockerDesktop
- asdf等のバージョン管理パッケージ
【先决条件】
-
- 既にDockerのローカル開発環境があることを前提といたします。
- バックエンド、フロントエンドは無理に合わせる必要はありません。
(3) 建立的步驟
【文件夹结构3-1】
以下のようなフォルダ構成で、「api」「front」「db」それぞれのpodを立てる構成で構築します。
sample_app/
- api/
- Dockerfile
- local-k8s.yaml
- その他アプリファイル..
- front/
- Dockerfile
- local-k8s.yaml
- その他アプリファイル..
- test/
- db/
- Dockerfile
- local-k8s.yaml
- docker-compose.yml
【3-2 Docker桌面版设置】
我要配置DockerDesktop中的Kubernetes。
【3-3 Dockerローカル環境設定】
Docker环境设置几乎无关紧要,但是如果进行一些设置,它将对Kubernetes的本地环境建立有所帮助,因此我们会进行设置。
docker-compose.ymlの各サービスに「コンテナ名」「イメージ名」を指定します。Kubernetes設定でDockerの「コンテナ名」と「イメージ名」を指定するためです。
version: ‘3.8’
services:
front:
image: sample-app-front:latest
container_name: sample-app-front
その他設定….
api:
image: sample-app-api:latest
container_name: sample-app-api
その他設定….
db:
image: sample-app-db:latest
container_name: sample-app-db
その他設定….
【这次使用的四个Kubernetes要素】
我会解释四个组成「Pod启动」所需的Kubernetes要素。如果您对Kubernetes的基础有了解,请略过此部分,因为与构建无关!
【3-4-1 保密】
【概要】
- 機密データを保存し、ポッドに渡す
【文章中的用途】
- パスワード等を環境変数として、ポッドに渡すことができるので、DBの接続情報を渡します
【优点】
- 機密データを安全にポッドに渡すことができる
【3-4-2持续化卷索取(PVC)】
【摘要】
- データストレージ(PV)へ要求を行う
在这篇文章中的应用场景
- データストレージの作成
【メリット】
-
- サイズ、アクセスモードを指定してストレージを作成できる
-
- データベースのデータをポッドが終了しても永続化できる
- DB以外のポッドでも使用できる
【用語】
※ Persistent Volume (PV)は、Kubernetesクラスター内のストレージのこと、Persistent VolumeClaim(PVC)はPVへの要求
【 3-4-3 Deployment】
【简述】
ポッドの管理方法の指定
※ Kubernetesのメインの設定はほぼここで設定します。
【本文章中的使用场合】
-
- 指定したポッドの設定をKubernetesクラスター内にデプロイする
-
- 維持するポッド(レプリカ)の数の指定
- ポッド作成に使うDockerイメージ、コンテナの指定、設定
【优点】
ポッドが停止する等の異常が起こった際も、指定したポッド数を維持するため自動で新しいポッドの作成を行ってくれる
アクセスを複数のポッドに分散できる
※ DockerデスクトップのKubernetesではこの分散機能は提供していません。 EKS等の本番環境用のKubernetesではこの恩恵を受けることができます。
deploymentの設定をあとから変えることで、ポッドの増減を容易に操作できる
【术语】
※ 副本是指根据指定的Pod配置复制出来的Pod。通过deployment创建的复制集的指令类似于副本集。
【3-4-5 Service】
【摘要】
- ポッド間、外部からのアクセスを設定します
【本文中的用途】
- 「NodePort」を設定して、外部からアクセスできる設定をします。
【优点】
- ポッド毎に柔軟なアクセス制限が可能になる
【3至5个数据库Pod启动】
使用Kubernetes创建db Pod。在Kubernetes中,通过在yaml文件中记录配置并将其部署到Kubernetes上来进行创建。
yaml文件将被写入到文件夹结构的「test/db/local-k8s.yaml」中。
- test/
- db/
- Dockerfile
- local-k8s.yaml
- docker-compose.yml
创建DB的Pod所需的元素有以下四个。
-
- Secret
-
- Persistent VolumeClaim(PVC)
-
- Deployment
- Service
最终完成的代码如下。
# 認証情報の設定
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
MYSQL_ROOT_PASSWORD: 「Base64でエンコードしたルートパスワード」
MYSQL_DATABASE: 「Base64でエンコードしたデータベース名」
MYSQL_USER: 「Base64でエンコードしたユーザー名」
MYSQL_PASSWORD: 「Base64でエンコードしたユーザーパスワード」
---
# ストレージの設定
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
# deploymentの設定
apiVersion: apps/v1
kind: Deployment
metadata:
name: db
spec:
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: sample-app-db
image: sample-app-db:latest
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_DATABASE
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_PASSWORD
ports:
- containerPort: 3306
volumeMounts:
- name: db-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: db-persistent-storage
persistentVolumeClaim:
claimName: db-pvc
---
# serviceの設定
apiVersion: v1
kind: Service
metadata:
name: db
spec:
selector:
app: db
ports:
- protocol: TCP
port: 3306
targetPort: 3306
nodePort: 31306
type: NodePort
【3-5-1 秘密】
- 以下がSecret完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
## KubernetesAPIのバージョンの指定
apiVersion: v1
## 作成するリソースをSecretにする
kind: Secret
## Secretの名前を指定
metadata:
name: db-secret
## Secretのタイプを「Opaque」に指定します
## Opaqueは任意のキーと値のペアで機密情報を格納できる
type: Opaque
## DB接続に必要な情報を設定します
## 接続情報は何のルールでもいいので、Base64にエンコードした値を記述するようにしましょう
data:
MYSQL_ROOT_PASSWORD: 「Base64でエンコードしたルートパスワード」
MYSQL_DATABASE: 「Base64でエンコードしたデータベース名」
MYSQL_USER: 「Base64でエンコードしたユーザー名」
MYSQL_PASSWORD: 「Base64でエンコードしたユーザーパスワード」
【3-5-2 持久化存储卷声明(PVC)】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
.... 前の項目のコード
## 「---」を記述することは1つのyamlファイルで複数リソースを記述できます。
---
apiVersion: v1
## 作成するリソースをPersistentVolumeClaimにする
kind: PersistentVolumeClaim
## PersistentVolumeClaimの名前を指定
metadata:
name: db-pvc
## ストレージボリュームへアクセス設定
## 一度に一つのノードからのみアクセスできるよう設定
spec:
accessModes:
- ReadWriteOnce
## PVの最小ストレージ容量を1ギガバイトに指定
resources:
requests:
storage: 1Gi
【3-5-3 阵型部署】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
.... 前の項目のコード
---
apiVersion: apps/v1
## 作成するリソースをDeploymentにする
kind: Deployment
## Deploymentの名前を指定
metadata:
name: db
spec:
## 実行するポッドのレプリカ数を1つに設定
replicas: 1
## ポッドのラベル名を指定
selector:
matchLabels:
app: db
## ポッド作成のためのテンプレートを定義
## metadata.labelsに「app: db」を設定し、selectorと一致させる
template:
metadata:
labels:
app: db
spec:
containers:
## コンテナ名を指定
- name: sample-app-db
## コンテナに使用するイメージを指定
image: sample-app-db:latest
## ローカルのイメージを優先的に取得し、ない場合にイメージをプルする設定
imagePullPolicy: IfNotPresent
## Secretsで設定した値を環境変数として設定
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_DATABASE
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: MYSQL_PASSWORD
## ポートを3306で指定
ports:
- containerPort: 3306
## コンテナ内でマウントされるボリュームを指定
volumeMounts:
- name: db-persistent-storage
mountPath: /var/lib/mysql
## Pod内で使用されるボリュームを指定
## 作成したPVCをclaimNameに指定する
volumes:
- name: db-persistent-storage
persistentVolumeClaim:
claimName: db-pvc
【3-5-4服务】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
apiVersion: v1
## 作成するリソースをServiceにする
kind: Service
## Serviceの名前をdbに指定
metadata:
name: db
## Serviceがリクエストを転送する対象とするポッド名を指定
spec:
selector:
app: db
ports:
- protocol: TCP
## クラスタ内部からServiceにアクセスするためのポート
port: 3306
## Serviceがリクエストを転送するポッドのポート番号
targetPort: 3306
## クラスター外部からServiceにアクセスするためのノードのポートを指定
nodePort: 31306
type: NodePort
【3-5-5 胶囊启动】
- ポッド起動に必要な「kubectlコマンド」がインストール済みか以下のコマンドで確認します。
如果输出了命令的说明,则表示已安装。
$ kubectl
インストールがされていない場合は、brewや、asdfでkubectlをインストールしましょう。
以下はasdfの例です。
$ asdf plugin add kubectl
## インストールできるバージョンを出力
$ asdf list all kubectl
## kubectlをインストール
$ asdf install kubectl 1.28.3
## インストールしたバージョンを一覧表示
$ asdf list kubectl
## グローバルでの使用するkubectlバージョンを宣言
$ asdf global kubectl 1.28.3
## ローカルでの使用するkubectlバージョンを宣言
$ asdf local kubectl 1.28.3
$ kubectl
yamlファイルのあるフォルダまで移動する
$ cd test/db
yamlファイルの内容をデプロイします。
$ kubectl apply -f local-k8s.yaml
【3-5-6 确认创建五个元素】
【启动3-6个API Pod】
下一步是创建API Pod。
将yaml文件的内容写在位于api文件夹下的”local-k8s.yaml”中。
sample_app/
- api/
- Dockerfile
- local-k8s.yaml
- その他アプリファイル..
用于创建API pod的要素有以下两个。
-
- Deployment
- Service
最终的完成代码如下所示。
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
ports:
- nodePort: 31000
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: api
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 1
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- image: sample-app-api:latest
imagePullPolicy: IfNotPresent
name: sample-app-api
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /api
name: api-volume
volumes:
- hostPath:
path: /Users/自身のPCのユーザー名/sample-app/api
name: api-volume
【3-6-1 服务】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
apiVersion: v1
## 作成するリソースをServiceにする
kind: Service
## Serviceの名前をapi-serviceに指定
metadata:
name: api-service
spec:
ports:
## クラスター外部からServiceにアクセスするためのノードのポートを指定
- nodePort: 31000
## クラスタ内部からServiceにアクセスするためのポート
port: 8080
protocol: TCP
## Serviceがリクエストを転送するポッドのポート番号
targetPort: 8080
## Serviceがリクエストを転送する対象とするポッド名を指定
selector:
app: api
type: NodePort
【3-6-2 部署】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
.... 前の項目のコード
---
apiVersion: apps/v1
## 作成するリソースをDeploymentにする
kind: Deployment
## Deploymentの名前を指定
metadata:
name: api
spec:
## 実行するポッドのレプリカ数を1つに設定
replicas: 1
## ポッドのラベル名を指定
selector:
matchLabels:
app: api
## ポッド作成のためのテンプレートを定義
## metadata.labelsに「app: api」を設定し、selectorと一致させる
template:
metadata:
labels:
app: api
spec:
containers:
## コンテナに使用するイメージを指定
- image: sample-app-api:latest
## ローカルのイメージを優先的に取得し、ない場合にイメージをプルする設定
imagePullPolicy: IfNotPresent
## コンテナ名を指定
name: sample-app-api
ports:
- containerPort: 8080
## 下で設定するボリュームをマウント対象として指定
volumeMounts:
- mountPath: /api
name: api-volume
## ボリュームの設定
volumes:
- hostPath:
path: /Users/自身のPCのユーザー名/sample-app/api
name: api-volume
【3-6-3发射系统启动】
api用のyamlファイルのあるフォルダまで移動する
$ cd api
yamlファイルの内容をデプロイします。
$ kubectl apply -f local-k8s.yaml
【3-6-4 三个元素的创建确认】
【启动3-7前置POD】
接下来,我们将创建FRONT Pod。
yaml文件应该在front文件夹下的“local-k8s.yaml”中进行记录。
sample_app/
- front/
- Dockerfile
- local-k8s.yaml
- その他アプリファイル..
用于创建前置Pod的元素包括以下四个。
-
- Deployment
- Service
最终的完成代码如下。
apiVersion: v1
kind: Service
metadata:
name: front-service
spec:
ports:
- nodePort: 31001
port: 3000
protocol: TCP
targetPort: 3000
selector:
app: front
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: front
spec:
replicas: 1
selector:
matchLabels:
app: front
template:
metadata:
labels:
app: front
spec:
containers:
- image: sample-app-front:latest
imagePullPolicy: IfNotPresent
name: sample-app-front
ports:
- containerPort: 3000
volumeMounts:
- mountPath: /front
name: front-volume
volumes:
- hostPath:
path: /Users/自身のPCのユーザー名/sample-app/front
name: front-volume
【3-7-1 客服】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
apiVersion: v1
## 作成するリソースをServiceにする
kind: Service
## Serviceの名前をfront-serviceに指定
metadata:
name: front-service
spec:
ports:
## クラスター外部からServiceにアクセスするためのノードのポートを指定
- nodePort: 31001
## クラスタ内部からServiceにアクセスするためのポート
port: 3000
protocol: TCP
## Serviceがリクエストを転送するポッドのポート番号
targetPort: 3000
## Serviceがリクエストを転送する対象とするポッド名を指定
selector:
app: front
type: NodePort
【三七二配置】
- 以下が完成コードです。コメントの解説を読んでみてください。
本地-k8s.yaml
.... 前の項目のコード
---
apiVersion: apps/v1
## 作成するリソースをDeploymentにする
kind: Deployment
## Deploymentの名前を指定
metadata:
name: front
spec:
## 実行するポッドのレプリカ数を1つに設定
replicas: 1
## ポッドのラベル名を指定
selector:
matchLabels:
app: front
## ポッド作成のためのテンプレートを定義
## metadata.labelsに「app: front」を設定し、selectorと一致させる
template:
metadata:
labels:
app: front
spec:
containers:
## コンテナに使用するイメージを指定
- image: sample-app-front:latest
## ローカルのイメージを優先的に取得し、ない場合にイメージをプルする設定
imagePullPolicy: IfNotPresent
## コンテナ名を指定
name: sample-app-front
ports:
- containerPort: 3000
## 下で設定するボリュームをマウント対象として指定
volumeMounts:
- mountPath: /front
name: front-volume
## ボリュームの設定
volumes:
- hostPath:
path: /Users/自身のPCのユーザー名/sample-app/front
name: front-volume
【3-7-3 起動 Pod】
front用のyamlファイルのあるフォルダまで移動する
$ cd front
yamlファイルの内容をデプロイします。
$ kubectl apply -f local-k8s.yaml
【3-7-4 创建确认三个要素】
【在3月8日之前,用浏览器进行操作确认】
解説は以上になります、お疲れ様でした!
由于有一种名为「kustomize」的工具,可以根据环境对Kubernetes进行配置更改,因此请务必尝试一下!