新しい翻訳記事では、KinDを実際の例で扱います。
Kubernetesクラスターの構築は 時間の経過とともに簡単になっています。市場にはいくつかのターンキーソリューションがありますが、今では誰も難しい道を選ぶことはありません。 Minikubeは、開発者がコンテナを迅速に開発およびテストするために使用した主要なクラスターの1つであった
ことは注目に値し ます。 Minikubeは現在、実験的にマルチサイトクラスタリングをサポートしていますが、General Access(GA)ではまだ利用できません。
その結果、これによりコンポーネントを統合およびテストする機能が制限されます。そのため、ほとんどの組織はこれにKubernetesマネージドクラウドサービスを使用しています。
KubernetesをCI / CDパイプラインに統合して(継続的な統合と展開)、テストを実行するには、次のツールが必要です。クラウドプロバイダーに応じてTerraform、そしてもちろん、Jenkins、GitLab、GitHubなどのCI / CDツール。
十分な予算のある大企業にとって、これらは適切なオプションですが、開発者は多くの場合、迅速に開始するのに役立つ何かを探しています。 Kubernetesクラスターをクラウドにデプロイするのにも時間がかかります(約10分)。これは、アセンブリを迅速に取得する必要があるCIにとって障害となる可能性があります。
DockerまたはKinDのKubernetesは、Kubernetes のDocker-in-Docker(DinD)アプローチの実装です。このツールは、Kubernetesホストとして機能するコンテナを作成し、Dockerをマシンにインストールするだけで済みます。
他のツールやクラウドプロバイダーに依存することなく、数分でマルチノードクラスターを展開できます。これにより、ローカル開発だけでなく、CI / CDにも役立ちます。
KinDアーキテクチャ
DockerのKubernetesは、Docker-in-Docker(DinD)アプローチを使用してKubernetesクラスターを実行します。 Kubernetesホストとして機能するいくつかのDockerコンテナを実行します。 Dockerコンテナは、マシンで実行されているDockerにdocker.sockボリュームをマウント して、基盤となるコンテナランタイムと通信します。
KinDはコンプライアンステストに合格し、CNCF証明書を受け取りました。 Kubeadmを使用してクラスターをブートストラップし、クラスターの管理に使用するユーザーのKube構成ファイルを生成して、kubectlを使用してクラスターと対話できるようにします 。 HelmやIstioなどの他のKubernetesコンポーネントも、KinDクラスターでうまく機能します。
種類の欠点は、それが動作しませんということであるロードバランササービス は、使用する必要がありますので、 NodePortを外部にあなたのサービスを転送します。
また、DinDは現在最も安全なソリューションではないため、KinDクラスターはローカル開発マシンとCI / CDパイプラインでのみ使用してください。KinDを実稼働環境で使用しないでください。
KinDのインストール
KinDは、ダウンロードしてパスに配置できるシンプルなコマンドラインユーティリティで構成されています。次に、kindコマンドを使用してKinDと対話できます 。
sudo curl -sL https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64 -o /usr/local/bin/kind
sudo chmod +x /usr/local/bin//kind
次に、次のコマンドを使用してクラスターを作成できます。
kind create cluster --wait 10m
このコマンドは、単一ノードクラスターを作成します。ただし、マルチノードクラスターを定義する場合は、次のようなクラスター構成ファイルを使用できます。
# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
次に、次のコマンドを使用して、構成ファイルを使用してクラスターを作成します。
kind create cluster --wait 10m --config kind-config.yaml
ノードセクションで複数の役割を指定することにより、複数の管理レベルを持つクラスターを作成することもできます。
KinDはKube構成ファイルを自動的に生成するため、他のクラスターと同じようにkubectlコマンドを使用できます 。
KinDクラスターの削除も簡単です。次のコマンドを実行します。
kind delete cluster
入門
さらに面倒なことはせずに、CI / CDパイプラインがKinDをどのように使用するかを実際に理解しましょう。GitHub ActionsをCI / CDツールとして採用します。これは、使いやすく、追加のインフラストラクチャを必要とせず、ラップトップとインターネット接続があれば誰でも実行できるためです。 「HelloWorld」というラベルの付い
た簡単なNGINXアプリケーションを作成しましょう 。
次のアクションを実行します。
- アプリケーションの開発バージョンを作成します。
- KinDクラスター内のコンポーネントのテストを開始します。
- テストが成功した場合、イメージをリリースに変換し、DockerHubにプッシュします。
必要な条件
- GitHubアカウント
- DockerHubアカウント
クイックスタートガイド
- このリポジトリにフォークこのリポジトリを。
- リポジトリに移動し、DOCKER_USERとDOCKER_PWの2つのシークレットを作成します。DockerHubのユーザー名とアカウントのパスワードがそれぞれ含まれている必要があります。
- GitHubアクションに移動し、タスクを再実行します。または、README.mdファイルを変更して実行し、アクションをトリガーすることもできます。
ロングバージョン
GitHub Actionsのbuild-pipeline.ymlファイルを見て、それがどのように機能するかを理解しましょう 。
name: Docker Image CI
on: [push]
# Environment variables available to all jobs and steps in this workflow
env: # Or as an environment variable
docker_username: ${{ secrets.DOCKER_USER }}
docker_password: ${{ secrets.DOCKER_PW }}
jobs:
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Build the Docker image
run: docker build -t $docker_username/nginx:dev .
- name: Login to Docker
run: echo "$docker_password" | docker login -u "$docker_username" --password-stdin
- name: Push the docker image
run: docker push $docker_username/nginx:dev
kubernetes-component-test:
runs-on: ubuntu-latest
needs: build-docker-image
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Run KIND Test
run: sudo sh build-test.sh $docker_username
promote-and-push-docker-image:
runs-on: ubuntu-latest
needs: kubernetes-component-test
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Pull the Docker image
run: docker pull $docker_username/nginx:dev
- name: Tag the Docker image
run: docker tag $docker_username/nginx:dev $docker_username/nginx:release
- name: Login to Docker
run: echo "$docker_password" | docker login -u "$docker_username" --password-stdin
- name: Push the docker image
run: docker push $docker_username/nginx:release
アセンブリパイプラインは、次の3つのタスクを順番に実行します。
- build-docker-imageタスクは、開発用のDockerイメージをビルドし、ビルドが成功すると、それをDockerハブにプッシュします。このタスクでは、ユニットテストを実行できます。
- kubernetes-component-testタスクは、KinDクラスターをセットアップし、アプリケーションのコンポーネントテストを実行します。
- Promote-and-push-docker-imageタスクは、開発イメージをプルし、リリースするようにマークを付け、リリースをDockerHubにプッシュします。
Dockerfileを見て、何が作成されるかを理解しましょう。
FROM nginx
RUN echo 'Hello World' > /usr/share/nginx/html/index.html
2番目のステップは重要です。build-test.shスクリプトを実行します 。それでは、スクリプトを見てみましょう。
#! /bin/bash
docker_username=$1
set -xe
curl -sL https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64 -o /usr/local/bin/kind
chmod 755 /usr/local/bin//kind
curl -sL https://storage.googleapis.com/kubernetes-release/release/v1.17.4/bin/linux/amd64/kubectl -o
chmod 755 /usr/local/bin//kubectl
curl -LO https://get.helm.sh/helm-v3.1.2-linux-amd64.tar.gz
tar -xzf helm-v3.1.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
rm -rf helm-v3.1.2-linux-amd64.tar.gz
kind version
kubectl version --client=true
helm version
kind create cluster --wait 10m --config kind-config.yaml
kubectl get nodes
docker build -t $docker_username/nginx:dev .
kind load docker-image $docker_username/nginx:dev
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
NODE_IP=$(kubectl get node -o wide|tail -1|awk {'print $6'})
NODE_PORT=$(kubectl get svc nginx-service -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.node
sleep 60
SUCCESS=$(curl $NODE_IP:$NODE_PORT)
if [[ "${SUCCESS}" != "Hello World" ]];
then
kind -q delete cluster
exit 1;
else
kind -q delete cluster
echo "Component test succesful"
fi
スクリプトの機能:
- 種類、kubectl、helmユーティリティをCIサーバーにダウンロードしてインストールします。
- kind-config.yamlファイルを使用してマルチノードクラスターを作成します。
- Docker docker build.
- Docker KinD. KinD, Docker Hub.
- deployment NodePort NodePortservice.
- IP- , , «Hello World».
- , KinD, «Component test successful» ( ) . , KinD .
パイプラインの操作を開始すると、GitHub Actions
はパイプライン全体を自動的に起動します。 これは間違いなく改善であり、DockerとKubernetesを使用して継続的な統合と展開を実行するための便利な方法です。DockerのKubernetesは、ローカル開発を簡素化するだけでなく、CI / CDの優れたツールでもあります。
記事を読んでくれてありがとう!楽しんでいただけたでしょうか!