前回からkubernetes環境を構築してます。ラズパイは3B、3B+、4の3台。
ちょっと今回はローカルのdocker imageをkubernetesでデプロイしてみます。
まずは正常に動作してるか確認します。
kubectl get node
3台分STATUSがReadyであれば大丈夫です。
①kubernetesでデプロイするためのdocker imageの準備
まずはワーカーノードのラズパイで下記のようなDockerfileを作成します。
FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/
Dockerfileと同じフォルダの中にpublic-htmlというフォルダを作り、index.htmlという名前で下記ファイルを作ります。
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
hello world
</body>
</html>
Dockerfileを作った任意のフォルダでdocker imageをビルドします。
docker build -t my-apache2 /home/pi/<任意のフォルダ>
ビルドが問題なく終了したらdocker imagesコマンドでmy-apache2が存在していることを確認します。
②docker imageをkubernetesでデプロイ
マスターノードになっているラズパイで下記ファイルをyamlという拡張子で保存します。
デプロイするためのマニュフェストになります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: <自由>
spec:
selector:
matchLabels:
role: app
replicas: 2
template:
metadata:
labels:
role: app
spec:
containers:
- name: my-apache2
image: my-apache2
imagePullPolicy: Never
ports:
imageのところでdocker imageを指定します。imagePullPolicy: Neverにしているのはローカルのdocker imageを取得したいからです。
replicas: は仮想化されたコンテナであるpodの数を指定します。これが多いとリソース的にきびしいので2でいいと思います。
作成できたらデプロイします。
kubectl apply -f <作成したマニュフェスト名>.yaml
kubectl get pod コマンドでpodがレプリカ数だけ作成されるのを確認します。
余計なpodがありますが… デプロイしたmy-apache2~が2つできていたら成功です。
※READYが1/1でありRunningを確認してください。ErrImageNeverPull とでていたら
docker imageの取得に失敗しています。
③作成したpodにIPアドレスを振ってhello worldする
作成したhtmlファイルをブラウザで確認するためにIPを振っていきます。(マスターノードのラズパイで実行します)
kubectl expose deployment/my-apache2 --name="my-apache2-svc" --type="ClusterIP" --port=8080 --target-port=80
作成されたIPを確認します。
kubectl get svc/my-apache2-svc
CLUSTERーIPのところを確認してください。
ブラウザで <CLUSTERーIP>:8080と入力すると…
できました!! これは3台のラズパイすべてで確認できます。ひとつのラズパイで作成したdocker imageをpodとして複製し、3台のウェブサーバーとして運用することができました。
この状態でためしにdocker imageをビルドしたラズパイの電源をoffしてもほかのラズパイのブラウザでhello worldが確認できるはずです。kubernetesで冗長性を体験できました。
twitterボットをkubernetesで冗長化しました。↓参考文献↓