システム要件
SW | Version |
---|---|
Ubuntu Server | 22.04 |
kubectl | 1.27.3 |
kubeadm | 1.27.3 |
containerd(CRI) | 1.6.8 |
Calico(CNI) | 3.25.1 |
HW | Spec | Count |
---|---|---|
CPU | 16 core | 2 |
RAM | 32 GB | 1 |
Storage | 128 GB | 1 |
事前準備
- apt パッケージリストを更新
sudo apt update
- swap を無効化
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
処理されていない場合は以下の該当行をコメントアウト
sudo vi /etc/fstab
# /swap.img none swap sw 0 0
- containerd 用のカーネルモジュールをシステムに反映
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
- Kubernetes 用のカーネルパラメータを設定
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
- カーネルパラメータの設定を反映
sudo sysctl --system
containerd(Container Runtime Interface)をインストール
- apt パッケージをインストール & リポジトリを追加
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y containerd.io
バージョンを指定してインストールする場合
sudo apt install -y containerd.io=1.6.8-1
- containerd 用の設定を作成
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
- cgroup の管理を systemd に委譲する設定を追加
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
- containerd サービスの自動起動を有効化
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd.service
Kubernetes をインストール
- apt パッケージをインストール & リポジトリを追加
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
2023年09月からリポジトリが変更されているため以下を確認
/etc/apt/sources.list
に以下のリポジトリが定義されている
deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main
リポジトリ変更後にインストールする場合
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
/etc/apt/sources.list.d
配下にxx_kubernetes_io_-jammy.list
のようなファイルが存在し、以下のリポジトリが定義されている
deb http://apt.kubernetes.io/ kubernetes-xenial main
pkgs.k8s.io
に変更する必要がある可能性有り
Kubernetes.io - Kubernetes Legacy Package Repositories Will Be Frozen On September 13, 2023
Kubernetes クラスターを構築
- クラスターを初期化
sudo kubeadm init --control-plane-endpoint=<192.168.xx.xx>:6443 --pod-network-cidr=10.0.0.0/16 --upload-certs
- Kubeadm/Kubectl コマンドの設定を有効化
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- コマンドを確認
kubectl get pod,svc -A -o wide
kubectl cluster-info
kubectl get nodes
- クラスターネットワークの設定
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml
sudo vi calico.yaml
- name: IP
value: "autodetect"
+ - name: IP_AUTODETECTION_METHOD
+ value: "cidr=192.168.xx.0/24"
- # - name: CALICO_IPV4POOL_CIDR
- # value: "192.168.0.0/16"
+ - name: CALICO_IPV4POOL_CIDR
+ value: "10.0.0.0/16"
- ネットワーク設定をクラスターに適用
kubectl apply -f calico.yaml
- クラスターの状態を確認
kubectl get pod,svc -A -o wide
kubectl get pods -n kube-system
- ワーカーノードを追加(
ワーカーノードで実行
)
sudo kubeadm join 192.168.xx.xx:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
- crictl のエンドポイントを containerd に変更
sudo vi /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
- crictl コマンドが実行できることを確認
sudo crictl images
動作確認
- Nginx 用の Pod / Container を作成
kubectl create deployment nginx-app --image=nginx --replicas=2
kubectl get pod,svc -A -o wide
kubectl expose deployment nginx-app --type=NodePort --port=80
kubectl get svc nginx-app
kubectl describe svc nginx-app
curl http://192.168.xx.xx:32631
その他
まず、--control-plane オプションは、追加するノードをコントロールプレーンノード(マスターノード)としてクラスターに参加させる場合に使用します。
通常、kubeadm join コマンドを使用してノードを追加する場合、そのノードはワーカーノード(コントロールプレーンコンポーネントを持たないノード)として追加されます。
しかし、--control-plane オプションを指定することで、そのノードはコントロールプレーンノード
(APIサーバー、コントローラーマネージャー、スケジューラーなどのコントロールプレーンコンポーネントを持つノード)としてクラスターに参加します。
一方、--certificate-key オプションは、kubeadm init または kubeadm init phase upload-certs --upload-certs コマンドの実行結果として表示される秘密鍵を指定します。
このキーは、追加のコントロールプレーンノードがクラスターに参加する際に、既存のコントロールプレーンノードから必要な証明書を安全にコピーするために使用されます。
したがって、--control-plane --certificate-key を付与して kubeadm join コマンドを実行する場合、
そのノードはコントロールプレーンノードとしてクラスターに追加され、--certificate-key で指定した秘密鍵を使用して、既存のコントロールプレーンノードから必要な証明書をコピーします。
これに対して、これらのオプションを付与せずに kubeadm join コマンドを実行する場合、そのノードはワーカーノードとしてクラスターに追加されます。
-
シングルノード運用を行う場合はコントロールプレーンノードの taint を無効化
bash kubectl taint nodes <node_name> node-role.kubernetes.io/control-plane:NoSchedule-
-
コントロールプレーンノードの kubelet によって使用される cgroup ドライバーの設定
bash sudo vi /etc/default/kubelet
/etc/default/kubelet KUBELET_EXTRA_ARGS=--cgroup-driver=<value>
bash systemctl daemon-reload systemctl restart kubelet