Kubernetesは、コンテナのデプロイと管理に使用できる無料のオープンソースコンテナオーケストレーションシステムです。これはGoogleによって開発され、自動スケーリングと自動展開のために特別に設計されました。 Kubernetesは、あらゆるクラウドインフラストラクチャとベアメタルで実行できます。 Kubernetesを使用すると、ノードのクラスター全体に複数のアプリケーションを分散できます。 Kubernetesには、自己修復、自動スケーラビリティ、負荷分散、バッチ実行、水平スケーリング、サービスディスカバリ、ストレージオーケストレーションなどの豊富な機能セットが付属しています。
このチュートリアルでは、Ubuntu18.04でKubernetesを使用してNginxの負荷分散を設定する方法を学習します。
- Ubuntu18.04がインストールされた2台のサーバー。
- 各サーバーに最低2GBのRAMがインストールされています。
- ルートパスワードは両方のサーバーで構成されています。
まず、両方のサーバーを最新の安定バージョンで更新する必要があります。次のコマンドを実行して更新できます:
apt-get update -y
apt-get upgrade -y
両方のサーバーが更新されたら、それらを再起動してすべての変更を適用します。
デフォルトでは、Kuberenetesはスワップメモリをサポートしておらず、スワップがアクティブな場合は機能しません。したがって、両方のサーバーでスワップメモリを無効にする必要があります。
スワップメモリを一時的に無効にするには、次のコマンドを実行します。
swapoff -a
スワップメモリを無効にするには、/ etc / fstabファイルを永続的に開きます:
nano /etc/fstab
最後の行をコメントアウトします:
# /etc/fstab: static file system information.
#
# use 'blkid' to print the universally unique identifier for a
# device; this may be used with uuid= as a more robust way to name devices
# that works even if disks are added and removed. see fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
# swap was on /dev/sda4 during installation #UUID=65se21r-1d3t-3263-2198-e564c275e156 none swap sw 0 0
ファイルを保存して閉じます。次に、次のコマンドを実行して、構成の変更を適用します。
mount -a
次に、両方のサーバーでホスト名解決を設定する必要があります。したがって、各サーバーはホスト名を使用して相互に通信できます。
これを行うには、お好みのエディタを使用して/ etc/hostsファイルを開きます。
nano /etc/hosts
次の行を追加します:
192.168.0.103 master 192.168.0.100 slave
終了したら、ファイルを保存して閉じます。次に、次の手順に進みます。
DockerとKubernetesをインストールする
次に、DockerとKubernetesツールのkubelet、kubeadm、kubectlを両方のサーバーにインストールする必要があります。
まず、必要なパッケージをインストールし、次のコマンドでGPGキーを追加します。
apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
次に、次のコマンドを実行して、両方のサーバーにDockerCEリポジトリを追加します。
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
次に、リポジトリを更新し、次のコマンドを使用してDockerCEをインストールします。
apt-get update -y
apt-get install docker-ce -y
インストールが完了したら、次のコマンドを使用してDockerCEのステータスを確認します。
systemctl status docker
次の出力が表示されます。
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2019-07-19 07:05:50 UTC; 1h 24min ago Docs: https://docs.docker.com Main PID: 3619 (dockerd) Tasks: 8 CGroup: /system.slice/docker.service ??3619 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.574491681Z" level=warning msg="Your kernel does not support swap memory limit" Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575196691Z" level=warning msg="Your kernel does not support cgroup rt period" Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575733336Z" level=warning msg="Your kernel does not support cgroup rt runtime" Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.582517104Z" level=info msg="Loading containers: start." Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.391255541Z" level=info msg="Default bridge (docker0) is assigned with an IP add Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.681478822Z" level=info msg="Loading containers: done." Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.003776717Z" level=info msg="Docker daemon" commit=0dd43dd graphdriver(s)=overla Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.009892901Z" level=info msg="Daemon has completed initialization" Jul 19 07:05:50 master systemd[1]: Started Docker Application Container Engine. Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.279284258Z" level=info msg="API listen on /var/run/docker.sock"
Kubernetesパッケージは、Ubuntu18.04のデフォルトリポジトリでは利用できません。そのため、両方のサーバーにKubernetesリポジトリを追加する必要があります。
次のコマンドで追加できます:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | tee /etc/apt/sources.list.d/kubernetes.list
次に、リポジトリを更新し、次のコマンドを使用してKubernetesパッケージをインストールします。
apt-get install kubelet kubeadm kubectl -y
すべてのパッケージがインストールされたら、マスターサーバーの構成に進むことができます。
Kubernetesマスターサーバーを設定する
まず、マスターサーバー上のプライベートIPアドレスを使用してクラスターを初期化する必要があります。
kubeadmコマンドで実行できます:
kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.0.103
クラスターが正常に初期化されると、次の出力が表示されます。
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.0.103:6443 --token zsyq2w.c676bxzjul3upd7u \ --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c
次に、マスターサーバーでkubectlツールを構成する必要があります。次のコマンドで実行できます:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
次に、サーバーにContainer Networking Interface(CNI)をデプロイする必要があります。なぜなら、クラスターにはCNIがないからです。
次のコマンドを使用して、CNIをクラスターにデプロイできます。
kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
次の出力が表示されます。
configmap/calico-config created daemonset.extensions/calico-etcd created service/calico-etcd created daemonset.extensions/calico-node created deployment.extensions/calico-kube-controllers created deployment.extensions/calico-policy-controller created clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created serviceaccount/calico-cni-plugin created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created serviceaccount/calico-kube-controllers created
これで、次のコマンドを実行して名前空間を確認できます。
kubectl get namespaces
すべてがうまくいくと、次の出力が表示されます。
NAME STATUS AGE default Active 4h kube-public Active 4h kube-system Active 4h
次に、次のコマンドを使用して、マスターノードが正しく実行されているかどうかを確認します。
kubectl get nodes
次の出力が表示されます。
name status roles age version master Ready master 12m v1.15.3
次に、スレーブサーバーにログインし、次のコマンドを実行してスレーブをKubernetesクラスターに追加します。
kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c
次に、マスターサーバーに移動し、次のコマンドを使用してスレーブがKubernetesクラスターに追加されているかどうかを確認します。
kubectl get nodes
次の出力が表示されます。
name status roles age version master ready master 25m v1.15.3 slave ready 2m v1.15.3
終了したら、次のステップに進むことができます。
KubernetesクラスターにNGINXをデプロイする
これで、Kubernetesクラスターがインストールされ、構成され、正しく機能します。 NginxをKubernetesクラスターにデプロイするときが来ました。
マスターサーバーに移動し、次のコマンドを使用してNginxデプロイメントを作成します。
kubectl create deployment nginx --image=nginx
これで、次のコマンドを使用してNginxデプロイメントを一覧表示できます。
kubectl get deployments
次の出力が表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 99s
Nginxがデプロイされると、次のコマンドでアプリケーションを公開できます。
kubectl create service nodeport nginx --tcp=80:80
これで、次のコマンドで割り当てられた新しいサービスとClusterIPアドレスを確認できます。
kubectl get svc
次の出力が表示されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.152.183.1443/TCP 15m nginx ClusterIP 10.152.183.199 80:32456/TCP 60s
おめでとう!これで、NginxがKubernetesクラスターに正常にデプロイされました。 Kubernetesクラスターに別のノードを簡単に追加することもできます。詳細については、KubernetesDocのKubernetes公式ドキュメントを参照してください。ご不明な点がございましたら、お気軽にお問い合わせください。