Ubuntu 20.04LTSにkubernetes環境をkubeadmで構築する手順

2020年8月15日kubernetes

kubernetesの学習用に環境構築した際の構築手順メモです。

環境

今回構築する各ソフトのバージョン

ソフトバージョン
OSUbuntu 20.04LTS
Docker19.03.12
kubernetes1.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にkuberntesが対応していない場合

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)のインストール要件を確認すると色々と書いてあります。

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

kubernetes

Posted by snow