前回の記事の続きです。 前の記事に引き続き、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
- kubernetesバージョンの表示
- preflight
- KubernetesクラスターセットアップするためのDocker イメージのpull等
- kubelet-start
- kubelet設定ファイルへの追記、kubelete serviceのアクティブ化
- certs
- apiserverやetcd等のコンポーネント、各サービスに認証情報を与える
- 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!!