🙆‍♀️

我流お家クラウドを構築する【1】~kubernetesをセットアップする~

2023/08/01に公開

お家クラウド皆さん作ってますか?
多分作ってると思いますが、n番煎じで自分も作ろうと思います。
大まかにやりたいこととしては
GithubActions からharborにイメージをプッシュとマニフェストの変更をして、ArgoCDが差分を検知したらクラスタに同期するような流れを作りたいな(いわゆるGitops?)

今回はその1,kubernetesを自宅のサーバにインストールするところからやってきます。

Kubernetesをインストールする

公式ページに乗ってるやり方そのままで行きます。

マシンについて

まずはいくつかのマシンを用意します。今回は試験的というのもあり、Master:1 worker:2で行きます。
スペックは以下の通り,

name spec
CPU 4core
MEM 8192MB
SSD 100GB
OS ubuntu-server 22.04.2

IP アドレスの割り当ては
Master : 10.10.10.30/8
Worker1: 10.10.10.31/8
Worker2: 10.10.10.32/8
とでもしておきます。(試験的なので適当で)

下準備

まずすべてのマシンをセットアップ出来たら、ササっと更新かけておきます。

全てのnode
sudo apt update && sudo apt -y upgrade

それができたらIPv4のフォワーディングを有効化します。

すべてのノード
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# この構成に必要なカーネルパラメーター、再起動しても値は永続します
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 再起動せずにカーネルパラメーターを適用
sudo sysctl --system

一応、以下のコマンドを実行してbr_netfilterとoverlayが読み込まれているかを確認してください

すべてのノード
lsmod | grep br_netfilter
lsmod | grep overlay

多分読み込まれてたらなんか出ると思います。
次に以下のコマンドを確認して、net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables、net.ipv4.ip_forward のカーネルパラメータが1なことを確認してください。

すべてのノード
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

swapの無効化

kubernetesではswapの無効化が推奨されているので無効化しときます

すべてのノード
sudo swapoff -a
sudo nano /etc/fstab #<- /swap.imgをコメントアウトしてください。
/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-KFhiYOFLCNX2zPCaUpRdvIVa6kz11UQxmuzjWwGT1JIPzqoyQr61vEmF2S6HMZ1K / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/5307d1a9-abf2-4d8b-ad4a-0d6190a47c36 /boot ext4 defaults 0 1
- /swap.img      none    swap    sw      0       0
+ # /swap.img      none    swap    sw      0       0

以下のコマンドを確認することでswapが0になってることが確認できます。

free -h

kubeadm,kubelet,kubectlインストール

kubeadmのインストール | Kubernetes

すべてのノード
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

#Google Cloudの公開鍵DL
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

#kubernetesのリポジトリをaptリポジトリに追加する
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

#aptのパッケージ一覧を更新してkubelet、kubeadm、kubectlをインストールする。
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 勝手に更新されないように固定する
sudo apt-mark hold kubelet kubeadm kubectl

CRI-Oのインストール

CRI-Oのインストール|github

なんそれ?

CRI-Oとは、コンテナ型仮想化で使われる技術の1つで、Kubernetesとコンテナランタイムが通信するための仕様として規定されているCRI(Container Runtime Interface)と、OCI Runtime Specificationに基づいて作られたKubernetesやDockerの高レベルなランタイム。

らしいです。つまるところ通信するためのやつらしいです。
詳しくはこちらを参考に、

CRI-Oとは?

導入

すべてのノード
sudo su

# https://cri-o.github.io/cri-o/
export VERSION=1.27
# https://github.com/cri-o/cri-o/blob/main/install.md#apt-based-operating-systems
export OS=xUbuntu_22.04

echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb [signed-by=/usr/share/keyrings/libcontainers-crio-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

mkdir -p /usr/share/keyrings
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-crio-archive-keyring.gpg

apt-get update
apt-get install cri-o cri-o-runc
# 初期生成されたcniを消す
rm -rf /etc/cni/net.d/*

# インストールしたCRI-Oを起動する
sudo systemctl daemon-reload
sudo systemctl enable crio
sudo systemctl start crio

正常に起動してるかを確認する。RuntimeReadyの項目がtrueであればOK

すべてのノード
crictl info

{
  "status": {
    "conditions": [
      {
        "type": "RuntimeReady",
        "status": true,
        "reason": "",
        "message": ""
      },
      {
        "type": "NetworkReady",
        "status": true,
        "reason": "",
        "message": ""
      }
    ]
  },
  "config": {
    "sandboxImage": "registry.k8s.io/pause:3.9"
  }
}

こんな感じの出力になるはず。

ホスト名を確認する

クラスタ内でホスト名が同一だとエラーになるので、全部変えておきましょう

すべてのノード
sudo hostnamectl hostname your-hostname

全てが終わったら一旦再起動する

クラスタの作成

マスタノード
sudo kubeadm init --apiserver-advertise-address=10.10.10.30 --pod-network-cidr=10.101.0.0/16
# --apiserver-advertise-address= にマスタノードのアドレスを
# --pod-network-cidr=             にはポッドネットワークのCIDRを

クラスタの作成に完了すると、

kubeadm join 10.10.10.30:6443 --token xxxx \
        --discovery-token-ca-cert-hash sha256:xxxx

が出力されるのでメモっとく
作ったクラスタをkubectlで接続するためにconfigファイルを設定する

マスタノード
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

クラスタの参加

先ほどメモったコマンドをそれぞれのノードで実行する

ワーカーノード
kubeadm join 10.10.10.30:6443 --token xxxx \
        --discovery-token-ca-cert-hash sha256:xxxx

参加できたなぁと思ったら

マスタノード
kubectl get node

を実行すると参加してるノードが確認できる

Pod間通信を管理するCNIをインストールする

Calicoをインストールする
Calicoオペレータの追加をする

マスタノード
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

設定用のファイルをDLする

マスタノード
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml -O
custom-resources.yaml
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.101.0.0/16 # ここの値を--pod-network-cidr=で設定した値に設定する

コンテナを生成する

マスタノード
kubectl create -f custom-resources.yaml
#コンテナが生成されるまで待つ
watch kubectl get -A all

これで一応終わりました。

最後に

kubernetesの構築やったことがなかったですが、実際うまくできるまで、3日くらい苦戦しました。
間違ってたことがあったら教えてください。

次回はArgoCDをセットアップします。
それでは✋

Discussion