VirtualBox+Ubuntu16でKubernetesクラスタを構築する実装

VirtualBox+Ubuntu16でKubernetesクラスタを構築する実装

Kubernetes の運用・保守の始まりは、当然のことながらクラスタ環境の構築と切り離せません。この記事では、VirtualBox + Ubuntu 16 を使用したマシン上に Kubernetes を構築するまでの全過程を記録し、遭遇したいくつかの問題とその解決策も紹介します。

Kubernetesについて

Wikipedia による Kubernetes の説明は次のとおりです。

Kubernetes (K8s とも呼ばれる) は、コンテナ化されたアプリケーションを自動的にデプロイ、スケーリング、管理するためのオープンソース システムです。このシステムは Google によって設計され、Cloud Native Computing Foundation (現在は Linux Foundation の一部) に使用するために寄贈されました。
その目的は、「ホストのクラスター全体にわたるアプリケーション コンテナの展開、スケーリング、実行を自動化するプラットフォーム」を提供することです。 Docker を含むさまざまなコンテナ ツールをサポートします。

Kubernetes は、サービス検出と負荷分散、ストレージ オーケストレーション、自動デプロイメントとロールバック、ボックス パッキングの自動完了、自己修復、キーと構成の管理機能を提供します。

基本的な環境の準備

VirtualBoxをインストールする

VirtualBox は、オープンソースで無料の強力な仮想マシン ソフトウェアです。ダウンロード アドレスはこちらです。VirtualBox のインストールは非常に簡単なので、ここでは詳しく説明しません。

Ubuntu 16 システムイメージをダウンロード

ここではシステムイメージとして Ubuntu 16 を選択しました。もちろん CentOS など他のシステムも使用できます。Ubuntu 16 のダウンロード アドレス。

仮想マシン x3

VirtualBox をインストールして Ubuntu 16 イメージをダウンロードしたら、まず 3 つの Ubuntu 16 仮想マシンを構築する必要があります。新しい仮想マシンを作成するプロセスは比較的簡単で、手順を 1 つずつ実行するだけです。新規作成が完了したら、各仮想マシンをそれに応じて構成する必要があります。構成中に使用するユーザーは、root ユーザーである必要があります。

仮想マシンのIP

仮想マシンを使用しているため、各仮想マシンがインターネットにアクセスできるように、各仮想マシンにネットワーク カードを構成します。方法は 2 つあります。

  • ブリッジネットワークカードを使用すると、各仮想マシンのIPがホストネットワークセグメントに配置され、仮想マシンがインターネットにアクセスできるようになります。
  • NATネットワーク+ポート転送を使用し、ネットワークセグメントを自分で設定し、仮想マシンのインターネットアクセスをサポートします。

これらのいずれかの方法を使用して、仮想マシンがインターネットにアクセスできるように仮想マシンのネットワーク カードを構成できます。

クラスターが構築された後、クラスター内の各ノードの IP アドレスは変更されないままである必要があることに注意してください。そうでない場合は、ノードを再参加する必要があります。

簡単な方法は、仮想マシンをシャットダウンするのではなくスリープ モードにして、次回起動することです。

クラスターでは、イントラネット アドレスを使用します。各仮想マシンに対応するイントラネット アドレスは、ifconfig または ip addr で確認できます。

> ifconfig

enp0s3 リンク encap:イーサネット HWaddr 08:00:27:6f:23:2a  
          inet アドレス:10.0.2.4 Bcast:10.0.2.255 マスク:255.255.255.0
          inet6 アドレス: fe80::a00:27ff:fe6f:232a/64 スコープ:リンク
          アップブロードキャスト 実行中マルチキャスト MTU:1500 メトリック:1
          RXパケット:3277016 エラー:0 ドロップ:0 オーバーラン:0 フレーム:0
          TX パケット:3385793 エラー:0 ドロップ:0 オーバーラン:0 キャリア:0
          衝突:0 トランザクションキュー数:1000 
          RX バイト:1084480916 (1.0 GB) TX バイト:2079122979 (2.0 GB)

この仮想マシン (マスター) のアドレスは 10.0.2.4 です。

ホスト名の設定

Kubernetes のノード名はホスト名によって決まるため、3 つの仮想マシンのホスト名をそれぞれ master、node1、node2 に設定できます。ホスト名を変更するには、/etc/hosts ファイルを変更して仮想マシンを再起動します。

# /etc/ホスト
10.0.2.4 マスター
10.0.2.5 ノード1
10.0.2.6 ノード2

SSH 非暗号化接続

仮想マシンが実行中になったら、最初に 3 台の仮想マシンを接続し、SSH パスワード不要の接続を構成する必要があります。
まず、仮想マシンの 1 つで SSH 公開キーと秘密キーを生成します。

ssh-keygen -t rsa -C '[email protected]' -f ~/.ssh/id_rsa -q -N ''

ssh-keygen のパラメータの説明:

  • -t rsaは暗号化アルゴリズムをRSAとして指定します
  • -C '[email protected]' は、秘密鍵を生成した人物を示すメモを提供するために使用されます。
  • -f ~/.ssh/id_rsa は秘密鍵が生成される場所を指定します
  • -q -N ''は秘密鍵を暗号化せず、サイレントモードを使用することを意味します

公開鍵と秘密鍵を他の 2 台の仮想マシンに配布し、公開鍵 (~/.ssh/id_rsa.pub) の内容を 3 台の仮想マシンすべての ~/.ssh/authorized_keys ファイルに書き込み、~/.ssh/authorized_keys ファイルの権限を 400 に設定します。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys

構成が完了すると、次の方法で仮想マシンの 1 つ上の別の仮想マシンに接続できるようになります。

# マスターノードでssh root@node1

Kubernetes クラスターの構築

3 つの仮想マシンをセットアップしたら、3 つのノードを持つ Kubernetes クラスターの構築を開始できます。

Dockerをインストールする

apt-getアップデート-y
apt-getインストール-y \
  apt-transport-https \
  ca証明書\
  カール\
  gnupg \
  lsb リリース
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
エコー\
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) 安定版" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# DOCKERエンジンをインストールする
apt-getアップデート-y
apt-get install -y docker-ce docker-ce-cli containerd.io

# 起動時にDockerが起動するように設定する
systemctl で docker.service を有効にする
systemctl で containerd.service を有効にする

# Dockerを起動する
systemctl ドッカーを起動する

kubeadm、kubelet、kubectlをインストールする

ここで使用されている画像ソースは Alibaba Cloud です。

# apt パッケージインデックスを更新し、Kubernetes apt リポジトリを使用するために必要なパッケージをインストールします。apt-get update -y
apt-get install -y apt-transport-https ca-certificates curl

# Google Cloud 公開署名キーをダウンロードします# curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key を追加 -

# Kubernetes apt リポジトリを追加します# echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# apt パッケージインデックスを更新し、kubelet、kubeadm、kubectl をインストールして、それらのバージョンをロックします。apt-get update -y
apt-get install -y kubelet kubeadm kubectl
apt-mark ホールド kubelet kubeadm kubectl

SWAPをオフにする

/etc/fstab ファイルを編集し、スワップ パーティションの設定をコメント アウトします。

#/dev/mapper/master--vg-swap_1 なし スワップ sw 0 0

画像を事前にダウンロードする

kubeadm init に必要なミラー リストを取得します。

> kubeadm 構成イメージリスト

k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-コントローラマネージャー:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/一時停止:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

k8s のイメージソースは国内ユーザーには手の届かないところにありますが、まずは国内のイメージウェアハウスか、Alibaba Cloud のコンテナイメージサービス ACR や Docker の公式イメージウェアハウス DockerHub など、利用できるイメージウェアハウスに pull することができます。

1 つの Dockerfile だけで新しい GitHub コード リポジトリを作成できます。その内容は次のとおりです。

k8s.gcr.io/kube-apiserver:v1.21.0 から

次に、Alibaba Cloud のコンテナ イメージ サービス ACR で新しいイメージを作成し、それを GitHub コード リポジトリに関連付けます。ビルドされたイメージは、上記の k8s.gcr.io/kube-apiserver:v1.21.1 のような必要な k8s イメージですが、使用するときにイメージにラベルを付け直す必要があります。

ACR で必要なすべてのイメージを構築した後、次のスクリプトを使用して、イメージにタグを付けるタスクをすばやく処理します。

# aliyun レジストリからイメージをプルする
kubeadm 構成イメージリスト | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-shenzhen.aliyuncs.com/k8scat#g' -e 's#/coredns/coredns#/coredns#g' | sh -x

# 画像のタグ付け
docker イメージ | grep k8scat | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's#registry.cn-shenzhen.aliyuncs.com/k8scat#k8s.gcr.io#2' | sh -x
docker タグ k8s.gcr.io/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0

# 画像を削除する
docker イメージ | grep k8scat | awk '{print "docker rmi",$1":"$2}' | sh -x

マスターノードを初期化する

10.0.2.4 はマスターノードの IP アドレスです。ポッドのネットワークセグメントを 192.168.16.0/20 に設定します。

> kubeadm init --apiserver-advertise-address=10.0.2.4 --pod-network-cidr=192.168.16.0/20

kubeadm join 10.0.2.4:6443 --token ioshf8.40n8i0rjsehpigcl \
    --ディスカバリートークンCA証明書ハッシュsha256:085d36848b2ee8ae9032d27a444795bc0e459f54ba043500d19d2c6fb044b065

ノードを追加

kubeadm join 10.0.2.4:6443 --token ioshf8.40n8i0rjsehpigcl \
    --ディスカバリートークンCA証明書ハッシュsha256:085d36848b2ee8ae9032d27a444795bc0e459f54ba043500d19d2c6fb044b065

kubectl設定ファイルを配布する

scp マスター:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
echo 'export KUBECONFIG="/etc/kubernetes/admin.conf"' >> /etc/profile
ソース /etc/profile

ネットワークプラグインのインストール

ここではWeave Netを使用します。

# curl -L "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" > weave-net.yaml

# IPALLOC_RANGE を使用する場合
kubectl を適用 -f https://gist.githubusercontent.com/k8scat/c6a1aa5a1bdcb8c220368dd2db69bedf/raw/da1410eea6771c56e93f191df82206be8e722112/k8s-weave-net.yaml

VirtualBox+Ubuntu16でKubernetesクラスターを構築する実装については以上です。VirtualBox+Ubuntu16でKubernetesクラスターを構築する実装の詳細については、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • VirtualBox を使用して Linux クラスターをシミュレートする方法
  • VirtualBoxでローカルKubernetesクラスターを構築する方法を説明します

<<:  横スクロールウェブサイトデザインの概要

>>:  JSは要素のドラッグとプレースホルダー機能を実装します

推薦する

display または visibility を通じて HTML 要素を表示または非表示にする

場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...

MYSQL8.0.13 無料インストール版 設定チュートリアル例 詳細説明

1. ダウンロード、例として8.0を取り上げますダウンロードアドレス: https://dev.my...

mysql5.7 でユーザーの初期パスワードを変更する方法

ユーザーが初めて MySQL データベースをインストールするとき、初期のルート パスワードを変更する...

Redis イメージの Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する落とし穴を避けるための注意MySQLコン...

Vue ベースの要素ボタン権限実装ソリューション

背景要件: ERP システムに「ボタン権限制御」機能を追加する必要があり、権限の制御粒度をボタン レ...

Linux のソフトリンクとハードリンクの詳細な説明

目次1. ファイルとディレクトリの基本的な保存2. Inコマンドの紹介(1)lnコマンドの基本情報を...

Linux の vsftpd サービス構成の簡単な分析 (匿名、ユーザー、仮想ユーザー)

vsftpd の概要vsftpd は「very secure FTP daemon」の略称で、セキ...

Zabbixは複数のmysqlプロセスの監視を実装します

1 つのサーバー上で 3 つの MySQL インスタンス プロセスが開始され、それぞれ異なるポート ...

ログインインターフェースの使いやすさとセキュリティのバランスをとる方法

ウェブデザイナーでもUIデザイナーでも、ログインページや登録ページのデザインは必ず経験しなければなら...

JS オブジェクト コンストラクター Object.freeze

目次概要例1) オブジェクトをフリーズする2) 配列をフリーズする3) 浅い凍結4) ディープフリー...

W3C標準に準拠したHTML標準で注意すべき点を詳細に解説

XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...

Vue ディレクティブ v-html と v-text

目次1. v-text テキストレンダリング命令2. v-html 1. v-text テキストレン...

Vueコンポーネントのカスタムイベントの詳細な説明

目次要約する <テンプレート> <div> 要素 <h2>{{メ...

3 階層ナビゲーション メニューを実現するための js+css

この記事の例では、3レベルのナビゲーションメニューを実装するためのjs + cssの具体的なコードを...

JavaScript Canvas で三目並べゲームを実装

この記事では、JavaScript Canvasで三目並べゲームを実装するための具体的なコードを参考...