2018年8月27日月曜日

Ubuntu16.04 で Master ノード 1 台、Worker ノード 1 台の kubernetes クラスタを構築してみた

概要

過去に minikube を使った k8s の構築や lxd を使った k8s の構築を行いました
今回はもう少し進んで本格的な k8s クラスタを構築してみました
Master ノード 1 台、Worker ノード 1 台の構成です
なお使用する構築ツールは kubeadm になります

環境

  • Ubuntu 16.04
  • docker 18.06.1-ce
  • kubeadm, kubectl, kubelet v1.11.2

Master ノード構築

docker install

  • apt -y update
  • apt -y install apt-transport-https software-properties-common curl
  • curl -s https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
  • apt -y update
  • apt -y install docker-ce docker-ce-cli containerd.io

kubeadm, kubelet, kubectl install

  • curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
  • echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
  • apt -y update
  • apt-get install -y kubeadm kubelet kubectl

クラスタ初期化

  • swapoff -a
  • kubeadm init --apiserver-advertise-address=116.118.227.170 --pod-network-cidr=10.244.0.0/16

ここで表示される kubeadm join コマンドはメモしておきましょう
pod-network-cidr は flannel を使用するので指定が必須です

操作用のユーザ作成

  • adduser hawk
  • usermod -aG sudo hawk
  • su - hawk
  • mkdir -p $HOME/.kube
  • sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • sudo chown $(id -u):$(id -g) $HOME/.kube/config

flannel 構築

  • kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

操作用ユーザで行います

Worker ノード構築

docker install

  • apt -y update
  • apt -y install apt-transport-https software-properties-common curl
  • curl -s https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
  • apt -y update
  • apt -y install docker-ce docker-ce-cli containerd.io

kubeadm, kubelet, kubectl install

  • curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
  • echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
  • apt -y update
  • apt-get install -y kubeadm kubelet kubectl

クラスタ join

  • swapoff -a
  • hostnamectl set-hostname node1
  • kubeadm join 116.118.227.170:6443 --token p06lq6.17gtmq109vk7gxuf --discovery-token-ca-cert-hash sha256:97f82e93d768f0f3ca9494d8d1e3ee6bb5409b3d8e9a3e2b8c371bb57889a6e8

先程 kubeadm init 時にメモした join コマンドを使います
Master と同じホスト名だと join できないので変更します

動作確認

Master ノードに作成した操作用ユーザで行います

  • kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
node1     Ready     <none>    1m        v1.11.2
ubuntu    Ready     master    32m       v1.11.2

ついでにアプリも動かしてみます

  • kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
  • kubectl expose deployment hello-node --type=NodePort --port=8080

あとは kubectl get pod でコンテナが作成されたらアクセスすれば OK です
アクセス先は NodePort を使っているので、IP が Worker ノードのパブリック IP でポートが NodePort 用のポートです

  • kubectl describe service hello-node
Name:                     hello-node
Namespace:                default
Labels:                   app=hello-node
Annotations:              <none>
Selector:                 app=hello-node
Type:                     NodePort
IP Families:              <none>
IP:                       10.100.104.233
IPs:                      10.100.104.233
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32436/TCP
Endpoints:                192.168.1.3:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

192.168.1.3:8080 がアクセスポートになります

Tips

クラスタからノードを切り離す場合は以下でできます

  • kubeadm reset

全リソースを取得する

  • kubectl get all

トラブルシューティング

うまくクラスタに join できない場合は FW (ufw) の設定などを確認してみてください

swap に関して怒られた場合は上記の手順にあるように swapoff -a してみてください

running with swap on is not supported. Please disable swap

コンテナがうまく起動しない場合は

  • kubectl get pods
  • kubectl describe pod hello-node-546c7dcc87-lp5j7
  • kubectl logs hello-node-546c7dcc87-lp5j7

などでコンテナの状況を確認してみましょう

最後に

Ubuntu16.04 上で Master 1 台+Worker 1 台の kubernetes クラスタを構築してみました
結構簡単にできたのでビックリです
構築用のドキュメントが乱立しており大変なイメージがあったのですが、

あとは同じように Worker ノードを増やしていけば簡単にクラスタを拡張することができます

参考サイト

1 件のコメント: