Kubernetesを生やす (containerd)

aki

Kubernetesを生やす (containerd)

久々にやってみたくなったので

環境

  • Ubuntu 22.04
  • Kubernetes 1.28.2
  • Cilium 1.15.0

ネットワーク

hostname ip
k8s-master 192.168.1.80
k8s-worker01 192.168.1.81
  • コンテナは10.200.0.0/16とする

構築

更新する

メモ

すべてのNodeで実行する必要があります。

1
sudo apt update && sudo apt upgrade -y

swapをしばく

メモ

すべてのNodeで実行する必要があります。

1
sudo swapoff -a

これは一時的なので/etc/fstabにあるswapファイルをコメントアウトして永続化する

1
sudo nano /etc/fstab
1
2
- /swap.img      none    swap    sw      0       0
+ #/swap.img      none    swap    sw      0       0

ipフォワーディングの有効化

メモ

すべてのNodeで実行する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# カーネルモジュール
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

確認する

メモ

すべてのNodeで実行する必要があります。

  • カーネルモジュール
1
2
lsmod | grep br_netfilter
lsmod | grep overlay
1
2
3
br_netfilter           32768  0
bridge                413696  1 br_netfilter
overlay               196608  18

3つの出力があることを確認する

  • カーネルパラメーター
1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
1
2
3
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

すべて1なことを確認する

  • swapの無効化
1
free -h
1
2
3
               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       912Mi       4.2Gi       6.0Mi       2.6Gi       6.6Gi
Swap:             0B          0B          0B

swapの行がすべて0なことを確認する

containerdを準備する

メモ

すべてのNodeで実行する必要があります。

なんか公式リポジトリのほうがdockerのリポジトリより新しいですが、今回はdockerリポジトリを使います。それで動いちゃったんだもん

  • インストール
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 鍵
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# リポジトリ
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
1
sudo apt install -y containerd.io
  • コンフィグを生成して編集
1
2
3
4
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.k8s.io/pause:3.9"#g' /etc/containerd/config.toml
sudo systemctl restart containerd && systemctl status containerd

警告

絶対にsystemd_cgroupを有効化しないこと!

このエラーが出て進まなくなります。

1
2
3
4
5
6
7
[init] Using Kubernetes version: v1.26.1
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2023-02-04T07:30:18Z" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

消えてしまったのでエラー文は引用 https://qiita.com/Kigou-No1/items/8fe68c826dc3dbe76fb4

kube* を準備する

メモ

すべてのNodeで実行する必要があります。

1
2
3
4
5
# 鍵
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# リポジトリ
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
sudo apt-get update
1
sudo apt-get install -y kubeadm kubectl kubelet

自動的に更新されると厄介なのでcontainerdごとholdしておきます

1
sudo apt-mark hold kubeadm kubectl kubelet containerd.io

コントロールプレーンを生やす

メモ

CPで実行する必要があります。

ここまで来たらやっと本体を作れます。昔masterって呼ばれてたやつですね。 ここでは長ったらしいので、contro planeの頭文字を取ってCPと呼ぶことにします。

1
sudo kubeadm init --apiserver-advertise-address=192.168.1.80 --pod-network-cidr=10.200.0.0/16 --upload-certs

workerを生やす

メモ

Workerで実行する必要があります。

好きなだけ生やしてください。 initしたときに出てきた下みたいなコマンドを実行するだけです。

1
2
sudo kubeadm join 192.168.1.80:6443 --token {token} \ 
    --discovery-token-ca-cert-hash sha256:{hash}

Ciliumをインストールする

メモ

CPで実行する必要があります。

cliをインストール

1
2
3
4
5
6
7
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

インストール

注意

メモ

clangとllvmのインストールはすべてのNodeで実行する必要があります。

clangを入れておくこと!

無限にNotReadyで待つことになります。

1
sudo apt install -y clang
1
cilium install --version 1.15.0

環境構築ができたか確認する

1
kubectl get nodes
1
2
3
NAME           STATUS   ROLES           AGE   VERSION
k8s-master     Ready    control-plane   14h   v1.28.2
k8s-worker01   Ready    <none>          14h   v1.28.2
1
cilium status
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    /¯¯\
 /¯¯\__/¯¯\    Cilium:             OK
 \__/¯¯\__/    Operator:           OK
 /¯¯\__/¯¯\    Envoy DaemonSet:    disabled (using embedded mode)
 \__/¯¯\__/    Hubble Relay:       disabled
    \__/       ClusterMesh:        disabled

Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet              cilium             Desired: 2, Ready: 2/2, Available: 2/2
Containers:            cilium-operator    Running: 1
                       cilium             Running: 2
Cluster Pods:          2/2 managed by Cilium
Helm chart version:    1.14.6
Image versions         cilium             quay.io/cilium/cilium:v1.14.6@sha256:37a49f1abb333279a9b802ee8a21c61cde9dd9138b5ac55f77bdfca733ba852a: 2
                       cilium-operator    quay.io/cilium/operator-generic:v1.14.6@sha256:2f0bf8fb8362c7379f3bf95036b90ad5b67378ed05cd8eb0410c1afc13423848: 1

最後に

久々にやってみたけど、すごい手順が多くて大変だった。

自分の作ったk8sの中では多分一番まともだと思う

この後にストレージセットアップ()の必要があったり、まだやることがある・・・

参照文献

おまけ

ダッシュボードを動かす

1
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
  • dashboard-adminuser.yamlを作り、以下の内容を記載
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# from https://qiita.com/itoi10/items/e5b7d1ca2a588108d4b2
# Creating a Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
# Creating a ClusterRoleBinding (管理者権限を付与)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
  • トークンを取得する
1
kubectl -n kubernetes-dashboard create token admin-user
  • 開きたいマシンでkubectlをセットアップして以下コマンドでproxy
1
kubectl proxy

コンテナ外の同じセグメントからアクセスできるように

  • 以下のコマンドでコンフィグ編集を開始する
1
kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard

CiliumのHubbleを有効化

この画像のようなものが見れます

構成図的なやつ

  • 有効化
1
cilium hubble enable --ui
  • 開きたいマシンで以下のコマンドを実行する
1
cilium hubble ui

ヒント

windowsの場合は以下のコマンドでcliをインストール

1
winget install Cilium.CiliumCLI

kubectlが動くようにセットアップしておく必要があります

Built with Hugo
テーマ StackJimmy によって設計されています。