Ubuntu 20.04LTSにkubernetes環境をkubeadmで構築する手順
kubernetesの学習用に環境構築した際の構築手順メモです。
環境
今回構築する各ソフトのバージョン
ソフト | バージョン |
---|---|
OS | Ubuntu 20.04LTS |
Docker | 19.03.12 |
kubernetes | 1.18.6 |
OSのUbuntu 20.04LTSを準備する方法ですが、以下のどの方法でも大丈夫です。
- クラウド(AWSのEC2/GCPのGCE など)
- VirtualBox
- Windows+WSL2
- PC(ノート/デスクトップ)
私は古いノートPCにUbuntu20.04LTSをインストールしてサーバ代わりに利用していますので、今回はノートpCのUbuntu20.04LTSに構築する手順で説明します。
WSL2にUbuntuをインストールして利用する場合、Dockerを稼働させるためにちょっとしたコツが必要です。
WSL2で環境構築する場合は以下の記事を参考にして下さい。
Dockerをインストールする
Dockerの公式手順(Install Docker Engine on Ubuntu)に沿ってインストールしていきます。
dockerをインストールためにリポジトリ更新
$ sudo apt update
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
DockerのGPG Keyを追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
リポジトリ追加
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
docker-ceをインストール
$ sudo apt update
$ sudo apt install docker-ce
インストールが成功しているか確認
$ docker --version
Docker version 19.03.12, build 48a66213fe
Docker 19.03.12はkubeadmやkubernetesの1.18.6に対応してますが、最新バージョンのDockerではエラーになる場合があります。
その場合は、Dockerのバージョンを落として試して見ましょう。
利用ユーザに権限付与
dockerコマンドをsudoなしで実行できるように権限付与しておきます。
$ sudo usermod -aG docker $USER
kubernetes(kubeadm / kubelet / kubectl)をインストールする
kubeadmをインストールためにリポジトリ更新
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
kubeadm / kubelet / kubectlをインストール
$ sudo apt update
$ sudo apt install -y kubeadm kubelet kubectl
swapを無効にする
kubernetes(kubeadm)のインストール要件を確認すると色々と書いてあります。
- One or more machines running one of:
- Ubuntu 16.04+
- Debian 9+
- CentOS 7
- Red Hat Enterprise Linux (RHEL) 7
- Fedora 25+
- HypriotOS v1.0.1+
- Container Linux (tested with 1800.6.0)
- 2 GB or more of RAM per machine (any less will leave little room for your apps)
- 2 CPUs or more
- Full network connectivity between all machines in the cluster (public or private network is fine)
- Unique hostname, MAC address, and product_uuid for every node. See here for more details.
- Certain ports are open on your machines. See here for more details.
- Swap disabled. You MUST disable swap in order for the kubelet to work properly.
見落としがちなのが赤字のSwapを無効にする必要があることです。
以下のコマンドでswapを無効にします。
$ sudo swapoff -a
また、Windows10+WSL2で構築する場合は上記のコマンドではswapを無効にできません。
WSL2でswapを無効にする方法は以下の記事を参考にして下さい。
kubernetesのセットアップ
kubeadmのinitコマンドで環境構築
$ sudo kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16
ノード名を指定しない場合はマシン名となるため –node-name で master を指定しています。
以下のようなメッセージが表示されれば、initコマンドは成功です。
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
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.x.xx:6443 --token xxxxxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kubernetes clusterを利用する準備
initコマンドのメッセージ通りにコマンドを実行します。
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
flannelをインストール
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubernetesのnodeが準備できたか確認
STATUSがReadyとなっていればOKです。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 6d21h v1.18.6
masterノード(コントロールプレーンノード)にpodをデプロイできるようにする
kubectl taint nodes --all node-role.kubernetes.io/master-
以下のようなメッセージが表示されればOKです。
error: taint "node-role.kubernetes.io/master" not found
ノードを追加する
masterノード以外のノードを追加したい場合は、kubeadmのinitコマンドで表示されたメッセージの最後の方に表示されたコマンドを実行すると追加できます。
$ sudo kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
但し、デフォルトでは、トークンは24時間後に有効期限が切れます。もし現在のトークンの有効期限が切れた後にクラスターにノードを参加させたい場合は、次のコマンドを実行することで、新しいトークンを生成できます。
tokenの確認
$ kubeadm token list
何も表示されなければ有効期限が切れていますので、tokenを作成しましょう
tokenの作成
$ sudo kubeadm token create
–discovery-token-ca-cert-hashの表示
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
クライアント(他の端末)のkubectlから操作できるようにする
kubectlをインストール
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
$ sudo apt update
$ sudo apt install -y kubectl
サーバ側のkubectlのconfigファイルをそのままコピーする
~/.kube/config
サーバ側のファイアウォールを設定
kubernetes-clusterのポート番号を調べる
$ kubectl cluster-info
Kubernetes master is running at https://192.168.x.xx:6443
KubeDNS is running at https://192.168.x.xx:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
iptables で6443ポートを開放する。
簡単に設定できるufwを利用しています。
$ sudo ufw allow 6443
$ sudo ufw reload
その他、serviceでnodeportで外部からアクセスするためのポートなどを必要に応じて解放しましょう。
クライアント側からkubectlで確認
クライアントからkubectlコマンドを実行しサーバ側での実行結果と同じであれば無事成功です。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
xxxxx Ready master 3d1h v1.18.6