💡

kubeadmでkubernetesクラスターの自作

2024/01/30に公開

概要

勉強としてミニPC3台でkubernetesクラスターを構築します。メモ代わりに記事書くので雑ですみません。

構成

物理的なもので用意したのはミニPC3台とネットワークスイッチとWiFiルータです。

Kubernetesの構成はマスターノード1台とワーカーノード2台です。後々NASをアタッチしたり、マスターノードを冗長構成にしたいなと考えてます。

CNIはFlannelを選択しました。

手順

1. kubeadmのインストール

kubeadmなどのコマンドはkubernetesのドキュメントを参考にしインストールしました。

2. スワップ機能をOFFにする

まず全てのPCでスワップをオフにします。これをしないとノードのSTATUSがReadyになリません。

sudo swapoff -a

3. ワーカーノードの立ち上げ

ワーカーノードのコンソールに入り、下記コマンドを実施します。注意点としてはpod-network-cidrを指定してあげる必要があるとこです。CNIがFlannelを選択している場合これが必要で指定してあげる必要があります。アドレスはプライベートアドレスで他のネットワークとかぶらなければどれでも問題ないと思います。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

下記のようなログが出力されたら起動成功です。

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.2:6443 --token XXXXXXXX: \
	--discovery-token-ca-cert-hash sha256:YYYYYYY 

特権ユーザーじゃなくてもkubectlを実行できるように下記のコマンドを実行します。

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

4. Flannelのapply

flannelのYAMLをダウンロードします。

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

ダウンロードできたら下記の部分だけkubeadm init時に指定したpod-network-cidrに変えます。デフォルト値は10.244.0.0/16です。

  net-conf.json: |
    {
      "Network": "10.244.0.0/16", //ここ
      "Backend": {
        "Type": "vxlan"
      }
    }

5. ワーカーノードの起動

  1. ワーカーノードを立ち上げた時に出力された下記コマンドを実行します。
kubeadm join 192.168.1.2:6443 --token XXXXXXXX: \
   --discovery-token-ca-cert-hash sha256:YYYYYYY 

下記ログが出力されたらワーカーノード起動成功です。

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

6. 動作確認

マスターノードに入り、動作確認をしていきます。まずノードが起動されてるかを確認します。

k8s@ubuntu-lion:~/k8s$ kubectl get node
NAME          STATUS   ROLES           AGE   VERSION
ubuntu-cat    Ready    <none>          17h   v1.28.2
ubuntu-dog    Ready    <none>          17h   v1.28.2
ubuntu-lion   Ready    control-plane   17h   v1.28.2

全てのノードでSTATUSがReadyになっているので問題なさそうです。
次にpodがちゃんと起動できるか確認します。nginxを起動するマニフェストファイルを作成します。replicasは2にして、ワーカーノード二つにデプロイされるか確認します。

nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  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

podが起動できてるか確認します。

kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
nginx-deployment-7c79c4bf97-nkbb5   1/1     Running   0          85s   10.244.2.78   ubuntu-cat   <none>           <none>
nginx-deployment-7c79c4bf97-r5lrc   1/1     Running   0          85s   10.244.1.55   ubuntu-dog   <none>           <none>

podが二つ起動し、STATUSがReadyになっているので無事に起動できてそうです。試しにcurlしてみたいと思います。出力されてるIP Adrressを指定しcurlします。

kei@ubuntu-lion:~/k8s$ curl 10.244.2.78
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

nginxのデフォルトの画面が出力がされたら成功です。無事にkuberntesクラスターを起動できました!

今後

無事にkubernetesクラスターを起動できたのでこのクラスターでいろんなことを試していきたいと思います。ダッシュボード作成したり、NASを接続したり、ラズパイを使って自宅環境のセンシングしてデータを溜めたりと色々考えてます。これらを実施したらまた記事にしたいと思います。

Discussion