コンテナ化、マイクロサービス、サービスメッシュ、サービスオーケストレーション、DevOps などのクラウドネイティブ技術が普及する中、私たちも時代の流れに乗る必要があります。では、どのようにしてその流れに乗ることができるのでしょうか?この時、ローカルで簡単に実行できる Kubernetes のツールが必要です。これにより、ノートパソコンの仮想マシン内で単一ノードの Kubernetes クラスターを簡単に作成でき、Kubernetes を使用して日常の開発や学習を行うことができます。それでは、よりリアルな K8s 環境を簡単に構築していきましょう。
ツールの推奨#
ローカルでの実験には、Kubernetes クラスターを実行するためのさまざまな Kubernetes 実装を使用できます。例えば:
- Kind (https://kind.sigs.k8s.io/)
- Minikube (https://minikube.sigs.k8s.io/docs/)
- MicroK8s (https://microk8s.io/)
- オンラインで K8s を体験 (https://labs.play-with-k8s.com/)
- Dockerized (https://github.com/y0ngb1n/dockerized) 私の個人プロジェクトを推奨します。スターを歓迎します。
上記のいずれかのツールを使用することで、ローカルで学習用の Kubernetes クラスターを迅速に実行できます。その中でも私が最も好きなのは Kind です。
K8s クラスターの構築#
次に、Kind と Minikube を使用して単一ノードの Kubernetes クラスターを作成してみましょう。
まずkubectl
をインストール#
どのツールを使用する場合でも、最初に Kubernetes コマンドラインツールであるkubectl
を正しくインストールする必要があります。そうしないと、Kind や Minikube などの環境をインストールした後にkubectl
コマンドを実行できません。
- インストールドキュメント:https://kubernetes.io/zh/docs/tasks/tools/#kubectl
Kind を使用して K8s クラスターを作成#
kind は、Docker コンテナ「ノード」を使用してローカル Kubernetes クラスターを実行するためのツールです。
kind
のインストール#
Kindは、さまざまなインストール方法を提供しており、以下の方法をサポートしています:
- macOS で Homebrew を使用
- macOS で MacPorts を使用
- Windows で Chocolatey を使用
- リリースバイナリからのインストール
- ソースからのインストール
ここでは、Linux 環境でリリースバイナリからのインストール方法を使用してインストールします:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
# mv ./kind /some-dir-in-your-PATH/kind
K8s クラスターの作成#
kind create cluster
# kind delete cluster
インストール環境の検証#
🐋️ ~ kind get clusters
kind
Minikube を使用して K8s クラスターを作成#
minikube
のインストール#
異なる環境でのインストール方法を選択し、https://minikube.sigs.k8s.io/docs/start/を参照してください。
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
国内のネットワーク環境では、以下のコマンドを使用して自動的に Aliyun サービスを使用してminikube
の環境設定をサポートします。詳細はhttps://developer.aliyun.com/article/221687を参照してください。
minikube start --image-mirror-country='cn'
# minikube delete
インストール環境の検証#
🐋️ ~ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
K8s コントロールパネルを起動するには、https://minikube.sigs.k8s.io/docs/handbook/dashboard/を参照してください。
minikube dashboard
# or
minikube dashboard --url
minikube
がサポートする拡張機能のリストを表示するには、https://minikube.sigs.k8s.io/docs/handbook/deploying/を参照してください。
minikube addons list
K8s クラスターの検証#
🐋️ ~ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"}
# 現在指しているk8s環境を確認します。kind/minikubeのインストール時にkubectlの設定が自動的に変更されます。
🐋️ ~ kubectl config current-context
kind-kind
# ローカルに複数のk8s環境がある場合、手動で切り替えることができます。
🐋️ ~ kubectl config use-context minikube
Switched to context "minikube".
# サーバーノードの確認
🐋️ ~ kubectl get no
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 36m v1.22.3
🐋️ ~ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 15m v1.22.3 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.4.0-42-generic docker://20.10.8
# k8sクラスターの情報を確認
🐋️ ~ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
K8s 初体験#
迅速な体験#
# 単一インスタンスのnginxを起動
🐋️ ~ kubectl create deployment nginx-depl --image=nginx
# 実行中のインスタンスを確認
🐋️ ~ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-depl-5c8bf76b5b-zw8ms 1/1 Running 0 70s
# ローカルの8080ポートをPodの80ポートに転送
🐋️ ~ kubectl port-forward nginx-depl-5c8bf76b5b-zw8ms 8080:80
# ローカルアクセス
🐋️ ~ curl 127.0.0.1:8080
# インスタンスを削除
🐋️ ~ kubectl delete deployment nginx-depl
小試し#
nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
nginx-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31080
selector:
app: nginx
type: NodePort
コマンドを実行:
# 一括公開、インスタンスを起動
🐋️ ~ kubectl apply -f .
# Podをデバッグ
🐋️ ~ kubectl describe pod nginx
🐋️ ~ kubectl port-forward nginx 8080:80
# Serviceをデバッグ
🐋️ ~ kubectl describe svc nginx-svc
🐋️ ~ kubectl port-forward service/nginx-svc 8080:80
# インスタンスを削除
🐋️ ~ kubectl delete -f .
注意事項#
- まず
kubectl
を正しくインストールする必要があります。 - Port-Forward を使用すると、ローカルで Pod にアクセスできますが、これはローカルデバッグ環境に限ります。例:
curl 127.0.0.1:8080
- Service を介してリバースプロキシを使用する場合、K8s クラスターの IP を使用してアクセスする必要があります。K8s クラスターの IP を確認するには、
kubectl get nodes -o wide
を使用します。 - Service は K8s が提供するリバースプロキシのメカニズムで、リバースルーティングと負荷分散を担当します。
- NodePort は Service の一種で、Service を外部に公開できます。
- NodePort の範囲は
30000~32767
です。 - Label は K8s のラベル付けメカニズムです。
- Selector は K8s のルーティング選択メカニズムです。
- Kind または Minikube でデプロイされた K8s クラスターは、ノードがコンテナで実行されるため、Service のリバースプロキシはノードのコンテナ内でのみ kube-proxy が有効です。これを確認するには、
docker exec -it kind-control-plane bash
を使用します。ホストマシンに直接マッピングされるわけではありません。
K8s 障害排除ガイド#