wayというものがあります。それはkubeadmやマネージドKubernetesサービスを使用せず、手作業でKubernetesクラスタを作成していき、Kubernetesを学ぶというコンテンツです。piでクラスタ構築していきます。概ねCyberAgentさんのリポジトリを参考にしましたが、以下の点でオリジナリティを加えています。Optimizationにならないように意識している。!筆者の私自身Kubernetesを学習中の身であり、様々なところで至らないところがあると思います。v1.29.0Kubernetesの概要がわからない人向けKubernetesの概要を理解するために役立つ情報源をまとめた記事を以前に書きましたので、それを参考に学習をしてみてください。わからない状態で行うより、ある程度わかる状態で行う方が学習効果があると思います。https://zenn.dev/num/articles/kuberletes-learning-resources作成するKubernetesクラスタ(物理)こちらが作成していくKubernetesクラスタです。気に入っていて、愛着が湧いてきました。キーボードを使用しました。HATは給電をLANケーブルで行なうことで充電ケーブルを不要にし、配線をスッキリさせる機器なので、必須ではないです。物理構築手順CyberAgentさんのリポジトリを見ながら作成しました。wayを行なっていきます。クラスタの構成はマスターノード1台、ワーカーノード2台の計3台で行います。!マスターノードの冗長性を確保したクラスタを作成したい場合は、マスターノード用に3台以上の奇数台のホストが必要になります。これは分散合意アルゴリズムのRaftを使用していることに起因します。準備これからの説明は以下のような設定であることを前提に構築していきます。異なる点がある場合は各自の環境に合わせてください。nodehostnameは、hostnamectlコマンドで設定することができます。/etc/netplan/に新しくyamlファイルを追加する形で実現できます。【Ubuntu】固定IPアドレスを割り当てる証明書の作成Kubernetesは様々なコンポーネントで構成されており、それらの通信にTLSを使用します。そのための証明書の作成を行いますこのステップはmasterノードで行います。ssh接続を利用して行なってください。証明書作成に使用するツール群をインストールします。golang-cfsslそして、以下のシェルスクリプト(generate-cert.sh)を実行します。certificate!私はここで設定するClusterIPを10.32.0.1ではなく10.32.0.0/24としてしまい、後で証明書を作り直すことになりました。作成したca.pemと各hostnameに対応した<hostname>.pemと<hostname>-key.pemはそれぞれのホストにscpコマンドで送ります。ubuntu@192.168.0.7:~/これらはkubeletがkube-apiserverを認証したり、kube-apiserverがkubeletを認証するために使います。残りの証明書はmaster1で使用します。kubectlコマンド)が、kube-apiserverと通信するための設定ファイルを作成します。設定ファイルを作成するためにkubectlコマンドを使用するので、まずはkubectlのバイナリをインストールします。kubectlのパスが通るようにするそして以下の設定ファイル作成用シェルスクリプトをgenerate-kubeconfig.shとして作成し、実行権限を与えて実行します。内容は、各コンポーネント用の証明書情報をkubeconfigに組み込み、kube-apiserverのアドレスを指定するというものです。kubeconfig作成した<hostname>.kubeconfigとkube-proxy.kubeconfigはそれぞれのホストにscpで送ります。etcdのデプロイ(Master)このステップはマスターノードのみで行います。etcdのバイナリをインストールしてパスが通るようにします。/usr/local/bin/etcd用の設定ファイルや証明書の配置を行うディレクトリを作成して配置します。これらのパスは後でsystemd用のユニットファイルを作成する際に指定します。/etc/etcd/etcdを動かすためのsystemd用のユニットファイルを作成します。ETCD_NAMEは、マスターノードが複数台ある場合に各マスターノードのetcdが同期するときに使用する名前です。私はmaster1としました。データディレクトリRestart=on-failureRestartSec=5Environment=ETCD_UNSUPPORTED_ARCH=arm64[Install]WantedBy=multi-user.targetEOFユニットファイルで記述されている各オプションについての説明や、その他オプションについてはetcd公式ドキュメントから確認できます。これをset-etcd.shとして作成し、実行権限を与え実行します。agokube-apiserverのデプロイ(Master)このステップもマスターノードのみで行います。kube-apiserverのバイナリをインストールしてパスが通るようにします。/usr/local/bin/次にetcdのデータを暗号化する機能のための設定ファイルを作成します。このステップは必須ではありませんが、必須レベルなので行います。後退プロバイダとしてidentityを指定EOFkube-apiserver用の設定ファイルや証明書の配置を行うディレクトリを作成して配置します。これらのパスは後でsystemd用のユニットファイルで指定します。-aiオプションについては、証明書ファイルの様々な情報を保持しながらコピーするために使用します。/var/lib/kubernetes/kube-apiserverをデーモンとして動かすためのユニットファイルを作成し、起動します。kube-apiserverkube-apiserverの実行オプションについてはこちらの公式ドキュメントから確認できますhttps://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/kube-controller-managerのデプロイ(Master)これもマスターノードのみで行います。kube-controller-managerのバイナリをインストールしてパスが通るようにします。/var/lib/kubernetes/kube-controller-managerをデーモンとして動かすためのユニットファイルを作成し、起動します。cluster_ip_networkに10.32.0.0/24を指定しました。kube-controller-managerkube-controller-managerについてのオプションについてはこちらの公式ドキュメントから確認できます。https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/kube-schedulerのデプロイ(Master)これもマスターノードのみで行います。kube-schedulerのバイナリをインストールしてパスが通るようにします。/usr/local/bin/kubeconfigの配置を行います。/var/lib/kubernetes/kube-schedulerをデーモンとして動かすためのユニットファイルを作成し、起動します。kube-schedulerkube-schedulerの実行オプションについてはこちらの公式ドキュメントから確認できます。etcd)が動いているかを確認します。okもし動いていない場合は、journalctl等のコマンドを実行し、エラーになっている箇所などを調べます。バージョンの変化により撤廃されたオプションをユニットファイルやconfigファイルで指定しているなどがエラーの原因になります。Node構築の前準備(Node)これからはワーカーノードで作業を行っていきます。Subsystemを有効化します。デフォルトでは無効化されているので有効にする必要があります。vim等を使用し、/boot/firmware/cmdline.txtに下記を追記して再起動します。cgroup_enable=memoryKubernetesの内部で使われているパッケージをインストールします。ipsetkubeletのデプロイ(Node)kubelet用の設定ファイルや証明書の配置を行うディレクトリを作成して配置します。これらのパスは後でsystemd用のユニットファイルで指定します。kubeletをインストールします。cniプラグインにはflannelやcalicoではなく、最低限の機能を持ったプラグインを使用します。wayに従っています。worker2であれば10.10.2.0/24を指定するものです。ロギングの詳細度レベルRestart=on-failureRestartSec=5[Install]WantedBy=multi-user.targetEOFkubeletのconfigurationについては以下の公式ドキュメントから確認できます。https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/kubeletの実行オプションについては以下の公式ドキュメントから確認できます。https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/kube-proxyのデプロイ(Node)kube-proxyのバイナリをインストールします。/usr/local/bin/kube-proxy用の設定ファイルや証明書の配置を行うディレクトリを作成して配置します。/var/lib/kube-proxy/kubeconfigkube-proxyをデーモンとして動かすためのユニットファイルを作成し、起動します。失敗時に再起動RestartSec=5[Install]WantedBy=multi-user.targetEOFkube-proxyのconfigurationについては以下の公式ドキュメントから確認できます。https://kubernetes.io/docs/reference/config-api/kube-proxy-config.v1alpha1/kube-proxyの実行オプションについては以下の公式ドキュメントから確認できます。今回はiptablesを利用したPodネットワークであるため、Nodeは自身以外のPodネットワークを知りません。そこで他のNodeへのルーティング情報を与えてあげます。v1.29.0このようになったら、各ノードがkubernetesクラスタに参加できているということになります。nginxのデプロイチェックPodが起動できることを確認します。試しにnginxをデプロイしてみます。admin.kubeconfig実際にアクセスできるかを確認しますServiceリソースのNodePortをデプロイして、外部に公開できるようにします。33sこのように出力されたら、curlでアクセスしてみます。http://192.168.0.7:32105これでhtmlが取得できていれば成功です。これで最低限のKubernetesクラスタを構築することができました。最後にKubernetesクラスタを構築することはできましたでしょうか。日本語も参考にしてみてください。本記事を読んで頂きありがとうございました。!今私が直面している問題として、CoreDNSをデプロイしても、そのClusterIPを解決できないというものがあります。Kubernetesの学習においてCNIプラグイン、kube-proxyの動作を理解することは重要であると感じるため、きちんと学んでから追記したいと思っています。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。