ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】UI開発 Part 3 Tween編

今回もUIです。UIアニメーションでよく使うTween関連です。

Tween

シンプルな動きはTween制御系Assetが便利です。有名な DOTween, LeanTween, iTweenの特徴とサンプルコードを貼ってます。

また、パフォーマンス比較はDOTween公式サイトにまとまってます。

ちなみに私はパフォーマンス重視なのでLeanTweenを使ってます。また、ゲーム仕様に依存する部分はこちらこちらを参考に自前のTween制御を書いてます。

DOTween

無料版はパッケージにコードは含まれないです。(GitHubにアップはされている)有料版はTextMeshPro対応とEditor上でTweenを編集できます。

// !!初回起動時に1回だけ呼ぶ必要あり.
DOTween.Init();

// 実行. 2秒で targetPos へ Linear補間で移動後、OnCompleteに通知.
Tweener twr = this.transform.DOMove( targetPos, 2.0f );
twr.SetEase( Ease.Linear );
twr.onComplete = OnComplete;

// 中断.
twr.Kill( complete:true );

// 一時停止.
twr.Pause();

// 再開.
twr.Play();

LeanTween

パフォーマンス重視のTweenです。コードは全て含まれてるのでカスタムしやすいです。

// !!初回起動時に1回だけ呼ぶ必要あり.
LeanTween.init();

// 実行. 2秒で targetPos へ Linear補間で移動後、OnCompleteに通知.
LTDescr dsc = this.transform.LeanMove( targetPos, 2.0f );
dsc.setEase( LeanTweenType.linear );
dsc.setOnComplete( OnComplete );

// 中断.
LeanTween.cancel( dsc.uniqueId, callOnComplete:true );

// 一時停止.
dsc.pause();

// 再開.
dsc.resume();

iTween

iTween.cs だけのシンプルな作りです。

// 実行. 2秒で targetPos へ Linear補間で移動後、OnCompleteに通知.
var hash = iTween.Hash( "position", targetPos, 
                        "time", 2.0f, 
                        "easetype", iTween.EaseType.linear,
                        "oncomplete", "OnComplete" );
iTween.MoveTo( this.gameObject, hash );

// 中断.
iTween.Stop( this.gameObject );

// 一時停止.
iTween.Pause( this.gameObject, includechildren:true );

// 再開.
iTween.Resume( this.gameObject );

Time.timeScaleの影響

上記3つのTweenの時間制御は Time.deltaTime を参照しています。こちらの値は Time.timeScale の影響を受けます。そして、これは演出系のUIアニメーションで問題になる場合があります。

例えば以下のような格闘ゲームのKO演出です。キャラ・背景は一時停止していますが、"KO"のUIはアニメーションしてます。

ゲーム全体のアニメーションを停止であればTime.timeScaleの値を変更すれば良いです。

しかし、このケースではUIアニメーションは影響を受けない設定が必要です。

以下に各TweenのTime.timeScaleの影響を受けない設定をするサンプルコードです。

DOTween

twr.SetUpdate( UpdateType.Normal, isIndependentUpdate:true );

LeanTween

dsc.setIgnoreTimeScale( useUnScaledTime:true );

iTween

// "ignoretimescale" に true を設定する.
var hash = iTween.Hash( "position", targetPos, 
                        "time", 2.0f, 
                        "easetype", iTween.EaseType.linear,
                        "oncomplete", "OnComplete",
                        "ignoretimescale", true );  // ←ここ.

おまけ

Tweenとは別ですがParticleSystemで作られたUIエフェクトは Delta Time を Unscaled にすると TimeScale の影響を受けません。

まとめ

Tween制御系Assetをまとめてみました。簡単なアニメーションはTweenはとても便利です。 より複雑なアニメーションは Animator, AnimationClip を使う感じですかね。

【Unity】UI開発 Part 2 テキスト編

前回に引き続きUnityによるUI開発です。今回はテキスト編です。

概要

Unityのテキスト表示は uGUI標準のText と TextMeshPro です。
今回はTextMeshPro を取り上げます。

導入方法

Window > TextMeshPro > Import TMP Essential Resources から最低限のアセットをインポートします。

FontAsset

TextMeshProでテキストを表示するためにFontAssetを作成します。

作成方法

  1. Window > TextMesh Pro > Font Asset Creator を選択
  2. Source Font File に フォントデータ(TTF, OTF) を設定
  3. Atlas Resolution に 解像度を設定、ASCIIなら 512 x 512,
    日本語(ひらがな・カタカナ・常用漢字含む)なら 4096 x 4096 くらいで収まります。
  4. Character Set を Custom Characters に設定
  5. Custom Character List に対象テキストを追加
  6. Render Mode に SDF AA を選択
  7. Generate Font Atlas」をクリック
    ※データ量によって生成に1〜2分ほど掛かります。
  8. Save」をクリックして Font Asset を .asset にして保存

使い方

TextMeshProコンポーネントの Font Asset に作成した Font Asset を設定するだけです。

Dynamic SDF

Font Asset をダイナミックフォント的な扱いを可能にする Dynamic SDF 形式にする方法です。

  1. 作成した Font Asset を選択
  2. Source Font File に フォントデータ(TTF, OTF) を設定
    Atlas Population Mode で Dynamic を選択
    Atlas Width/Height に任意の解像度を設定
  3. 「Apply」をクリック

Font Fallback

Font Asset 内に無い文字を指定した際、別のFont Assetを参照する機能です。

設定方法は対象Font Asset を選択
Font Fallback Asset に Font Asset を設定します。

使用例としては
英数字は良く使うが、全角文字はほぼ使わないゲームがあるとします。
・ASCII制御文字(半角英数字・記号) のみの Font Asset A を作成
・そのFontFallback に Dynamic SDF 形式 の 全角文字のFont Asset B を設定
こうすれば、普段は A を参照しつつ、全角文字を使う際は B を参照し
フォント用テクスチャのメモリ消費を抑えられます。

絵文字

TextMeshProはテキスト領域に絵文字を挿入できます。Sprite Asset を必要とします。

Sprite Asset 作成方法

  1. 対象のテクスチャを選択
  2. Inspectorビューから
    Texture Type - Sprite (2D and UI) を選択
    Sprite Mode - Multiple を選択
  3. Apply」をクリック
  4. Sprite Editor」をクリック
  5. Sprite Editor 上で使いたい絵文字を切り抜く
  6. Apply」をクリック
  7. Projectビュー > Create > TextMeshPro > Sprite Asset を選択
  8. Sprite Asset が作成されます。

表示方法

  1. TextMeshPro コンポーネントExtra Settings を開く
  2. Sprite Asset の項目に作成した Sprite Asset を設定
  3. テキスト領域に以下のようにタグを使って入力

    表示結果

表示位置のズレ

以下の方法でオフセットを調整すると直ります。

Sprite Asset の Sprite Glyph Table を開き個別にオフセットを調整します。

まとめて設定したい場合は Sprite Glyph Table の最下部にある Global Offsets & Scale を調整します。

ルビ

TextMeshPro はルビ(ふりがな)を設定できます。コガネブログさんのサイトがとても参考になります。
baba-s.hatenablog.com

まとめ

TextMeshPro は各アセット作成の手間はありますが表現の幅とパフォーマンスは uGUI標準のText よりも良いです。単純なテキスト表示であれば Text でも十分です。

参考

【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。 - テラシュールブログ
Unity Live Help
TextMesh Pro: Sprite Assets - Unity Learn

【Unity】UI開発 Part 1 Canvasと描画順

あけましておめでとうございます。久しぶりの更新です ^_^;
今回は、UnityのuGUIを軸としたUI開発をまとめてみました。

Canvas

uGUIはCanvasコンポーネントを起点とします。このコンポーネント配下に各UI要素を配置します。

Render Mode

UIの描画方式を設定します。

Render Mode 概要
Screen Space - Overlay 通常のUI作成はこれを使います。カメラは参照せず常に最前面に表示されます。
Screen Space - Camera 指定したカメラ範囲に収まるUIを表示します。UIは常にカメラに向きます。Perspectiveビューも設定できるため3Dモデルを間に挟んで表示できます。キャラ選択画面でUI上に3Dキャラを表示する等に使います。
World Space 指定したカメラの3D空間にUIを表示します。3Dキャラの頭上に表示するHPゲージ等に使えます。

解像度対応

モバイルは端末によって解像度が異なる問題を解決する必要があります。ここではアスペクト比を固定化する方法です。

  1. Canvas Scaler の設定を変更

    ・UI Scale Mode - Scale With Screen Size
    ・Reference Resolution - 基準解像度の半分 (1080 x 1920の場合、X:540 Y:960)
    ・Screen Match Mode - Expand
  2. Canvas配下にPanelを配置
  3. 追加したPanel に Aspect Ratio Filter コンポーネントを追加

    Aspect Mode - Fit In Parent
  4. クリップ処理が必要なら Panel に Maskコンポーネント を追加

    ・Show Mask Graphis - チェック外す

SafeArea対応

Unity2019.3以降であれば Device Simulator を使いエディタ上で大まかな判定が可能です。テラシュールさんの記事が綺麗にまとまってます。
【Unity】Device Simulatorでノッチとセーフエリアの対策 - テラシュールブログ

描画順

これはとても重要です。事前にUIデザイナーとエンジニアでルールを決めないと後で痛い目にあいます・・いやほんと・・(TAT)

Canvas内の描画順

Canvas内に限定した話であれば、Hierarchyビューの並びで描画順が決まります。

複数Canvas間の描画順

Screen Space - Overlay と Screen Space - Camera / World Space で異なる設定になります。

Screen Space - Overlay
・常に Screen Space - Camera と World Space のUIよりも手前に描画
Sort Order で描画順を制御

Screen Space - Camera / World Space
カメラDepth > Sorting Layer > Order In Layer の順で奥から手前に描画

こちらのサイトがとても綺麗にまとまっています。
uGUI 描画優先度のチートシート │ Aiming 開発者ブログ

UIにパーティクルを差し込む

例えばUI > Particle > UI で表示したい場合、Sorting Layer が同じ値ならOrder In Layer で調整できます。

手前のUI要素を Canvasの子にしてOrder In Layer を変更します。 (UI要素の Sorting Layer と Order In Layer は Canvas 単位の設定値になるため)

ただし、この方法はCanvasを増やすためパフォーマンス(SetPass増)に影響します。
この辺はゲーム仕様に応じて使い分けると良いです。

Image


画像やシンプルな矩形を表示するコンポーネントです。

テクスチャの設定

Imageに使用するテクスチャは Texture Type を Sprite (2D and UI) に設定します。

Image Type

ImageType 表示
Simple 最もシンプルな表示です。拡大縮小すると画像全体を引き伸ばします。
Sliced 拡大縮小時にBorder(境界)部分の大きさは固定したままで、中心部分だけ引き伸ばします。
Tiled Borderの制御はSlicedと同じです。中心部分を繰り返し表示にできます。
Filled Fill Methodで指定した方式で表示領域を変更します。

Border 設定方法

Sliced, Tiled を使う場合は Sprite Editor で Border の設定を必要とします。
1. 対象テクスチャのInSpectorビューから「Sprite Editor」を選択

2. Sprite Editor ウインドウ左上のプルダウンから「Custom Outline」を選択

3. Border の値を入力して右上の「Apply」をクリックで完了

RawImage


Image同様に画像を表示するコンポーネントです。
Imageと違い、Texture Type に依存しないので
・ネットワーク経由でダウンロードした画像
・ゲーム内の3Dモデルをテクスチャ
等に使用できます。

UV Rect

こちらのプロパティを編集することで UV ScrollやTilingを設定できます。

まとめ

Canvasとそれに紐づく解像度対応や描画順、最後に簡単に画像表示できる Image・RawImage について書きました。これだけでもかなりの量になりました。。本当はテキスト、アニメーション、パフォーマンスと書きたい事は沢山ありますが今回はこの辺で ^_^;

参考

https://learning.unity3d.jp/tag/ui/
Unityでパフォーマンスの良いUIを作る為のTips | PPT
Unity Live Help

【Unity】Google Mobile Ads Unity Plugin を試す

今回は Google Mobile Ads SDK Unity プラグインを使った動画リワード広告を試してみました。

リワード広告とは

ユーザーが広告を操作・視聴するのと引き換えに、アプリ内で報酬を獲得できるものです。スマホのアプリでよくある、ここから先は動画広告を見たら遊べる的なやつです。

Google AdMob

まずは Google AdMob でAdMobアカウント、アプリ情報、広告ユニットの作成をします。すでにある方は読み飛ばしてOKです。  

AdMobアカウント作成
  1. こちらの Google AdMob にアクセス、アカウントが無ければ以下のような表示になります。

  2. 必要な情報を入力してAdSence 利用規約を確認してチェックを入れたら「ADMOBアカウントを作成」をクリック
    ちなみに私は以下の情報で作成
    国または地域:日本
    タイムゾーン:(UTC+09:00) 東京
    お支払い通貨:(JPY¥)

  3. 最後にPINコードの入力をします。
    電話番号の前に国番号(日本は+81)を付けるのを忘れないでください。

  4. 以下のような管理画面が表示されたら完了です。

アプリ情報を作成

アプリ固有のアプリIDを取得するためにアプリ情報を作成してAdMobに追加します。

  1. サイドバーの「アプリ」から「アプリを登録して利用を開始」をクリック

  2. アプリを公開済みなら「はい」を選択して自身のアプリを設定します。

  3. アプリ名の入力とプラットフォームの指定を行い「追加」をクリック

  4. アプリ情報が追加されアプリIDが発行されました。

広告ユニットを作成

アプリ用の広告ユニットを作成します。

  1. 対象アプリを選択して「アプリの概要」から「広告ユニットを追加」をクリック

  2. 広告フォーマットを選ぶ画面になるので、今回はリワード広告を選択します。

  3. 次に広告ユニット名、報酬の数、報酬アイテムを入力して「広告ユニットを作成」をクリック

  4. 広告ユニットが作成され、広告ユニットIDが発行されました。

Google Mobile Ads Unity Plugin
パッケージのインストール
  1. こちらGitHubから GoogleMobileAds-v[バージョン].unitypackage をダウンロードします。

  2. 適当なUnityプロジェクトを作成して Assets > Import Package > Custom Package からダウンロードした .unitypackage をインポートします。

  3. インポート中に Package Manager Resolver ウインドウが表示され、Game Package Registry by GoogleレジストリをPackage Managerに追加して良いかと聞かれるので 「Add Selected Registries」をクリックします。

  4. 次に Assets > Google Mobile Ads > Settings を選択

  5. GoogleMobileAdsSettings.assetが生成されます。

  6. Google AdMob の Enabled をチェック
    Google AdMobで作成したアプリIDを設定します。

  7. Android用の設定
    Assets > External Dependency Manager > Android Resolver > Settings を選択

    Enable Auto-Resolution, Enable Resolution On Build のチェックを外しておきます。

    最後に Assets > External Dependency Manager > Android Resolver > Resolve を選択すると
    Android 固有ライブラリ(AARなど) が Assets/Plugins/Android に配置されます。

  8. iOS用の設定
    Cocoapods が未インストールの場合は
    Assets > External Dependency Manager > iOS Resolver > Install Cocoapods からインストール

    次に Assets > External Dependency Manager > iOS Resolver > Settings を選択

    Xcode Project - Add Cocoapods to the Xcode project を選択後、OKをクリック

  9. これでUnity Editor上で必要な設定は完了です。

スクリプトの設定

適当なCSファイルを作成して広告表示までの処理を書いていきます。

初期化

アプリ起動時などに MobileAds.Initialize() を一度だけ呼び出して初期化します。

using UnityEngine;

using GoogleMobileAds.Api;
using GoogleMobileAds.Common;

public class SampleAds : MonoBehaviour
{
    void Start()
    {
        // 広告を読込前に一度だけ呼び出す.
        MobileAds.Initialize( OnInitCompleted );
    }

    void OnInitCompleted( InitializationStatus initStatus ){
    }
}
広告オブジェクトの作成と読込

広告ユニットIDを設定してリワード広告オブジェクトの作成と読込を行います。

RewardedAd m_rewardedAd;

void CreateAndLoadRewardedAd()
{
    // プラットフォームに応じた広告ユニットIDを設定.
    string adUnitId = "unexpected_platform";
    #if UNITY_ANDROID
        adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx";
    #elif UNITY_IPHONE
        adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx";
    #endif

    // リワード広告オブジェクトを作成.
    m_rewardedAd = new RewardedAd( adUnitId );

    // リワード広告を読込.
    AdRequest request = new AdRequest.Builder().Build();
    m_rewardedAd.LoadAd( request );
}
広告の表示

リワード広告の表示は RewardedAd.Show() を呼ぶだけです。ただし、広告を1回表示するとそのRewaredAdオブジェクトは破棄されるので、このオブジェクトを使い回して以降の広告を読込/表示はできません。

void Show()
{
    if( m_rewardedAd.IsLoaded()){
        m_rewardedAd.Show();
    }
}
イベントの設定

以下のようにRewardedAdに広告用イベントを設定できます。

    m_rewardedAd.OnAdLoaded += OnAdLoaded; // 広告読込完了時に呼び出される.
    m_rewardedAd.OnAdClosed += OnAdClosed; // 広告を閉じた時に呼び出される.

設定できるイベントは以下です。

イベント 説明
OnAdLoaded 広告読込完了時に呼び出される。
OnAdFailedToLoad 広告の読込失敗時に呼び出される
OnAdOpening 広告が表示されると呼び出される。用途は必要に応じてアプリの音声やゲームループを停止する等
OnAdFailedToShow 広告の表示が失敗時に呼び出される
OnAdClosed ユーザが「閉じる」アイコンまたは「戻る」ボタンをタップして広告を閉じると呼び出される。用途は必要に応じてアプリの音声やゲームループを再開する等
OnUserEarnedReward 動画広告を視聴したユーザへのリワード付与時(動画を最後まで視聴した時)に呼び出される。引数のRewardには広告ユニットに設定した報酬アイテム(Type)報酬の数(Amount)が入る

<注意>上記イベントはUnityのメインスレッドとは別スレッドで実行されるので、設定したイベント内でUnityのAPIを呼びたい場合は以下のように MobileAdsEventExecutor.ExecuteInUpdate() を使って例外を回避する必要があります。

[SerializeField] UnityEvent m_onLoadedAd;

void OnAdLoaded( object sender, EventArgs args )
{
    MobileAdsEventExecutor.ExecuteInUpdate( ()=>{ m_onLoadedAd.Invoke(); });
}

イベントをキューイングしてUpdate()で実行してるだけなので同様の処理を自前で書いても良いです。

開発中の動作検証について

開発中にテスト広告を使わずに何度もリリース用の広告を呼び出すと不正な操作と検出されてAdMobアカウントをBANないしは利用制限が掛かる可能性があります。

テスト広告ユニットID

遷移やイベントの検知確認などのアプリをリリースする前のチェックであればこちらにテスト広告ユニットIDが用意されているのでこれらを使用してください。

テストデバイス追加

テスト広告ユニットではなく自分の作成した広告ユニットで確認したい場合、対象端末のテストデバイスIDを追加すれば確認できます。

テストデバイスIDの確認と設定方法は以下です。

1.まずは先程のスクリプトの公告ユニットIDを設定するところをテスト広告ユニットIDに変更します。

void CreateAndLoadRewardedAd()
{
    // 動画リワードのテスト広告ユニットIDを設定.
    string adUnitId = "unexpected_platform";
    #if UNITY_ANDROID
        adUnitId = "ca-app-pub-3940256099942544/5224354917";
    #elif UNITY_IPHONE
        adUnitId = "ca-app-pub-3940256099942544/1712485313";
    #endif

    m_rewardedAd = new RewardedAd( adUnitId );

    AdRequest request = new AdRequest.Builder().Build();
    m_rewardedAd.LoadAd( request );
}

2.上記スクリプトが含まれる確認用アプリを作成して起動後のログからテストデバイスIDを取得します。

Android
adb logcat | grep I/Ads から確認できます。

I/Ads     (12708): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("ここにテストデバイスIDが入る") to get test ads on this device.

iOS
XCodeView > Debug Area > Active Console から確認できます。

<Google> To get test ads on this device, set: GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"ここにテストデバイスIDが入る" ];

以下のエラーが出る場合、iOS端末の 設定 > プライバシー > 広告 > 追跡型広告の制限をオフにしてアプリを再起動してください。

<Google> Limit Ad Tracking may be enabled. To get test ads on this device, disable Limit AdTracking.

3.確認したテストデバイスIDを AdRequest.AddTestDevice() に設定します。
<注意>リリース版ではAddTestDevice()が含まれないようにしてください

// リワード広告を読込.
AdRequest request = new AdRequest.Builder()
                        .AddTestDevice( AdRequest.TestDeviceSimulator )
                    #if UNITY_ANDROID
                        .AddTestDevice( "テストデバイスID for Android" )
                    #elif UNITY_IPHONE
                        .AddTestDevice( "テストデバイスID for iOS" )
                    #endif
                        .Build();

これで準備が完了です!自分の作成した広告ユニットを使いテストデバイスによる確認ができます。長かった・・・^_^;

まとめ

最後に簡単なミニゲームとリワード広告を連携させたサンプルをこちらGitHubにアップしておきました。

参考

始める  |  Unity  |  Google for Developers
[Xcode]Mac OS Catalinaにアップデートしたらpodコマンドが通らなくなった

【Kubernetes】全体像を知る

前回に引き続き、Kubernetesです。

Kubernetesの登場人物

こちらの動画がとても分かりやすかったのでこちらを元に登場人物をまとめました。高良さん、本当にありがとうございます・・(TAT)
www.youtube.com

コンテナ

アプリケーションと実行環境がセットになったもの、まとまっているので環境ごとの展開が容易になる
f:id:aki517:20200617121300p:plain

ポッド

1つ以上のコンテナとそれらの共有リソースを指す、固有のIPアドレスを持ち、ワーカーノード上で動作する
f:id:aki517:20200617121320p:plain

ワーカーノード

VMまたは物理マシン、マスターノードの指示を受けて複数のポッドを管理する
f:id:aki517:20200617121337p:plain

マスターノード

ワーカーノードに不具合があった際に、他のワーカーノードへ処理の振り分けを行う等して複数のワーカーノードを管理する
f:id:aki517:20200617121357p:plain

クラスタ

ノードのグループを指す、マスターノード + 1つ以上のワーカーノードで構成される
f:id:aki517:20200617121731p:plain

指示書(Manifest)

ノードやポッドの増減、振り分けによる負荷分散などの設定が書かれたもの、YAMLJSONで書く
f:id:aki517:20200617121428p:plain

司令官

指示書を書いて、それをコマンドとして実行する人、つまり開発者
f:id:aki517:20200617122003p:plain

全体構成

ここまでの全体構成はこんな感じです。
f:id:aki517:20200617122043p:plain

コントローラ

マスターノード内にあり、ポッドのスケール(増減)、サービス停止なしのポッド交換などを自動実行する機能たち
f:id:aki517:20200617204102p:plain

Service

ユーザ(インターネット)からの要求に対して適切なノード・ポッドへ処理を振り分ける役割を担う
f:id:aki517:20200617204115p:plain

Ingress

ユーザとServiceの間に立って適切なServiceへの振り分けを担う、パスベースロードバランス等
f:id:aki517:20200618220054p:plain

ReplicaSet

設定したポッド数を作成する、ポッドに不具合を検知して速やかに新しいポッドを作成して、常に設定したポッド数を維持しようとする
f:id:aki517:20200617204111p:plain

Deployment

ReplicaSetの管理を行う、ローリングアップデートと呼ばれる方法でポッドのスケールアップ/ダウンをほぼサービス停止なしで行う
f:id:aki517:20200617204105p:plain

まとめ

今回はKubernetesの登場人物とコントローラについて書きました。この他にも素晴らしい機能が沢山あるのですが書き出したら切りが無い・・

概念だけではなく実際に操作してみたいという方はこちらの「Katacoda」というサイトではハンズオンでKubernetesを学習することが出来ます。アカウント登録が必要ですが、Dockerの学習もできるので登録しておいて損はないです。(2020/6/20時点)
www.katacoda.com

ちなみにマネージド版Kubernetesはこちらのサイトでパブリッククラウド御三家の比較について説明がしてあって面白い
g3-enterprise.com

参考

Podとノードについて | Kubernetes
コントローラー | Kubernetes

【Kubernetes】Kubernetes とは?

f:id:aki517:20200427212811p:plain

私はインフラのことはサッパリなんですが、仕事で Kubernetes(クバネイテイス) なるものに向き合う必要があったので色々と調べた結果をまとめました。いや本当にサーバ/インフラエンジニアの皆さん凄いですね・・

Kubernetes とは

こちらの公式ドキュメントには

Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースプラットホームです。」

(・_・) ・・・

はい、全然わかりません。

というわけで社内の詳しいエンジニアさんに話を聞いたらインフラの歴史含めてで色々と教えてくれました。本当にありがとうございました。

物理サーバの時代

90年代頃はWindows OSの登場などもあり、PCがどんどん普及したのもあり、安く手に入れやすい時代だったので、企業が用途に応じたサーバを何台も持ってWebサービスを運用するスタイルでした。社内やデータセンターとかに設置してました。

f:id:aki517:20200426115748p:plain

ところがこの方法はサービスが大きくなると物理マシンの台数が増え、設置場所や電気代など維持費への影響がとても大きかったのです。また、1つのマシンに1つのアプリケーションが稼働するような構成になるためCPUリソースを十分に使い切れない問題もありました。

f:id:aki517:20200426121352p:plain

仮想サーバの時代

2000年代に入ってから、これらの維持費の問題を解決するために1台の物理マシンに複数の仮想化したマシンを割り当ててアプリケーションを動かす仮想サーバが一般的になってました。Hyper-V型とか言います。こうすることで必要な台数を減らし維持費を抑えれるようになりました。

f:id:aki517:20200426123917p:plain

また、後にこれらをまとめてクラウド上に配置しサービスとして提供する AWS, GCP, Azure, なども出てきました。これによって開発者は物理マシンを自分たちで調達する必要もなくなり、ネット環境とPC1台でWebサービスなどを組めるようになりました。ちなみに自社内で物理サーバを立てて情報サービスを自社内のハードとソフトで運用する方式を「オンプレミス」と言います。

f:id:aki517:20200426140747p:plain

ただ、仮想サーバ単位でOSや環境設定が載るためメモリを多く消費したりパフォーマンスに影響が出ていました。

f:id:aki517:20200426214611p:plain

コンテナ仮想化の時代

そこで登場したのがコンテナです。これは1つのOS上に隔離されたアプリケーションの実行環境を幾つも作るコンテナ仮想化(または単にコンテナ)というのものです。これにより複数OSが共存する状態は無くなり、メモリ効率やパフォーマンスの改善が行えるようになりました。

f:id:aki517:20200426214623p:plain

このコンテナを管理するソフトウェアで有名なのが Docker です。Docker はコンテナ起動に必要なデータセットDockerイメージというものにしてアプリケーションの実行環境の構築を容易にしてくれます。

f:id:aki517:20200426195356p:plain

Dockerイメージはインストーラみたいなものなので、開発メンバーに配布してDockerのコマンドを実行してもらうだけで全員がほぼ同一の環境になるという部分もメリットです。要するに「俺のPCでは動くのに!」という良くある問題を解決してくれます。

f:id:aki517:20200426225941p:plain

Kubernetes登場

巨大なサービスだと複数サーバと、そのサーバに構築されているコンテナ環境を管理する必要が出てきます。例えば以下のような対応です。

・任意のコンテナを複数サーバに同時展開
・負荷が上がるのを想定してサーバ台数を増やす
・負荷が下がった時にサーバ台数を減らす
・異なるサーバでのコンテナ通信を行う

Dockerだけではこの問題を解決することは難しいです。エンジニアが手動で管理するのも大変ですよね・・

これらの問題を解決するのが Kubernetes です! やっと登場、長かった・・・

そして今回はここまでになります。。 というのも、このkubernetes、登場人物が物凄く多いんです!
クラスター, ノード, ポッド, サービス, etc...

次回こそは Kubernets について書いていきたいです。(^_^;

↓続きです。
【Kubernetes】全体像を知る - ゴイサギ日記