ヒトリ歩き

愚痴とかいろいろ書きます

VM環境でのKubernetesインストール

Kubernetesをインストールできる人が社内でほとんどいないようなので、自分もインストール出来る人には なっておきたいなと思い、自宅の環境でインストールを実施してみた。 インストールは以下のサイトを参考に実施する。

infotechys.com

Kubernetesのバージョンは、1.29.6がインストールされる。 1.30.2が最新だが最新が入らなかった。原因までは調べてない。

インストール環境

インストール環境は、VMを3台用意する。 OSは、RockyLinux9を使用する。

/etc/hostsは以下のようにする。

192.168.56.10  master
192.168.56.11  worker1
192.168.56.12  worker2

1. 各ノードのセットアップ

1-1. ユーザの作成

Kubernetesを操作するためのユーザを作成する。 作成したユーザは、sudo を実行できるようにしておく。 ここは、rootユーザで実施する。

useradd kubeuser
vi /etc/sudoers.d/kubeuser

以下を記入して保存
%kubeuser ALL=(ALL) NOPASSWD: ALL

1-2. Kernelモジュールの追加

ここからは、kubeuserで操作する。 kernelモジュールをロードしておく。

sudo modprobe br_netfilter
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe overlay

rootユーザにスイッチして、kubernetes.confを作成する。

sudo su -
cat > /etc/modules-load.d/kubernetes.conf << EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
overlay
EOF

1-3. sysctlの設定

カーネルパラメータの更新する。

カーネルパラメータ 説明
net.bridge.bridge-nf-call-iptables ブリッジでのIPv4トラフィックの通過をiptablesで許可する。
net.bridge.bridge-nf-call-ip6tables ブリッジでのIPv6トラフィックの通過をiptablesで許可する。
net.ipv4.ip_forward IPv4パケットのフォワードを許可する。
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system
exit

1-4. Swapの無効化

sudo swapoff -a
sudo sed -e '/swap/s/^/#/g' -i /etc/fstab
cat /etc/fstab | grep swap

#/swapfile none swap defaults 0 0   // ここがコメントアウト

1-5. Containerdのインストール

sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf makecache
sudo dnf -y install containerd.io
sudo sh -c "containerd config default > /etc/containerd/config.toml" ; cat /etc/containerd/config.toml

/etc/containerd/config.toml の SystemdCgroupをfalseからtrueに変更する。

sudo vi /etc/containerd/config.toml
sudo systemctl enable --now containerd.service
sudo systemctl reboot

containerd.serviceが起動していることを確認する。

sudo systemctl status containerd.service
● containerd.service - containerd container runtime
     Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-06-23 12:38:51 UTC; 10s ago
       Docs: https://containerd.io
    Process: 724 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
   Main PID: 728 (containerd)
      Tasks: 9
     Memory: 57.0M
        CPU: 464ms
     CGroup: /system.slice/containerd.service
             └─728 /usr/bin/containerd

1-6. firewalldの有効化と設定

firewalldの有効化と設定をする。

port 使用箇所
6443 k8s API Server
2379-2380 etcd server client API
10250 Kubelet API
10251 Kube-scheduler
10252 kube-controller-manager
10255 Read-only Kubelet API
5473 ClusterControlPaneConfig API
sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo firewall-cmd --zone=public --permanent --add-port=6443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10250/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10251/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10252/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10255/tcp
sudo firewall-cmd --zone=public --permanent --add-port=5473/tcp
sudo firewall-cmd --reload

1-7. Kubernetes Componentsのインストール

ここはrootユーザで実施する。

sudo su -
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
dnf makecache
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet.service
exit

2. Masterノードのセットアップ

2-1. KubernetesのControl Planeの初期化

sudo kubeadm config images pull

何も設定していないと、eth0のIPアドレスの方法を参照するみたい。 eth1のIPアドレスを使って通信してほしいので、--apiserver-advertise-addressオプションを指定する。 また、--node-nameを使用して、ノード名を指定する。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.56.10 --node-name=master

# ・・・いっぱいメッセージでる
#
#
#
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Network Podをデプロイ

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
sudo dnf install -y wget
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
sed -i 's/cidr: 192\.168\.0\.0\/16/cidr: 10.244.0.0\/16/g' custom-resources.yaml
kubectl create -f custom-resources.yaml

2-2. MetalLBの設定

LoadBalancerでサービスを公開したいので、オンプレミスでも type: LoadBalancer を扱えるようにするために MetalLBをインストールする。

metallb.universe.tf

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
kubectl edit deploy controller -n metallb-system

# nodeNameを追加し、masterノード名を設定。
        - mountPath: /tmp/k8s-webhook-server/serving-certs
          name: cert
          readOnly: true
      dnsPolicy: ClusterFirst
      nodeName: master
      nodeSelector:
        kubernetes.io/os: linux
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system
vi metallb-config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ippool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.56.10-192.168.56.12
  autoAssign: true
kubectl apply -f metallb-config.yaml 

# 出力結果
ipaddresspool.metallb.io/ippool created

もし、kubectl apply -f metallb-config.yamlでエラーが発生したら、再度下記のコマンドを実行後に kubectl apply -f metallb-config.yamlを実行する。

kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

3. Workerノードのセットアップ

各ノードのセットアップ 手順である 1-1. 〜 1-7. までを実施する。

3-1. Masterノード上でWorkerノードを登録するためのコマンドを発行する

sudo kubeadm token create --print-join-command

3-2. Workerノードの追加

Workerノード上でMasterノードに登録するためのコマンドを実行する。 --node-nameオプションをつけて実行する。

# worker1ノード
sudo kubeadm join 192.168.56.10:6443 --token vhgrvy.86d31ak3lph4tgqq --discovery-token-ca-cert-hash sha256:f8fe2fae9391989cfa6f53a23473320291547702cfa9c816d7559d39e56bc753 --node-name=worker1

# worker2ノード
sudo kubeadm join 192.168.56.10:6443 --token vhgrvy.86d31ak3lph4tgqq --discovery-token-ca-cert-hash sha256:f8fe2fae9391989cfa6f53a23473320291547702cfa9c816d7559d39e56bc753  --node-name=worker2

3-3. Workerノードの追加確認

Masterノード上でWorkerノードが追加されたことを確認する。

kubectl get nodes

# 出力結果
NAME      STATUS     ROLES           AGE   VERSION
master    Ready      control-plane   9h    v1.29.6
worker1   NotReady   <none>          68s   v1.29.6
worker2   NotReady   <none>          56s   v1.29.6

4. Nginxのデプロイ

環境の確認のために、Nginxをデプロイしてみる。

4-1. deploymentの設定

確認のためにNginxをデプロイする nginx-deployment.yaml を作成する。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
kubectl apply -f nginx-deployment.yaml
kubectl get deployments

# 出力結果
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           3m40s

RunningになるまですぐにRunningになる場合もあれば、3分半ぐらいかかる場合があるので 繰り返し、kubectl get podsを実行して状態を確認する。

kubectl get pods

# 出力結果
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7c79c4bf97-hf798   1/1     Running   0          3m37s
nginx-deployment-7c79c4bf97-pbvs7   1/1     Running   0          3m37s
nginx-deployment-7c79c4bf97-tqx9f   1/1     Running   0          3m37s

4-2. サービスの設定

nginx-service.yamlを作成し、設定する。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

サービスを適用する。

kubectl apply -f nginx-service.yaml
kubectl get service nginx-service

# 出力結果
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
nginx-service   LoadBalancer   10.107.121.176   192.168.56.10   80:30269/TCP   6s

最後に

実際にインストールしてみると、出来ない部分があったけど何とか解決して、実環境にインストールすることが 出来た。 今回はVM環境を使ってみたが、VM環境ではなくオンプレミス環境だと、またどこかで詰まりそうな気もするが、 インストール出来たという経験は積めたので、次は実際に触って動かして、理解を深めていきたい。

参考

metallb.universe.tf

zenn.dev

ryusa.hatenablog.com