Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

Azure の deallocate をちゃんと調べる part.1

発端

先日、第27回 SQL Server 2019勉強会(オンライン) に参加した際に deallocate という機能があり、これが開発環境の Azure Kubernetes Service (AKS) においてコスト削減に繋がるとの情報を頂きました。

ただこのツイートは情報を正確に表現出来ていなく、誤認識を生んでしまう可能性があるのでちゃんと調べることにしました。

  • 第27回 SQL Server 2019勉強会(オンライン)

sqlserver.connpass.com

  • 問題の自分のツイート

結論

個人的な見解

Azure における Deallocate 機能 は、virtual machine (及び、virtual machine scale sets (vmss)) の機能であり、AKS ひいて は Kubernetes (K8s) の機能ではありません。

メリット・デメリットをしっかり把握した上で、自己責任で使用してください。

何故か

AKS の cluster autoscaler は vmss で用いて実現しています。

cluster autoscaler は K8s の機能であり、vmss は Azure の機能です。

マネージド K8s である AKS が cluster autoscaler を実現するために、node pools のリソースを確保する際に vmss の機能を用いて実行しているようです。

注意点

Deallocate は virtual machine (vm) をシャットダウンし、かつリソースを解放する機能です。そのため deallocate 中の vm の維持に掛かる課金は停止します。

しかし、ディスクや 静的 IP アドレスなどのリソースは引き続き課金が継続されるため、完全に課金が発生しなくなるわけではありません。

AKS から cluster autoscaler を使用する場合は --enable-cluster-autoscaler を使用します。

### refs: https://docs.microsoft.com/en-us/azure/aks/cluster-autoscaler#create-an-aks-cluster-and-enable-the-cluster-autoscaler

# First create a resource group
az group create --name myResourceGroup --location eastus

# Now create the AKS cluster and enable the cluster autoscaler
az aks create \
  --resource-group myResourceGroup \
  --name myAKSCluster \
  --node-count 1 \
  --vm-set-type VirtualMachineScaleSets \
  --load-balancer-sku standard \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 3

この設定をした際は、vmss 自体を操作することは出来なくなり、 az aks コマンド経由で操作を行うようになるようです。

これは誤操作を防ぐためにも必要な処置のように思います。

# Note

Manual scaling is disabled when you use the cluster autoscaler. 
Let the cluster autoscaler determine the required number of nodes. 
If you want to manually scale your cluster, disable the cluster autoscaler.

しかし、cluster autoscaler の設定せずに AKS を構築すると、vmss の deallocate 機能を使えてしまえるかのようにドキュメントからは読めます。

次回はそこを検証してみようと思います。

参考ドキュメント

  • Virtual Machines - Deallocate

  • Automatically scale a cluster to meet application demands on Azure Kubernetes Service (AKS)

  • What are virtual machine scale sets?

まとめ

というわけで、この回は切りが良いのでここまで。

検証は次回に続きます :)

macOS から Raspberry Pi に画面共有したい

結論

Raspberry Pi 側 (LAN 内の IP アドレス = 192.168.202.118)

  • VNC について確認しましょう。
$ sudo systemctl list-unit-files | grep vnc
vncserver-virtuald.service             disabled
vncserver-x11-serviced.service         disabled


---> vncserver-x11-serviced があることが確認出来ました。
sudo systemctl start vncserver-x11-serviced.service
sudo systemctl enable vncserver-x11-serviced.service
  • 確認をします。
$ sudo systemctl status vncserver-x11-serviced.service
● vncserver-x11-serviced.service - VNC Server in Service Mode daemon
   Loaded: loaded (/usr/lib/systemd/system/vncserver-x11-serviced.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-02-18 19:30:26 JST; 1h 49min ago
 Main PID: 2493 (vncserver-x11-s)
    Tasks: 6 (limit: 2200)
   Memory: 27.5M
   CGroup: /system.slice/vncserver-x11-serviced.service
           ├─2493 /usr/bin/vncserver-x11-serviced -fg
           ├─2497 /usr/bin/vncserver-x11-core -service
           ├─2506 /usr/bin/vncagent service 13
           ├─2510 /usr/bin/vncserverui service 17
           └─2518 /usr/bin/vncserverui -statusicon 5

Raspberry Pi 側 の設定は以上です。

macOS

  • RealVNC for macOS をダウンロードし、インストールします。

https://www.realvnc.com/en/connect/download/viewer/

f:id:nari_kyu:20200222110503p:plain

f:id:nari_kyu:20200222110517p:plain

  • Applications にコピーしましょう。

f:id:nari_kyu:20200222110533p:plain

  • その後、Launchpad から VNC Viewer を起動し、Raspberry Pi の IP アドレス (= 192.168.202.118) を入れ、Enter を押します。

f:id:nari_kyu:20200222110549p:plain

  • 初回は下記のような確認画面が出ますので、確認して続けましょう。

f:id:nari_kyu:20200222110603p:plain

  • Raspberry Pi にログイン出来るユーザ名とパスワードをいれます。
    • この時、VNC 用のユーザの新規作成は必要ありません。

f:id:nari_kyu:20200222110618p:plain

  • 無事、VNC クライアントを用いて macOS から Raspberry Pi にアクセスすることが出来るようになりました。

f:id:nari_kyu:20200222110633p:plain

まとめ

Raspberry Pi 上の OS に対して、VNC する機会はあまり無いかと思いますが、いざ必要という際に設定するのはめんどうなので備忘として残しておきます :)

nodered-dockercompose を Node-RED v1.0.3 対応させました

nodered-dockercompose ってそもそも何 ??

  • 自前の Repository です。
    • Docker Compose を用いて、 Node-RED (後述) をマシン上に構築することが出来ます。

github.com

  • 今回は、Node-RED の v1 がリリースしたので、上記の Repository もアップデートしました。
    • (正確には v1.0.3 にアップデートしました。)

Node-RED とは??

公式サイト

nodered.org

どんなものか

  • 公式ドキュメントから抜粋します。
https://nodered.org/about/


Node-RED is a flow-based programming tool, originally developed by IBM’s Emerging Technology Services team and now a part of the JS Foundation.
===============================
Node-RED はフローベースドプログラミング (flow-based programming) ツールであり、元は IBM Emerging Technology Services チームによって開発され、JS Foundation 配下のプロジェクトを経て、2019 年 3 月よ りNode.js Foundation と JS Foundation が合併して設立された OpenJS Foundation にホストされています。

コミュニティなど

  • Node-RED日本ユーザ会

nodered.jp

  • Connpass

node-red.connpass.com

その他特徴

nodered-dockercompose を使った Node-RED の使用方法

  • clone します。
cd ${Your WorkDirectory}
git https://github.com/iganari/nodered-dockercompose.git
cd nodered-dockercompose
  • docker-compose コマンドで起動します。
docker-compose up -d
  • 状態の確認コマンド
docker-compose ps
### 例

$ docker-compose ps
         Name                      Command                      State                   Ports
------------------------------------------------------------------------------------------------------
nodered-docker-compose   npm start -- --userDir /data   Up (health: starting)   0.0.0.0:1880->1880/tcp

f:id:nari_kyu:20200207084133p:plain

  • 停止も docker-compose コマンドで行います。
docker-compose stop

今回のアップデートで修正した点などなど

  • 自分で Dockerfile の中でいろいろインストールしていたところを、公式の Repository をものを使用することにしました。
    • メンテナンス性を考慮したため。
  • docker-compose.yml の書き方も公式の Repository に沿って修正しました。

まとめ

Node-RED 自体の構築はシンプルなのでこれくらいで。

あとは、「Node-RED を用いて、何を実現するか!?」 がポイントになります。

とりあえず、LINE BotTwitter に繋げて遊んでみたいと思います!!

Have fun! :)

Multi Cli を作りました

成果物

github.com

どんなものか

  • (今の所) AWS、Azure、GCPCLI をコンテナ上で使えるようにします。
    • これにより、ホストマシンの環境を必要以上に汚すことはありません。
  • Docker Compose を用いることで、常時起動をより簡易にしています。
    • docker コマンドの -d でも出来ますが、管理の工数が増えるため、Docker Compose を使用しました。
  • さくっと CLI を使いたい時に重宝します(多分)
    • CLI を使いたいけど、Cloud Shell を起動するのもめんどいし…な時など!!(あるのか??)

使用方法

  • Repository を Clone し、docker-compose コマンドで実行します。
cd {Your work directory}
git clone https://github.com/iganari/multi-cli.git
cd multi-cli
docker-compose up -d
### 例

$ docker-compose up -d
Creating multi-cli-azure  ... done
Creating multi-cli-aws    ... done
Creating multi-cli-gcloud ... done
  • ちゃんと起動しているか、確認します。
docker-compose ps
$ docker-compose ps
      Name             Command       State   Ports
--------------------------------------------------
multi-cli-aws      /bin/sh           Up
multi-cli-azure    /bin/sh -c bash   Up
multi-cli-gcloud   /bin/sh           Up 
  • Docker Compose にて起動しているコンテナにログインします。
docker-compose exec aws    /bin/ash
docker-compose exec azure  /bin/ash
docker-compose exec gcloud /bin/ash
### 例(Azure のコンテナにて)

$ docker-compose exec azure /bin/ash
/ # 
/ # az version
This command is in preview. It may be changed/removed in a future release.
{
  "azure-cli": "2.0.80",
  "azure-cli-command-modules-nspkg": "2.0.3",
  "azure-cli-core": "2.0.80",
  "azure-cli-nspkg": "3.0.4",
  "azure-cli-telemetry": "1.0.4",
  "extensions": {}
}
/ #

停止する場合

  • 起動しっぱなしで特に問題は無いかと思いますが、停止したい場合は以下のコマンドで可能です。
docker-compose stop

エイリアスを貼っておく

この Docker Compose を起動していて、いざ使いたい時にこの Repository のディレクトリに行かないといけないのは面倒ですよね :(

なので、自分の環境にエイリアスを貼っておきます。以下に Bash の場合の例を貼っておきます。

  • ~/.bashrc に以下を追記します。
alias dg='cd ${Your Repository's PATH}/multi-cli && docker-compose exec gcloud /bin/bash && cd -' 
alias dz='cd ${Your Repository's PATH}/multi-cli && docker-compose exec azure /bin/bash  && cd -'
alias dw='cd ${Your Repository's PATH}/multi-cli && docker-compose exec azure /bin/bash  && cd -'
  • ~/.bashrc の変更を読み込みます。
source ~/.bashrc

これで短いコマンドで実行が可能になりました :)

まとめ

Have fun!! :)