我流お家クラウドを構築する【1】~kubernetesをセットアップする~
お家クラウド皆さん作ってますか?
多分作ってると思いますが、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
とでもしておきます。(試験的なので適当で)
下準備
まずすべてのマシンをセットアップ出来たら、ササっと更新かけておきます。
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: 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インストール
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とは、コンテナ型仮想化で使われる技術の1つで、Kubernetesとコンテナランタイムが通信するための仕様として規定されているCRI(Container Runtime Interface)と、OCI Runtime Specificationに基づいて作られたKubernetesやDockerの高レベルなランタイム。
らしいです。つまるところ通信するためのやつらしいです。
詳しくはこちらを参考に、
導入
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
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