y0ngb1n

Aben Blog

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

Kubernetes 入門から実践へ:K3s クラスターの初体験

実践環境#

この記事では Ubuntu システムを使用しますが、Centos システムを選択しても参考にできます。その手順とコマンドはほぼ同じで、基本的な考え方は変わりません。

この記事は初めて公開されました:https://github.com/y0ngb1n/y0ngb1n.github.io

Docker のインストール#

K3s には containerd が含まれており、デフォルトで使用されます。この記事では Docker をコンテナランタイムとして使用するため、事前に Docker 環境をインストールする必要があります。

# ソフトウェアソースを更新
sudo apt update

# root ユーザーに切り替え
sudo su -

# docker をインストール
apt install docker.io

# docker デーモンを起動
systemctl enable --now docker
systemctl status docker

# docker 環境を確認
docker version && docker info
docker ps

以降、K3s を起動する際には --docker オプションを使用して有効にします。参考にしてくださいDocker をコンテナランタイムとして使用するドキュメント。

K3s のインストール#

軽量 Kubernetes。生産準備が整っており、インストールが簡単で、メモリは半分、すべてが 100 MB 未満のバイナリに収められています。

K3s は高可用性で、CNCF に認証された軽量 Kubernetes ディストリビューションで、IoT およびエッジコンピューティング向けに設計されています。

image

k3s は Kubernetes に必要なすべてをわずか 60MB のバイナリファイルにパッケージ化し、Kubernetes API を完全に実装しています。Kubernetes の実行に必要なメモリを削減するために、k3s は多くの不要なドライバーを削除し、追加コンポーネントで置き換えています。非常に少ないリソースで実行できるため、512MB 以上のメモリを持つ任意のデバイスでクラスターを実行できます。

まずは簡単な K3s から始めて、K8s の半分である K3s を体験しましょう。K3s のスキルが習得できたら、kubeadm を使用して高可用性の Kubernetes クラスターをデプロイします。そのデプロイアーキテクチャはほぼ同じで、いくつかのコアコンポーネントの変更があるだけで、基本的な考え方は変わりません。

方案一:ワンクリックインストール(公式ソース、外部ネットワークが必要)#

K3s のコアコンポーネントのイメージは gcr.io からプルする必要があるため(国内ネットワークでは接続できません)、外部ネットワークにアクセスできる環境が必要です。サーバーがすべて海外にある環境に適しています。シンプルで強力なワンクリックインストールです。

# ワンクリックデフォルトインストール
curl -sfL https://get.k3s.io | sh -

方案二:ワンクリックインストール(国内ソース)推奨#

国内のユーザーは、以下の方法でインストールを加速できます。Aliyun のミラーソースが内蔵されています:

# K3s バージョンを指定
export INSTALL_K3S_VERSION=v1.23.13+k3s1

# カスタム起動実行コマンド
export INSTALL_K3S_EXEC="--docker"

# インストールのみ、起動しない
export INSTALL_K3S_SKIP_START=true

# https://docs.rancher.cn/docs/k3s/installation/installation-requirements/_index#先决条件
# クラスターに追加する各ノードにユニークな名前を付ける
export K3S_NODE_NAME=k3s-node-01

###
# agent には追加が必要、他は一致させる
###
# K3S_URL を設定すると、デフォルトで「agent」になります。K3S_URL が設定されていない場合、デフォルトで「server」になります
export K3S_URL=
# サーバーまたはエージェントをクラスターに追加するための共有シークレット
export K3S_TOKEN=

# Aliyun のミラーソースを使用してインストール
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

# K3s サービスを起動
systemctl enable --now k3s

# K3s サービスの状態を確認
systemctl status k3s

方案三:オフラインインストール#

前提条件#

  • K3s をインストールする前に、上記のプライベートイメージリポジトリをデプロイするまたは手動でイメージをデプロイするを完了し、K3s のインストールに必要なイメージをインポートします。このセクションでは手動でイメージをデプロイする方法を示します。
  • K3s GitHub Release ページから K3s v1.23.13+k3s1 のバイナリファイルをダウンロードします。K3s のバイナリファイルはオフラインイメージのバージョンと一致する必要があります。バイナリファイルを各オフラインノードの /usr/local/bin に配置し、このバイナリファイルが実行可能であることを確認します。
  • K3s インストールスクリプトをダウンロードし、各オフラインノードの任意の場所に配置し、install.sh という名前を付けます。

INSTALL_K3S_SKIP_DOWNLOAD 環境変数を使用して K3s スクリプトを実行すると、K3s はローカルのスクリプトとバイナリを使用します。

手動でイメージをデプロイ#

オフライン / 国内環境でノードを作成したと仮定します。この方法では、必要なイメージを手動で各ノードにデプロイする必要があります。イメージリポジトリをデプロイできないエッジデプロイメントシナリオに適しています。参考にしてください公式の手動でイメージをデプロイするドキュメント。

  1. K3s GitHub Release ページからインストールする K3s v1.23.13+k3s1 のイメージ tar ファイルを取得します。

  2. tar ファイルを images ディレクトリに配置します。例えば:

    # 各ノードのオフラインイメージのストレージフォルダーを作成
    sudo mkdir -p /var/lib/rancher/k3s/agent/images/
    
    # $ARCH は現在のサーバーの CPU アーキテクチャ
    sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
    
  3. 各ノードにイメージを手動でデプロイする必要があります。各ノードで上記の操作を実行します。

K3s v1.23.13+k3s1 のバイナリファイルをダウンロード#

K3s GitHub Release ページから K3s v1.23.13+k3s1 のバイナリファイルをダウンロードします。K3s のバイナリファイルはオフラインイメージのバージョンと一致する必要があります。バイナリファイルを各オフラインノードの /usr/local/bin に配置し、このバイナリファイルが実行可能であることを確認します。

スクリプトを使用してインストール#

インストールスクリプトは以下のいずれかのアドレスからダウンロードできます:

スクリプトアドレス説明
https://get.k3s.io/公式アドレス、外部ネットワーク環境が必要
https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.shAliyun ソース、Aliyun のミラーソースが内蔵
https://raw.githubusercontent.com/k3s-io/k3s/master/install.shGitHub アドレス、公式ソースと同じ
# スクリプトをダウンロード
curl -sfL https://get.k3s.io > install.sh

# root ユーザーに切り替え
sudo su -

# 実行権限を付与
chmod +x install.sh

# K3s をインストール、バイナリファイルのダウンロードをスキップし、インストールのみ、起動しない
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_SKIP_START=true ./install.sh

# K3s を起動
systemctl enable --now k3s

K3s の検証#

クラスターの確認#

# クラスターの稼働状況を確認
kubectl get nodes -owide
kubectl get all -A -owide
kubectl describe nodes k3s-node-01
kubectl -n kube-system describe deploy coredns

# Docker をランタイムとして使用すると、docker がイメージをプルしてコンテナを実行します
docker images
docker ps

牛刀小試#

whoami サービスを起動#

# whoami アプリを迅速にデプロイし、副本を 2 に指定、デフォルトの副本は 1
kubectl create deploy whoami --image=traefik/whoami --replicas=2
kubectl describe deploy whoami
# pod の状態を監視し、スケーリングを通じて pod のスケジューリング状況を視覚的に確認
kubectl get pods --watch
# whoami アプリのスケーリングを試みる
kubectl scale deploy whoami --replicas=5

リクエストチェーンの説明#

k8s のリクエストチェーンを理解してみましょう:

request public-ip -> node-port -> svc-port -> pod-port -> container

Service を通じてクラスター内部に公開#

デフォルトでは NodePort モードで、各ノードでリッスンします。

kubectl expose deploy whoami --port=80
kubectl get svc -owide
kubectl describe svc whoami

# ローカルでサービスに何度もアクセスし、コンテナへのラウンドロビンアクセスを確認
# curl http://<external-ip>:<port>
$ curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
Hostname: whoami-84d974bbd6-shqsr
IP: 127.0.0.1
IP: 10.42.0.13
RemoteAddr: 10.42.0.1:42158
GET / HTTP/1.1
Host: 10.43.181.167
User-Agent: curl/7.68.0
Accept: */*

Service を通じてクラスター外部に公開#

LoadBalancer モードを指定し、パブリック IP を指定します。

# <PUBLIC_IP> を現在のノードのパブリック IP に置き換えます
kubectl expose deploy whoami --type=LoadBalancer --port=80 --external-ip <PUBLIC_IP>

$ kubectl get svc whoami -owide
NAME     TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)        AGE   SELECTOR
whoami   LoadBalancer   10.43.77.116   123.123.123.123   80:32101/TCP   16s   app=whoami

# クラスター内部でも正常にアクセスできます
curl 10.43.77.116
curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`

# 外部のブラウザからアクセスするには、クラウドサービスプロバイダーのファイアウォール設定を有効にする必要があります
# Ctrl + F5 で何度もリフレッシュして効果を確認
http://123.123.123.123:32101

実験環境の迅速なクリーンアップ#

kubectl delete all --all

K3s のアンインストール#

# サーバーをワンクリックでアンインストール
k3s-uninstall.sh

# エージェントをワンクリックでアンインストール
k3s-agent-uninstall.sh

参考リンク#

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