y0ngb1n

Aben Blog

欢迎来到我的技术小黑屋ヾ(◍°∇°◍)ノ゙
github

Dockerを使用して単一ノードのKubernetesクラスターを迅速に構築する

コンテナ化、マイクロサービス、サービスメッシュ、サービスオーケストレーション、DevOps などのクラウドネイティブ技術が普及する中、私たちも時代の流れに乗る必要があります。では、どのようにしてその流れに乗ることができるのでしょうか?この時、ローカルで簡単に実行できる Kubernetes のツールが必要です。これにより、ノートパソコンの仮想マシン内で単一ノードの Kubernetes クラスターを簡単に作成でき、Kubernetes を使用して日常の開発や学習を行うことができます。それでは、よりリアルな K8s 環境を簡単に構築していきましょう。

ツールの推奨#

ローカルでの実験には、Kubernetes クラスターを実行するためのさまざまな Kubernetes 実装を使用できます。例えば:

上記のいずれかのツールを使用することで、ローカルで学習用の Kubernetes クラスターを迅速に実行できます。その中でも私が最も好きなのは Kind です。

K8s クラスターの構築#

次に、Kind と Minikube を使用して単一ノードの Kubernetes クラスターを作成してみましょう。

まずkubectlをインストール#

どのツールを使用する場合でも、最初に Kubernetes コマンドラインツールであるkubectlを正しくインストールする必要があります。そうしないと、Kind や Minikube などの環境をインストールした後にkubectlコマンドを実行できません。

Kind を使用して K8s クラスターを作成#

kind は、Docker コンテナ「ノード」を使用してローカル Kubernetes クラスターを実行するためのツールです。

kindのインストール#

Kindは、さまざまなインストール方法を提供しており、以下の方法をサポートしています:

ここでは、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 障害排除ガイド#

a-visual-guide-on-troubleshooting-kubernetes-deployments

参考リンク#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。