IoT開発、設備・DIYのブログ!
前回からkubernetes環境を構築してます。ラズパイは3B、3B+、4の3台。
ちょっと今回はローカルのdocker imageをkubernetesでデプロイしてみます。
まずは正常に動作してるか確認します。
kubectl get node
3台分STATUSがReadyであれば大丈夫です。
①kubernetesでデプロイするためのdocker imageの準備
まずはワーカーノードのラズパイで下記のようなDockerfileを作成します。
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をビルドします。
ラズパイって新しいのが出るとついつい買ってしまいますよね。ラズパイ3Bから初めて3B+とラズパイ4が家にあって… 何台もあるけど使っているのは新しい一台だけ。そんな方多いんじゃないでしょうか。
ラズパイをクラスタ化してkubernetesを導入するという試み(というか記事)が多くあったので
思い切ってルータとスイッチングhubを買ってやってみることにしました。
↓有線LANで接続するため、短めのLANケーブルが数本必要です。
こういうのがあったほうがいいかもです
1番参考にした記事はこちらです、 → Raspberry Pi 4 でおうちKubernetesを作ろう(Raspbian Buster Lite対応版)
3台でクラスタ化をしている記事が多いですが、kubernetesを使ってみるだけであればラズパイはマスターとワーカーノードで2台で十分です。(かなり動きがもっさりしますが…)
今回ラズパイ3B+とラズパイ4でクラスタ化を試みました。
OSのインストールはせず、現在使っている環境でやってみました。
マスター ラズパイ4 rasbian 10.4
ワーカーノード ラズパイ3B+ rasbian 9.13
手順としては…
①初めにルーターを家の無線wi-hiにつなぐ
・ルーター本体記載のSSIDとパスワードでまずPCから接続。
・WEBブラウザを開いてhttp://192.168.13.1/へ接続。設定ウィザードからワイヤレスワンモードにする。
②ラズパイのIPアドレスをマスター192.168.13.101、ワーカー 192.168.13.102にする。
sudo nano /etc/dhcpcd.conf コマンドで下記を追加(マスターの例)
interface eth0
static ip_address=192.168.13.101/24
static routers=192.168.13.1
static domain_name_servers=192.168.13.1 8.8.8.8 fd51:42f8:caae:d92e::1
sudo nano /etc/hosts で
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 k8s-master
192.168.13.101 k8s-master
192.168.13.102 k8s-node1
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
※ラズパイ3B+ではできませんでした。(下記エラーがでますが今のところ問題なし)
update-alternatives: エラー: iptables の alternatives がありません
sudo -i
wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/containerd.io_1.2.6-3_armhf.deb
wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce-cli_19.03.5~3-0~debian-buster_armhf.deb
wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce_19.03.5~3-0~debian-buster_armhf.deb
dpkg -i containerd.io_1.2.6-3_armhf.deb
dpkg -i docker-ce-cli_19.03.5~3-0~debian-buster_armhf.deb
dpkg -i docker-ce_19.03.5~3-0~debian-buster_armhf.deb
⑨kubernetes関連インストール
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get install -y kubelet kubeadm kubectl
⓾マスターの構築 ※ワーカーはやらなくてOKです
kubeadm init --pod-network-cidr=10.244.0.0/16
上記のコマンドで kubeadm join 192.168.13.101:6443 --token~ をメモって下さい。
ワーカーから接続するときに使用します。
⑪kubectの設定
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
ここで kubectl get node コマンドでマスター単体の動作確認ができます。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/
2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
⑬ワーカーのクラスタ参加 ※ワーカーのみ
⓾でメモったトークンとハッシュ値を入力しクラスタに参加します。
kubeadm join 192.168.13.101:6443 --token~
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "ww3i31"
とエラーがでたらトークンの有効期限が切れています。
マスターでkubeadm token createとコマンドを打てばまたもらえます。
うまくいけば下記のようにマスター、ノードともにReadyになります。
ワーカーが1台しかないのでpodが増えると異常に重くなります。レプリカ数を減らすとなんとか動きます。スペックの高いラズパイ4のほうをワーカーにしたほうがよかったかなと後悔…。
→もう一台つなげてdocker imageをデプロイしてみました
ラズパイのGPIOを使うとき、実はいろいろな制限があります。
ピンの出力電圧は3,3V、流せる電流はピンごとでは8mA、トータルで50mA程度が最大だそうです。
例えばこんなパトランプを制御しようとすると…
ダメですね。0.14Aも流れているのでまったく動かせません。というよりそもそもUSB出力なので5V仕様です。
USB出力を動かすやり方は2つあります。
①ラズパイのUSB出力を制御する。
②トランジスタを使って増幅させる。
①はラズパイのUSB出力をシェルスクリプトでON、OFFさせる方法です。
USB OFF のスクリプト
sudo hub-ctrl -b 1 -d 2 -P 2 -p 0
USB ON のスクリプト
sudo hub-ctrl -b 1 -d 2 -P 2 -p 1
ラズパイ3B+でしか試していませんが、USB出力すべてが動作してしまうため、あまり使い勝手がよくありません。USBのWEBカメラなども接続している場合は停止してしまいます。
続いて②です。arduinoのように5VでGPIO出力できなくてもピンとしては5V電源は取れるので
下記のように接続し、GPIOの信号で負荷に5V印加できるようにします。
※8/10図を修正しました。指摘の多かった電流制限抵抗とフライホイールダイオードを入れています。
USBのメス側とトランジスタ(2C1815)が必要です。
パトランプは負荷のところへ挟み込み、片方はラズパイの5V出力につなぎます。3.3VのGPIO出力はベースとしてトランジスタへ接続します。コレクタに流せる最大電流は150mAなので問題ありません。
あとはGPIOを制御するプログラムを作るだけです。このやり方はラズパイだけではなく、ESP32
あたりのモジュールでも使うのですが、今回「あれ?どうやってやるんだっけ?」ってなったので備忘でまとめました。直流モーターを制御するときに必要です。
…こんなめんどくさいことしなくていいようにラズパイに5Vの入出力端子デフォルトで作ってほしいですけどね。
最近AI画伯やモザイク消しなどといった画像をつかったAIプラットフォームがどうも流行ってるみたいです。自分も興味をもったので簡単なものを作ってみることにしました。
AI周りはTensorFlow、サーバーサイドはAzureで構築。
顔画像から一番近い霊長類を当ててくれるAI霊長類をつくりました。
http://104.215.52.107/index2.html
※現在は停止中
ドメインはないのでIPままです(笑)
あらかじめ霊長類を学習しており10種に分類することができます。ちなみにヒトはいません。
コードをすべてアップできないので簡単に説明すると…
①Azureで立ち上げたWEBサーバに画像をアップできるように開発(PHP)
②Azure → AWS S3へ画像を転送
③AWSS3 → 自宅PCでAI解析(TensorFlow)
④自宅PC → Twitterへ出力(Python)し①のWEBサーバへフィードバック
なんでこんなめんどくさい構成かというと、AWS、AzureでGPUサーバーをレンタルすると高いからです。最低でも1時間100円~ かかります。自宅PCはNVIDIAのGPUがついているので
使い放題です。
所見・感想
・AzureはAWSより使いやすいかもしれません。ポートの解放などはわかりやすかったです。値段的には微妙ですが…。
・TwitterのAPIはすぐ制限が厳しいです。投稿が重なったり投稿数が多かったりするとエラーがでます。
・もう少し、AWS、Azureも安くなればAIもサーバ側で開発してまともなものが作れそうです。
・いつもpythonの開発だけなので今回PHPやAPACHEを使ったWEBサーバ開発は苦労しました。
→もう少し勉強してみたいと思います。
PS.ナイナイの岡村さん→日本ザル ガレッジセールのゴリさんはマンドリルでした。