kubeadmでkubernetesクラスターの自作
概要
勉強としてミニ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. ワーカーノードの起動
- ワーカーノードを立ち上げた時に出力された下記コマンドを実行します。
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にして、ワーカーノード二つにデプロイされるか確認します。
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