tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

スワップインとスワップアウト

# 動機 スワップインとスワップアウトがどちらがどちらか混乱するのでメモする。

スワップアウトとは

物理メモリが不足した場合に、メモリ上の利用されていないデータを外部ディスクに退避すること。スワップにアウトと覚える。

スワップインとは

外部ディスクに退避していたデータを利用するために物理メモリに書き戻すこと。スワップからインと覚える。

参考にしたもの

e-words.jp

https://wa3.i-3-i.info/word1720.html

CPU使用率とは

CPU使用率とは

文脈に応じて2つの意味がある。

  1. コンピュータで実行中のあるプログラムがCPUの処理時間を占有している割合。
  2. 全プログラムに関するその総和

後者の2. の意味において、使用率が0%なら何も実行されておらず、100%ならCPUが休みなくフル稼働している。

参考にしたもの

e-words.jp

AWS上で利用できるRDB

Amazon RDS

Amazonが提供するフルマネージドのRDBMS(Relational Data Base Management System)のサービス。

Amazon Auroraとは

Amazonが提供するMySQL および PostgreSQL と互換性のあるクラウド向けのリレーショナルデータベース。Amazon RDSのデータベースインスタンスタイプ(データベースの種類のようなもの)の一つとして設定できる。

参考にしたもの

aws.amazon.com

aws.amazon.com

RDSとAuroraを比較してみた|スクショはつらいよ

「フルマネージド」クラウドサービス~第一回・「フルマネージド(Fully Managed)」とは何か?~ - GiXo Ltd.

https://recipe.kc-cloud.jp/archives/7497

Big Query

Big Queryとは

Google が提供するペタバイト規模のデータ ウェアハウスとデータ解析ツール*1Google Cloud Storage等からBig Queryにデータをインポートするだけで分析を始められることがメリット。利用者はSQLさえ使えればよい。

データウェアハウスとは

目的別、時系列等のデータの分析に最適化した形でまとめてデータを蓄積できるデータの置き場。

参考にしたもの

cloud.google.com

www.topgate.co.jp

it-trend.jp

*1:Big Queryの公式ドキュメントでは「Google が提供するペタバイト規模の低料金フルマネージドのアナリティクスデータウェアハウス」と記載されていたが、「低料金」はユーザ目線ではどう思うかは人それぞれだし、「アナリティクスデータウェアハウス」という言葉はわかるようでわからないので、他記事を参照しつつこのような定義にした

マネージドサービスとフルマネージドサービスの違い

マネージドサービス

本来のサービスに付随する作業を、サービス事業者が請け負ってくれるサービス。

例)

  • 本来のサービス:サーバホスティングサービス、付随する作業:サーバ設定、運用監視等

 → 後者のサーバの利用に付随する作業をサービス利用者側で実施しなくてよい。

フルマネージドサービス

マネージドサービスより、請け負ってくれる範囲が広いサービスで、利用者はサービスに付随する技術的な対応や管理をほぼしなくてよいもの。

例)

  • 本来のサービス:DBMS機能、付随する作業:DBMSそのものの障害監視や障害時の再起動、自動的なバックアップデータ保存

  → 後者のDBMS利用に付随する作業をサービス利用者側でしなくてよい。当然、DBがホストされているサーバの運用監視はやってくれるので、マネージドサービスよりもやってくれる範囲が広いといえる*1

厳密な違いはあるのか?

マネージドサービスとフルマネージドサービスは概ね先述した違いを指すが、厳密な定義があるわけではない。したがってクラウドベンダなどのサービス事業者が「マネージドサービス」「フルマネージドサービス」と言っていても実際に利用する際は、どこまでを利用者が実施する必要があり、どこまでをサービス事業者がやってくれるかを具体的に確認するのが望ましい。自分が想像する「フルマネージドサービス」より、提供されている範囲が狭いかもしれない。

参考にしたもの

マネージドサービスとフルマネージドサービスの違いと、メリット・デメリット|i-TECマネージドクラウド

e-words.jp

www.gixo.jp

*1:この例だとミドルウェア管理をやってくれるものがフルマネージドサービスのように見える。実際にそのように使われている感覚がある。なお、SaaSはアプリケーションの利用をクラウド上で行うが、付随する作業はすべてSaaS事業者がやってくれるので、まさにフルマネージドサービスと言える。

SQS

SQSとは

Amazon Simple Queue Serviceの略。Amazonが提供するフルマネージドのメッセージキューイング機能をサービスとして提供している。

メッセージキューイングとは

異なるアプリケーションプログラム間で動作を連携させてデータを交換させる際の方式のひとつで、送るデータをキューと呼ばれるデータ領域に保持し、データを受ける側の処理が完了するのを待たずに次の処理へ移る方式のこと。アプリケーション間のデータ連携を非同期で行うことができる。

参考にしたもの

aws.amazon.com

www.sophia-it.com

コンテナ内でコマンド実行する方法

目的

コンテナ内でコマンド実行する方法について簡単に整理する。

背景

コンテナの使い方

コンテナは仮想マシンと異なり、汎用的なOSを提供するのではなく、特定の仕事(例えばWebサービスの提供)を実行する目的で存在する*1。1コンテナ1プロセスが基本である。

では、コンテナ内で実行するプロセスはどのように指定されるのであろうか。以降でdockerを例に記載する。

コンテナ実行までの流れ

まず、実行するdockerコンテナがどのように作られるかの流れをおさらいする。

まず、Docker Hub等のコンテナレジストリから、イメージを取得する。取得したイメージをそのまま使うケースもあるが、実際にはカスタマイズがしたいので、Dockerfileと呼ばれる指示書のようなもので、そのイメージに対し各種コマンドを実行し、コンテナイメージを作成する。そのイメージをdocker runコマンドで実行する。

f:id:tanke25616429:20200731101542p:plain
コンテナ実行までの流れ(「さくらのナレッジ Docker入門(第四回)」https://knowledge.sakura.ad.jp/15253/より引用)

コンテナ内で実行するプロセスの指定

コンテナ内で実行するプロセスは以下のいずれかの方法で指定できる。 - Dockerfile内で命令を書く - docker runコマンド実行時のオプションで指定する

実際は上記を組み合わせて使うことで、より柔軟に実行するプロセスを指定できる。

Dockerfileの命令とdocker run命令のオプション

大雑把には、次のように理解できる。 - ENTRYPOINTdocker run 実行時に行われるコマンド*2 - CMD:コマンドのデフォルト引数

が、docker runコマンド実行時のオプション指定と組合せると上記の表現では理解できない挙動があるのでもう少し書く。ENTRYPOINTCMDの有無で場合わけする。

f:id:tanke25616429:20200731111524p:plain
ENTRYPOINTなし CMDなし

f:id:tanke25616429:20200731111702p:plain
ENTRYPOINTあり CMDなし

f:id:tanke25616429:20200731111902p:plain
ENTRYPOINTなし CMDあり

f:id:tanke25616429:20200731112027p:plain
ENTRYPOINTあり CMDあり

ここからわかる通り、基本はコマンドは1つしか実行できない。1コンテナ1プロセスという考え方ともマッチする。とはいえ、複数実行したいケースも当然ある。その方法は別記事にて記載する。

RUN命令について

なお、DockerfileにはRUN命令もあるが、毛色が違うので分けて考えておくのがよい。これもコンテナ内で実行するコマンドを指定しているという面では似ているが、apt-getyum等、コンテナ実行のために必要なパッケージを準備するものとして使われる。コンテナが担う主のタスクそのものを実行することはできない。つまりdocker run時には実行されない。

Kubernetesにおけるコンテナの実行

Kubernetesのpodやdeploymentのmanifestにおいて、コンテナについてcontainers:フィールド内で記述できるが、dockerにおけるENTRYPOINTとCMDに対応するフィールドがある。 ENTRYPOINTに対応するのがcommand:で、CMDに対応するのがargs:である。CMDcommandが対応するではないので注意(紛らわしい)。Kubernetesでは、コンテナを実行するときは例えばkubectl exec ポッド名/コンテナ名 -it -- 引数(コマンドやオプション)で行うが、このときの引数部とcommand:args:の関係はdockerと同じである。

例:podのmanifest

apiVersion: v1
kind: Pod
metadata:
  name: command-demo
spec:
  containers:
  - name: command-demo-container
    image: ubuntu
    command: ["ls", "-l"]
    args: ["-a", "--color"]

例:実行例(ls -l -fが実行される)

$ kubectl exec command-demo -it -- -f

参考にしたもの

Kubernetes完全ガイド impress top gearシリーズ | 青山 真也 | 工学 | Kindleストア | Amazon

Udemy - Certified Kubernetes Administrator(CKA)with Practice Tests

shinkufencer.hateblo.jp

Docker入門(第四回)~Dockerfileについて~ | さくらのナレッジ

DockerfileのCMDとENTRYPOINTを改めて解説する - Qiita

Docker お勉強 03 Dockerfile - sioaji2012のブログ

Dockerfileを改善するためのBest Practice 2019年版

*1:なので、マイクロサービスアーキテクチャの議論とコンテナの議論がセットで出てくるという面があると思われる。

*2:docker run時にENTRYPOINTを上書きしたい場合は、--entrypointというオプションで指定することができる。