1. 概要

Kubernetesを使用する場合、ローカル開発に役立つツールが不足しています。これは、Dockerコンテナをノードとして使用してローカルKubernetesクラスターを実行できるツールです。

このチュートリアルでは、Kubernetesを親切に調べます。 主にKubernetesのテストツールであるkindは、ローカル開発やCIにも便利です。

2. 設定

前提条件として、Dockerがシステムにインストールされていることを確認する必要があります。 Dockerをインストールする簡単な方法は、オペレーティングシステム(およびmacOSの場合はプロセッサ)に適した DockerDesktopを使用することです。

2.1. Kubernetesコマンドラインをインストールする

まず、Kubernetesコマンドラインkubectl インストールしましょう。macOSでは、Homebrewを使用してインストールできます。

$ brew install kubectl

次のコマンドを使用して、インストールが成功したことを確認できます。

$ kubectl version --client

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", 
GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", 
BuildDate:"2021-07-15T21:04:39Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}

同様に、curlを使用してWindowsにダウンロードできます。

curl -LO https://dl.k8s.io/v1.21.0/bin/windows/amd64/kubectl.exe.sha256

次に、kubectlコマンドのバイナリ位置をPATH変数に追加する必要があります。

2.2. 種類をインストールします

次に、macOSにHomebrewを使用してkindをインストールします。

$ brew install kind

インストールが成功したことを確認するために、次のコマンドを試すことができます。

$ kind version
kind v0.11.1 go1.15.6 darwin/amd64

ただし、 kind version コマンドが機能しない場合は、その場所をPATH変数に追加してください。

同様に、Windowsオペレーティングシステムの場合、curlを使用してkindをダウンロードできます。

curl -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.11.1/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\kind\kind.exe

3. Kubernetesクラスター

これで、Kubernetesのローカル開発環境を準備するために親切に使用する準備が整いました。

3.1. クラスターの作成

まず、デフォルト構成でローカルKubernetesクラスターを作成しましょう。

$ kind create cluster

デフォルトでは、kindという名前のクラスターが作成されます。 ただし、 –name パラメーターを使用して、クラスターに名前を指定できます。

$ kind create cluster --name baeldung-kind
Creating cluster "baeldung-kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-baeldung-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-baeldung-kind
Thanks for using kind! 😊

また、YAML構成ファイルを使用してクラスターを構成することもできます。 たとえば、baeldungConfig.yamlファイルに単純な構成を記述してみましょう。

kind: Cluster
apiVersion: kind.x-k8s.io/v1
name: baeldung-kind

次に、構成ファイルを使用してクラスターを作成しましょう。

$ kind create cluster --config baeldungConfig.yaml

さらに、クラスターの作成中に特定のバージョンのKubernetesイメージを提供することもできます。

$ kind create cluster --image kindest/node:v1.20.7

3.2. クラスターを取得

get コマンドを使用して、作成されたクラスターを確認しましょう。

$ kind get clusters
baeldung-kind

また、対応するDockerコンテナを確認できます。

$ docker ps
CONTAINER ID  IMAGE                 COMMAND                 CREATED    STATUS        PORTS                      NAMES
612a98989e99  kindest/node:v1.21.1  "/usr/local/bin/entr…"  1 min ago  Up 2 minutes  127.0.0.1:59489->6443/tcp  baeldung-kind-control-plane

または、kubectlを介してノードを確認できます。

$ kubectl get nodes
NAME                          STATUS   ROLES                  AGE   VERSION
baeldung-kind-control-plane   Ready    control-plane,master   41s   v1.21.1

3.3. クラスターの詳細

クラスタの準備ができたら、kubectlcluster-infoコマンドを使用して詳細を確認できます。

$ kubectl cluster-info --context kind-baeldung-kind
Kubernetes master is running at https://127.0.0.1:59489
CoreDNS is running at https://127.0.0.1:59489/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

また、 dumpパラメーターをcluster-info コマンドと一緒に使用して、クラスターに関する詳細情報を抽出することもできます。

$ kubectl cluster-info dump --context kind-baeldung-kind

3.4. クラスターの削除

get コマンドと同様に、deleteコマンドを使用して特定のクラスターを削除できます。

$ kind delete cluster --name baeldung-kind

4. 入力コントローラー

4.1. 構成、設定

ローカル環境とKubernetesクラスタ間の接続を確立するには、ingressコントローラが必要です。

したがって、extraPortMappingsnode-labelsなどのkindの構成オプションを使用できます。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: baeldung-kind
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"    
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP

ここでは、 baeldungConfig.yaml ファイルを更新して、入力コントローラーの構成を設定し、コンテナーポートをホストポートにマッピングしました。 また、 ingress-ready = true を定義することにより、入力に対してノードを有効にしました。

次に、変更した構成でクラスターを再作成する必要があります。

kind create cluster --config baeldungConfig.yaml

4.2. 配備

次に、Kubernetesでサポートされている ingress NGINXコントローラーをデプロイして、リバースプロキシおよびロードバランサーとして機能させます。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

さらに、AWSおよびGCEロードバランサーコントローラーを使用することもできます。

5. ローカルでのサービスの展開

最後に、サービスを展開する準備が整いました。 このチュートリアルでは、Dockerイメージとして利用可能な単純なhttp-echoWebサーバーを使用できます。

5.1. 構成、設定

それでは、サービスを定義する構成ファイルを作成し、ingressを使用してローカルでホストしましょう。

kind: Pod
apiVersion: v1
metadata:
  name: baeldung-app
  labels:
    app: baeldung-app
spec:
  containers:
  - name: baeldung-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=Hello World! This is a Baeldung Kubernetes with kind App"
---
kind: Service
apiVersion: v1
metadata:
  name: baeldung-service
spec:
  selector:
    app: baeldung-app
  ports:
  # Default port used by the image
  - port: 5678
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: baeldung-ingress
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: "/baeldung"
        backend:
          service:
            name: baeldung-service
            port:
              number: 5678
---

ここでは、baeldung-appという名前のポッドをtext引数と、baeldung-service。というサービスで作成しました。

次に、5678ポートの baeldung-service に、 / baeldungURIを介して入力ネットワークを設定します。

5.2. 配備

すべての構成の準備が整い、クラスターが入力NGINXコントローラーと統合されたので、サービスをデプロイしましょう。

$ kubectl apply -f baeldung-service.yaml

kubectlでサービスのステータスを確認できます。

$ kubectl get services
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
baeldung-service   ClusterIP   10.96.172.116   <none>        5678/TCP   5m38s
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP    7m5s

それでおしまい! 私たちのサービスはデプロイされており、 localhost /baeldungで利用できるはずです。

$ curl localhost/baeldung
Hello World! This is a Baeldung Kubernetes with kind App

注: validate.nginx.ingress.kubernetes.io Webhookに関連するエラーが発生した場合は、ValidationWebhookConfigurationを削除する必要があります。

$ kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted

次に、サービスを再度デプロイします。

6. 結論

この記事では、種類を使用してKubernetesについて説明しました。

まず、Kubernetesコマンドラインkubectlkindのインストールを含むセットアップを行いました。 次に、種類のいくつかの機能を使用して、Kubernetesローカルクラスターを作成/更新しました。

最後に、入力コントローラーを統合し、Kubernetesクラスターにプライベートアクセス可能なサービスをデプロイしました。