Simple minds think alike

より多くの可能性を

kubeadminでAWS環境にkuenetesクラスタを作ってみた - マスターノード・ワーカーノードの構築 (2/2)

前回の記事の続きです。 前の記事に引き続き、ubuntuユーザでログインして実行したコマンドを記載していきます。

以下の公式ドキュメントを参照して、マスターノードを構築しました。 kubernetes.io

構成図

改めて構成図を掲載しておきます。

マスターノード

コントロールプレーンノードの初期化

マスターノードにSSHログインし、以下のコマンドでPodのCIDRを10.240.0.0/16として、コントロールプレーンノードを初期化します。コマンドの実行結果の最後にワーカーノードをクラスタに参加させるためのコマンド(kubeadm join 〜)が出力されるので、メモしておきます。

$ sudo kubeadm init --pod-network-cidr=10.240.0.0/16

実行結果を見ると何を行っているのかが分かって面白いです。

  • init
  • preflight
  • kubelet-start
    • kubelet設定ファイルへの追記、kubelete serviceのアクティブ化
  • certs
  • kubeconfig
    • kubectl, kubelet.conf, controller-manager, kube-schedulerの設定ファイル作成
  • bootstrap-token
    • bootstrap tokens, cluster-info ConfigMap, RBAC Role設定
  • addon
    • CoreDNS、kube-proxy適用

root以外のユーザ(ここではubuntuユーザ)でkubectlを使えるようにします。

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Pod network add-onのインストール の箇所

この時点で、どのPodが動いている確認してみます。

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   coredns-5c98db65d4-vdlkp                   0/1     Pending   0          6m22s
kube-system   coredns-5c98db65d4-x8m9v                   0/1     Pending   0          6m22s
kube-system   etcd-ip-xxx-xxx-xxx-xxx                      1/1     Running   0          11m
kube-system   kube-apiserver-ip-xxx-xxx-xxx-xxx            1/1     Running   0          11m
kube-system   kube-controller-manager-ip-xxx-xxx-xxx-xxx   1/1     Running   0          11m
kube-system   kube-proxy-w5hdn                           1/1     Running   0          12m
kube-system   kube-scheduler-ip-xxx-xxx-xxx-xxx            1/1     Running   0          11m

Pod network addonがなく、corednsのpodがREADYの状態になっています。 Network addonとしてcalicoを入れてみます。

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

数分待つと全PodがREADYになりました。

kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-65b8787765-pjscl   1/1     Running   0          40s
kube-system   calico-node-kdwct                          1/1     Running   0          40s
kube-system   coredns-5c98db65d4-vdlkp                   1/1     Running   0          12m
kube-system   coredns-5c98db65d4-x8m9v                   1/1     Running   0          12m
kube-system   etcd-ip-xxx-xxx-xxx-xxx                      1/1     Running   0          11m
kube-system   kube-apiserver-ip-xxx-xxx-xxx-xxx            1/1     Running   0          11m
kube-system   kube-controller-manager-ip-xxx-xxx-xxx-xxx   1/1     Running   0          11m
kube-system   kube-proxy-w5hdn                           1/1     Running   0          12m
kube-system   kube-scheduler-ip-xxx-xxx-xxx-xxx            1/1     Running   0          11m

確認

Kubernetesクラスタ上のノードを表示し、マスターノードの状態を確認してみます

$ kubectl get node
NAME               STATUS   ROLES    AGE   VERSION
master-node-host-name   Ready    master   57m   v1.15.2

マスターノードは正常に動いていることを確認できました。

詳細は以下のコマンドで確認します。

$ kubectl describe node master-node-host-name

ワーカーノード

Kubernetesクラスタへの参加

次にワーカーノードをKubernetesクラスタに追加します。

前回の記事でマスターノード・ワーカーノード両方に共通する設定が終わっているので、ワーカーノードで以下のコマンドを実行するだけでkubernetesクラスタに参加できました。

$ kubeadm join master-node-host-name:6443 --token xxxxxxx.xxxxxxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

マスターノードで再度Kubernetesクラスターのノードを表示してみます。

$ kubectl get node
NAME               STATUS   ROLES    AGE     VERSION
worker-node-host-name    Ready    <none>   6m42s   v1.15.2
master-node-host-name   Ready    master   71m     v1.15.2

動作確認

それでは、構築したkubernetes環境に「Hello Docker!」と返すだけのPodを配置してみます。 マスターノードにSSHログインし、以下のコマンドを実行。
ワーカーノードにechoラベルを追加しています。

$ kubectl label nodes worker-node-host-name type=echo

マニフェストファイル(ファイル名: test-pod.yaml)を任意の場所に作ります。

apiVersion: v1
kind: Pod
metadata:
  name: echo app
spec:
  containers:
    - name: nginx
      image: gihyodocker/nginx-proxy:latest
      env:
      - name: BACKEND_HOST
        value: localhost:8080
      ports:
        - containerPort: 80
    - name: go-echo
      image: gihyodocker/echo:latest
      ports:
        - containerPort: 8080
  nodeSelector:
    type: echo

マニフェストファイルをapplyして、ワーカーノードに「Hello Docker!」と返すだけのPodを配置します。マニフェストファイルのnodeSelectorの指定で、ワーカーノードにのみ配置するようにしています。

$ kubectl apply -f test-pod.yaml

Podの状態を確認します。

$ kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
echo-app   2/2     Running   0          73s

動いているようなので、以下のようにnginxコンテナに接続してみます。

$ kubectl exec -it echo-app --container nginx -- sh

80番ポートにアクセスするとHello Docker!!と返ってくることを確認できました。

$ wget -O - -q http://localhost:80/
Hello Docker!!