Skip to content

kubernetesのセットアップ

Posted on:August 25, 2023 at 12:10 PM

kubernetesのセットアップ

インフラ構成

ハードウェア

ネットワーク構成

ホストOSの基本設定

hostsの設定

各ノードで設定しておく

192.168.5.12 control-plane1 # コントロールプレーン
192.168.5.11 worker2
192.168.5.10 worker1

ファイアウォールの設定

性善説

ネットワークモジュール設定

次のコマンドを実行して、カーネル モジュール \overlay\ および \br_netfilter\ を有効にします。

modprobe overlay
modprobe br_netfilter
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
cat <<EOF | 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

永続化

sysctl --system

スワップ無効化

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff -a
free -m #確認

ただ、上記の設定をしてもrebootした時に復活することがある。

その場合は以下を参照するといい.

さくらのクラウドUbuntu 20.04でスワップ領域を無効化する手順 - Qiita
概要 さくらのクラウドのパブリックアーカイブ「Ubuntu 20.04」で、スワップ領域を無効化する手順です。 解説 スワップ領域を無効化するには、コマンド sudo swapoff -a を実行します。しかし、このコマンド実行は、一時的な対処です。 サーバ再起動後もス...
さくらのクラウドUbuntu 20.04でスワップ領域を無効化する手順 - Qiita favicon https://qiita.com/zembutsu/items/2d8a7f5caa4885d08591
さくらのクラウドUbuntu 20.04でスワップ領域を無効化する手順 - Qiita

containerdインストール

aptで入れるのが丸い

apt install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install containerd.io

参考: https://docs.docker.com/engine/install/ubuntu/

Systemd cgroupドライバを有効化

ubuntu 22.04ではcontainerdのランタイムでsystemd cgroupドライバを有効化することを推奨されている

インストールが完了したら、次のコマンドを実行して containerd サービスを停止。

systemctl stop containerd

containerdのコンフィグファイルを生成、編集

containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml

以下のSystemdCgroup = falsetrueにする。出現箇所はcontainerd v1.7.3時点で1箇所

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
-    SystemdCgroup = false
+    SystemdCgroup = true

修正完了したら起動

systemctl start containerd

確認し、activeならおk

systemctl status containerd

kubeadmのインストール

apt install apt-transport-https ca-certificates curl -y
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

kubernetesのパッケージ群をインストールし、バージョン固定

apt update
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

クラスターの初期化

kubeadm initコマンドを利用し、control-plane1上でkubernetesクラスタを初期化する

 kubeadm init --service-cidr=10.2.0.0/16  --pod-network-cidr=10.1.0.0/16 --cri-socket=unix:///run/containerd/containerd.sock --apiserver-advertise-address=192.168.5.12

https://www.infraexpert.com/study/ip5.html によるとprivate ipは10系が幅を取りやすいので、pod, serviceのネットワークは10.1・10.2系の/16とした。

うまくいくと他のノードがクラスタにjoinするためのコマンドが表示される。

kubeadm join 192.168.5.12:6443 --token <token> \
        --discovery-token-ca-cert-hash sha256:<hash>

他のワーカーノードを参加させる

worker1, worker2ノードで実行する。

root@worker1 $ kubeadm join 192.168.5.12:6443 --token <token> \
        --discovery-token-ca-cert-hash sha256:<hash>
root@worker2 $ kubeadm join 192.168.5.12:6443 --token <token> \
        --discovery-token-ca-cert-hash sha256:<hash>

ネットワーク環境の構築

ここからユーザー権限に戻る。

以下のユーザーレベルでもクラスタに繋げるようにするコマンドを実行する。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

calicoのインストール

ここからはどこでもいいのでkubectlが叩けるところで行う。

まずtigera-operatorをインストール

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

次にcalicoをインストールするための設定ファイルをダウンロードする

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml -O

vimかなんかで弄る

vim custom-resources.yaml

以下のようにする

cidrはkubeadm initで設定したpod-cidrの値を設定

nodeAddressAutodetectionV4はほっといてもよしなにやってくれるが、一応こっちでLAN networkを指定しておく

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.1.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
    nodeAddressAutodetectionV4:
      cidrs:
        - "192.168.5.0/24"
---

# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}

クラスタに適用

kubectl create -f custom-resources.yaml

確認する

watch kubectl get pods -n calico-system

こういうのが出てたらおk

NAMESPACE     NAME                READY   STATUS                  RESTARTS         AGE
kube-system   calico-node-txngh   1/1     Running                   0              54s
Policy	IPAM	CNI	Overlay	Routing	Datastore

MetalLB

インストール

このあとistioでメッシュ構築をしますが、そのLoadBalancerを外部公開するために必要

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml

公開するIPに応じて中身を編集

adressesをLoadBalancerで外部公開するためのIPレンジにする

自分の場合は10.0.0.3を外部との接続に使いたい

kubectl apply -n metallb-system -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.0.0.3/32
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default-advertisement
  namespace: metallb-system
EOF

Istioのインストール

istioctlのインストール

curl -L https://istio.io/downloadIstio | sh -

istioのクラスタへのインストール

istioctl install --set profile=demo -y
 Istio core installed
 Istiod installed
 Egress gateways installed
 Ingress gateways installed
 Installation complete
kubectl label namespace default istio-injection=enabled
namespace/default labeled

これで一通りの設定が完了