close
プログラミング クラウド Microsoft Azure 情報処理資格 基本情報技術者 IT基礎 応用情報技術者 開発・設計方法 オブジェクト指向 内定者・新人研修 プログラミング基礎 アルゴリズム コンピュータ数学 内定者研修 新人研修 ヒューマンスキル プロジェクトマネジメント プレゼンテーション リーダーシップ 組織マネジメント ネゴシエーション ロジカルシンキング Java UI/UX HTTP JavaScript基礎 情報処理資格 ネットワークスペシャリスト ネットワーク インターネットルーティング応用 IPアドレス データベース応用 SQL応用 パフォーマンスチューニング データベース設計 ER図 概念設計(データベース) 論理設計(データベース) IT資格 Linux基礎 OS・システム基盤 セキュリティ TCP/IP OSI参照モデル データベースセキュリティ ファイアウォール 標的型攻撃 SQLインジェクション ネットワーク基本設計 CCNA Cisco プロジェクトマネジメント資格 情報処理資格プロジェクトマネージャ 情報処理安全確保支援士 人事給与 財務会計 管理会計 簿記 生産管理 在庫管理 ERP バランススコアカード 情報処理資格 ITアーキテクト 情報処理資格 ITストラテジスト 情報処理資格 ITサービスマネジメント 情報処理資格 システム監査 PMBOK® PMP® プロジェクト計画 WBS リスクコントロール ITIL ITサービスマネジメント 要求定義 要件定義 見積手法 ビジネスインダストリ 業種・業界知識 業務知識 提案力 ソフトウェアテスト基礎 情報処理資格 データベーススペシャリスト ハードウェア基礎 外部設計(基本設計) 内部設計(詳細設計) データベース基礎 SQL基礎 RDBMS 物理設計(データベース) C++ Ruby MVC基礎 Webアプリケーション開発 JavaEE Javaプログラミング応用 フレームワーク MVC応用 Spring フレームワーク ソフトウェアテスト応用 テスト手法 JUnit スマートフォンアプリ開発 Androidアプリ開発 C# 基礎 C# 応用 負荷テスト Javaプログラミング基礎 ソフトウェアテスト コーチング メンタリング HTML/CSS サーバー構築 仮想化技術 KVS (NoSQL) アジャイル スクラム ファシリテーション C言語 ITパスポート JSTQB データサイエンス 単体テスト ユニットテスト キャリアアップ インターネットルーティング基礎 パケット解析 LAN構築 データベース データサイエンティスト トレンド 障害対応 インフラ監視 HTTP/2.0 コンピュータサイエンス VPN ネットワーク物理設計 データベース障害 JavaScript モダンJS (Modern JavaScript) 応用 MVS応用 バックアップ/リカバリ 分散処理 Hadoop Hive Python AI 深層学習(DeepLearning) CentOS Linux応用 Zabbix シェルスクリプト Infrastructure as Code Windowsサーバー基礎 内部設計 Docker DevOps Windowsサーバー応用 NginX chef Ainsible ロジカルライティング R テスト自動化 Jenkins Git 継続的インテグレーション (CI) バージョン管理 Vagrant 要求分析 Redmine 継続的インテグレーション(CI) 継続的デリバリー (CD) ヒューマンリソース管理 Web API マイクロサービス コミュニケーション 業務知識/業界知識 マーケティング 語学 AWS 法務 IoT ビジネスマナー OJT 業務効率化 表計算ソフト オフィスソフト コンプライアンス フロントエンド Subversion PHP 関数型プログラミング Laravel モダンJS (Modern JavaScript) 基礎 Android Studio 機械学習 iOSアプリ開発 ぷプログラミング React 次世代高度IT人材 共創 IPA Raspberry Pi Xamarin スクリプト言語 GoF CUI VBA 資格 ビジネス文書 jQuery 研修参加レポート マネジメント OSPF テーブル設計 アンガーマネジメント クリティカル・シンキング PDU 経営改善 Pマーク 問題解決技法 サイバー攻撃 エンジニア 参加してみた エンゲージメントマネジメント 労働関連法 新人育成 ネットワーク構築 情報セキュリティマネジメント デザインパターン リファクタリング マルチスレッドプログラミング ベンダーコントロール Modern JavaScript 冗長化 VLAN インフラエンジニア チームビルディング テストケース リーダブルコード セキュリティ入門 ネットワーク入門 Node.js npm gulp ビルドツール Python入門 冗長化入門 インフラ実機演習 プロジェクト管理 Active Directory ネットワーク管理 コンテナ 正規化理論 Haskell 品質管理 OpenStack シンギュラリティ DBA中級 プロトコル UX 基本設計 FinTech トラブルシューティング 並列処理 見える化 PMO ロジカルコミュニケーション Deep Learning インデックス設計 超上流工程 BGP Excel C-CENT Selenide プライベートクラウド アセンブラ コンピュータ基礎 工数見積 CCENT 法律知識 失敗から学ぶ プロジェクト失敗事例 PDCA プログラミング入門 非エンジニア向け 4Biz DNS セルフマネジメント 片付け術 サーバーダウン サーバー タイムマネジメント GO言語 プロダクトマネジメント プロダクトマネージャ LVS ロードバランサー 負荷分散 仮想通過 犯罪心理学 情報漏えい SEカレッジ導入事例 IT研修制度を聞いてみた CentOS7 開発環境構築 数字力 財務 IT人材 UI Machine Learning Go言語 (golang) データマイニング 統計学 新人教育 やり直し数学 RDB つながる工場 モチベーション WebSocket WebWorker HTML5 CSS3 Bootstrap 微分・積分 システム設計 決断力 LAMP環境 教育研修担当者向け ルーティング Linux入門 図解術 目標設定 試験対策 インタビュー技法 Vue.js ブロックチェーン DHCP 仕掛け学 BSC 財務諸表 自己分析 RIP スタティックルート バッファオーバーフロー DoS攻撃 システム開発 Wireshark パケットキャプチャ 管理職研修 部下育成 文章力 情報システム部門向け プロジェクトリーダー プロジェクトマネージャ 塗り絵 リスク管理 法改定 会社の仕組み Chainer AI人材 会話術 テスト技法 会社規模199名まで 会社規模49名まで 会社規模99名まで アプリ開発 サーバサイドJava 営業知識 Cloud 栄養学 基本コマンド ウォーターフォールモデル ヘルスケア 論理設計 ニューラルネットワーク ハンズオン UML 顧客ヒアリング マウスで学ぶ Apache EC2 Lightsail M5Stack DevSecOps プロジェクト成果 画像認識 チャットポット コマンド レビュー 基本用語 自動構築 LPIC-1 サーバーサイドJavascript キャリア形成 ワークライフバランス インバスケット テック用語 GitHub Windows エディタ 教養 令和時代 RESTful API 物理設計 会社規模300名以上 データモデリング サーバーサイドJava Webサーバー基礎 Webサーバー応用 Watson IBMWatson Learning Topics OS モバイル コンテスト トレーニング手法 アーキテクチャ 人材モデル インフラ CI/CD Infrastructure as a Code チーム開発 制度づくり Special_Intro AI市場分析 研修ロードマップ 仕事術 デジタルトランスフォーメーション 財務分析手法 情報整理 PowerPoint 新しい研修 オンライン研修 見どころ紹介 統計分析 ディープラーニング G検定 情報処理技術者試験 販売管理 C# テスト計画 Linuxサーバー WEBサーバ構築 http/2 Postfix イーサリアム プロジェクト・メンバ 正規化 パケット実験 作業分解 トラブル調査 ネットワーク設計 Windows server 2016 ネットワーク機器 DX 管理職 最新動向 ポストコロナ時代 IoTデバイス マイコンボード センサ サーバー仮想化 仮想ルータ WAN インターネットVPN 若手エンジニア ITプロジェクト 人事面談 DX人材育成 Java基礎 ZAP 脆弱性診断 NWサービス構築 イノベーション・マネジメント ネットワークセキュリティ ストレッチ Google Cloud Platform 不動産業界 テレワーク(WFH) ドリル GCP ( Google Cloud Platform ) システム業界 PMS テレワーク ビッグデータ NoSQL OWASP CentOS8 ネットワーク技術 データ分析 デザインシンキング 保険業界 会議リーダー システムエンジニア 段取り術 プロジェクト原論 文章書き換え術 ノーコード No Code MongoDB Redis Cassandra 運用管理 Windows10 仮想マシン リモートワーク 働き方 生産性 IPSec Office セキュリティマナー ソフトウェア・レビュー ライフハック 新しい働き方 エクササイズ ビジネスモデルキャンバス 状況認識 ストレス 必須コマンド Web 今日わかる きほん 状況把握 意思決定 心の健康 IT書籍 書籍紹介 営業マン 類推法 クラス プロセス指向 PdM 共用 ウェビナーレポート 地方創生 GraphQL CSS OWASP ZAP セキュリティマネジメント 問題解決 ソフトウェア 新技術 雑談力 テスト見積もり Scala Go Rust Relay Cloud AI Kaggle ITエンジニア フレッシャーズ 経営戦略 事業戦略 マインドフルネス 基本情報技術者試験 ニューノーマル プロジェクト会議 メソドロジ 講師インタビュー システム障害 販売管理システム VMware セキュリティ事例 ケーススタディ インターネット通信 ビジネスマン 品質向上 提案 ロジック図解術 バーチャルマシン 対策事例 アスリート 国の動向 アンチパターン リモートアクセス 脳ヨガ 自律神経 整え方 組み立て方 コミュニケーション術 リーダー 新人 知っておきたいこと 対人能力 洞察力 一文作成 サッカー業界 グループワーク マネジメント手法 IT業界 Octave セキュリティ管理 IT ネットワーク機器の特徴 ネットワーク機器の仕組み 基本のキ プレゼンテーションの組み立て方 伝え力 試験合格後 時短術 作成のコツ 導入事例 メンタルマネジメント メンタルヘルスケア DXプロジェクト プログラミング教育 プログラミング的思考 子供向けプログラミング データ定義言語 DDL モダンWebアプリケーション ドキュメント作成 Docker Compose Docker Hub AR VBAエキスパート試験 Azure メディア掲載 サーバーアーキテクチャ データ操作言語 DML NewSQL ソフトウェアセキュリティ 数学 VR アパレル業界 Kubernetes Power BI Android プロダクトオーナーシップ プロダクトオーナー 内製化 情報システム部門 Z世代 クラウドネイティブ 技術教育 Windows server 2019 XSS CSRF クリックジャッキング ビジネスパーソン VPC IAM AWS Fargete ECS 問題発見力 問題分析力編 Access 流通業界 金融業界 ネットワーク設定 トラブル対応 評価 ソフトウェア品質 クレーム対応 呼吸法 戦国武将 エンジニアリング 組織論 SpreadSheet GAS ゼロトラスト Express 3D Arduino 業務分析法 業務構造 経営者 ストレングスファインダー 発注者視点 情報セキュリティ 顧客体験 エンターテインメント お笑い オンライン学習 オンライン教育 学校教育 情報化社会 スポーツ デジタル戦略 ITフェスティバル GoogleSpreadSheet GoogleAppsScript(GAS) SQL 問題分析力 メタバース NFT 資産形成 資産運用 Typescript WebXR 講師が注目する技術 プラクティス ローコード ホワイトハッカーに学ぶ Google Cloud LinuC レイヤ3スイッチ ホワイトハッカー ハッキング 脆弱性 ビジネススキル キャリア戦略 NFTアート リテンションマネジメント ゲーム制作 トラブル防止 システム外注 食事メソッド コード ソフトウェア設計 ドメイン駆動設計 人事評価制度 報告書 稟議書 契約書 Rails 業務自動化 価値 原則 睡眠 IT用語 DBA 炎上対策 2022年版 パフォーマンス パフォーマンス向上 Kubernetes入門 実践 チューニング 2020年代 2010年代 リモートアクセスVPN VPN構築 Railsの教科書 CCNA試験 ウェビナー 老後 人生設計 OSPF入門 Ruby on Rails 脆弱性対策 説明上手 説明力 システム障害報告 システム障害解決 いまさら聞けない 仕掛けから考える ネットワーク基礎 社会人 基礎知識 今日から変わる 睡眠マネジメント 仕事の成果を上げる 出るとこだけ 情報セキュリティマネジメント試験 狩野モデル 独学 若手向け 若手に受けてほしい ルーティング基礎 ルーティング実践 ネットワークエンジニア はじめての サイバー攻撃対策 2022 機械学習エンジニア 実演 AI基礎 Java開発 HTML Web基礎 JavaScriptフレームワーク Vue.js入門 明日から使える 最新テクノロジー 生産性向上 組織開発 PMBOK®第6版 リスクマネジメント 結合 副問合わせ Linux 実践演習 シェルスクリプト入門 マネジメント変革 押さえておきたい DHCPサーバー DNSサーバー VLANスイッチ レイヤ3 LAN NW技術 ローカルエリアネットワーク 知っておきたい 基本文法 Windowsプログラミング ネットワーク全体像 Git入門 GitHub入門 Pyhtonライブラリ プロジェクト QCD管理 Ruby入門 オブジェクト指向言語経験者向け PMBOK®ガイド第7版 ディープラーニング入門 グラフデータベース LinuC入門 サーバサイドJava入門 基礎編 応用編 AWS入門 AWSサービス ファイアウォール構築 Docker入門 データベース設計技術 オンプレミス オンプレ オンプレAD Windows Admin Centre データベース概念設計 Javaプログラミング 1日プログラミング特訓 AI開発 微分 線形代数 行列 統計検定 統計検定準拠 MySQL データベースメンテナンス データベース論理設計 ファイアウォール入門 副問合せ 顧客の売上アップ 売上アップ Azure入門 自分でつくる Docker実行環境 午後アルゴリズム問題 解き方のコツ FE シェルスクリプト実践 仮題で学ぶ 課題で学ぶ 現場 コミュニケーション管理 DX最新動向 DX推進人材 DX人材 Windows server Django データベース連携 インフラエンジニア最新動向 なんとなくわかるからもう一歩 アルゴリズム入門 アルゴリズム基礎 プログラム ハードウェア Javaアルゴリズム 1日特訓 現場でよく使う Rails入門 データベース障害復旧 Google Cloud Vision AI Dialogflow Cloud Functions Pythonプログラミング 社内資格制度 今日から使える 「仕掛け」から考える ITベンダー 診断ツール Webセキュリティ Webセキュリティ基礎 新任PM 新任PL テスト NW機器 独学できる Windows Admin Center プログラミング体験 Java開発者のための C#開発 RPA RPA入門 NWエンジニア NFT入門 だれにでもわかる サーバサイドJavq サーバサイドJava基礎 サーバサイドJava応用 炎上しないための AWSサーバ プログラム基礎 アセンブラ基礎 人工知能 ICT 課題解決 自律性 システム開発基礎 プロジェクト基礎 Webアプリ パターン別 アプリケーション開発 エンジニア初級 2022年からの 実用的な 発注 受け入れ Microsoft Office AI最新動向 良いSQL 悪いSQL データベース管理 インデックス Webの基本 NW管理 C#開発者のための ルータ TCP/IP通信 積分 数学基礎 NWセキュリティ 基本パターン JavaScriptでつくる DX時代 デザインシンキング入門 データ構造 PHPフレームワーク Linuxで学ぶ 速習 VLAN基礎 ゼロからはじめる jQuery入門 JavaScriptドリル Ruby on rails基礎 テストツール リレーショナルデータベース はじめて学ぶ データベースのしくみ 人生100年時代 令和 デザイン デザイン入門 現場ですぐに使える テーブル設計実践 情シス 外部設計 外部設計基礎 小規模ネットワーク Linux必須コマンド 違いを知ろう AWS CLI AWS CLI入門 CloudFormation NW設計 親子で作る メタバースプログラミング サーバー仮想化入門 DNSサーバー構築 秋冬版 IoT基礎 新人PM マネジメント研修 人を動かす 仕組みづくり イノベーション・マネジメント入門 心理的安全性 チーム チーム運営 3時間で学ぶ OS基礎 サーバー基礎 情報漏えい対策 プロジェクトマネジメント入門 組織改革 やさしいチームのつくりかた 簿記から学ぶ ビジネス基礎 データベースマネジメント 乃木坂46 乃木坂46に学ぶ マーケティング論 なっとく! LinuCレベル1 101試験 LinuCレベル1 101試験 ファイルシステム ディスク管理 データ分析基礎 一発OKを引き出す 資料作成術 プレゼン資料 クラウドサービス NW NW構築 SQL入門 目標達成マネジメント マネジメント基礎 目標管理 行動分析学 人の動かし方 組織の動かし方 科学的な Tableau MongoDB基礎 IoT実践 データ収集 データ自動収集 データ管理 技術者 SEのための 論理的思考 PM PL アルゴリズム再入門 GoFデザインパターン オブジェクト指向未経験者向け 令和版 失敗事例から学ぶ データベース構築 原価管理 業務連動 Access基本操作 クエリ活用 フォーム作成 レポート作成 実務事例で学ぶ 実務 知識活用 ネットワーク管理コマンド PCスキル 最強の習慣 ストレスフリー 作業効率化 Windows 11 webサーバ カラダとココロ ハワイアンストレッチ 身体のケア ストレス解消 パワーアップ リフレッシュ 1日で習得する ユーザ視点で考える 今知っておきたい UX向上 ユーザエクスペリエンス ユーザ体験 比べて学ぶ 仮想化 仮想マシンとコンテナ データサイエンスプログラミング データ視覚化 オリンピックコーチが伝える セルフマネジメントメソッド セルフイメージ 仮想環境 仮想環境で学ぶ セキュリティ実践 サーバーセキュリティ オンライン攻撃事例 質問技法 SE JavaScriptだけでつくる バッチ処理 テストデータ作成 ストアドプロシージャ バッチ テストデータ 実践編 デザイン力 テレワーク時代 収納術 インテリア術 サイバーセキュリティ 無線LAN Wi-FI 人事 BGP入門 ルーティングプロトコル 文系でもわかる 統計学入門 IPv6 IPv6入門 IPv4 人材育成 人が育つ仕組み 売れる仕組み マーケティング入門 セールスパーソン セールスマネージャー セキュリティ対策 計画の立て方 脱TCP HTTP/3 HTTP/3時代 AWS認定資格 Amazon Web Services 作業自動化 顧客折衝 Webサーバー自動構築 JavaScriptコーディング JavaScriptコーダーのための エンジニアのための ここが危ない テレワークセキュリティ サイバー攻撃事例 相手が理解し納得できる プレゼン 図解活用術 図解活用 Webアプリケーション Webアプリケーションセキュリティ クロスサイトスクリプティング OSコマンドインジェクション PowerPointで作る 資料デザイン 見やすい資料 IT業界人 知っておくべき 目の疲れ 眼精疲労 新習慣 習慣 栄養 運動習慣 イノベーション IMS ISO56000 イノベーション・マネジメントシステム 顧客視点 デザイン思考 Excel初級編 オブジェクト指向基礎 Javaでオブジェクト指向 Vue3 Vueアプリケーション FE試験 リーン開発 情報システム 情報システム開発 開発手法 C#プログラミング 応用情報技術者試験 AP AP試験 情報漏えい事例 心理学 E-R図 PMBOKから学ぶ 新人エンジニア 0年目エンジニア Webサービス Webサービス基礎 スコープ・ベースライン スコープ記述書 WBS辞書 ステークホルダ 3Dオブジェクト 3Dプログラミング canvas WebGL Three.js 3D描画 Pythonによる ローコードAI開発 Pandas scikit-learn Pycaret データ前処理 AIエンジニア Windows server基礎 攻撃対策 攻撃手段 マルウェア マルウェア対策 攻撃監視 Power BI Desktop BI ERD SQLマスター SQL実践 特訓講座 Google Apps Script AWSベースサービス Amazon ECS Amazon Elastic Container Service リーダーが知るべき Dockerビルド Docker応用 Docker構築 自動ビルド 伝達力 プランニング ネットワーク仮想化 ストレージ仮想化 達意の文章 書く力 GCP GCP入門 クラウドサービス基礎 伝わる文章 Cloud IAM Cloud Pub/Sub GCP応用 GCPリソース連携 TCP/IPプロトコル Webページ作成 コーディング NW全体像 NW機器の仕組み NW機器の特徴 つながりで理解できる マイクロサービスアーキテクチャ RESTfulアーキテクチャ Web API設計 Web技術 Web API実装 無線LAN基礎 体調快調生活 酸素不足 ITキャリア アプリケーション登録 システム基本設計 システム設計入門 PoC 成果定量化 プロジェクトアンチパターン 要求管理 IoT人材 心理的安全性の高め方 webサイト webサイト制作 タイムマネジメント原理原則 時間管理 時間効率化 時は金なり 時はいのち ECRSの原則 JavaScript実践 JavaScript基本コード NW基礎 サブネット分割 コンプライアンス基礎 情報管理 ハラスメント 社会人基礎 ハラスメント防止 ネットワークセキュリティ基礎 NWセキュリティ基礎 NoSQL基礎 3C分析 セールス 簿記3級 顧客理解 Scratch Scratchで学ぶ プログラミング未経験者向け クイックツアー プログラミング言語の歴史 IT入門 ITの歴史 Ciscoルータ IPv6移行 IPv6ルーティング 小規模NW いちばんやさしい HTML/CSS入門 正規形 JSP サーブレット WindowsServerでつくる IIS Microsoft DNS Server 工数 係数モデル FP法 ボトムアップ法 WBS法 1日で学ぼう PostgreSQL DBA必見 AI活用事例 Gitコマンド バージョン管理ソフト NW設定 RDBMS基礎 レビュー技法 リーディング技法 超特訓講座 Git中級 Git応用 CLI 契約 著作権 アプローチ手法 アプローチ ソフトウェア開発 ユーザ視点 UXデザイナー 最強の週間 IT基本用語 LinuC Lv.1 ロジカル ITパスポート試験 若手エンジニアのための ゼロトラストセキュリティ 派遣 業務請負 知的財産 トヨタ生産方式 リーン開発で学ぶ フロントエンド開発 新価値創造 新価値創造プロジェクト 事業開発 デジタル変革 DB リレーションシップ Tableau基礎 データ可視化 データ可視化ツール クエリ データ加工 Access活用 Webアプリケーションフレームワーク 社内プレゼン 健康 ダイナミックルーティング テスト自動化ツール Selenium フローチャート スタティックルーティング プログラミング言語 デジタルイノベーション なぜプログラムは動くのか 定量化 DXの前に知っておきたい IT技術 CSS3で学ぶ CSS基礎 Pythonを使った データ・サイエンティスト WebAPI マイクロ・サービス・アーキテクチャ RESTful 気を付けよう パソコン AWS CloudShell IaC IoT用語 トップアスリート NW管理コマンド ベンダー試験 ベンダー資格 データベース管理基礎 1日で学ぶ データベース管理者 基礎から始める メールサーバー インターネットサーバー Git実践 べからず集 ネットワーク管理プロトコル NW管理プロトコル ホスティング 10の力 Fargate AWS Fargate データ分析ツール ノーコード/ローコードで体験する Google Teachable Machine Google Colaboratory 新人PL 脆弱性診断ツール 時短テク 時短テクニック クラウドホスティング EBS EFS XAMPP TypeScriptで書く シェルスクリプトによる Webサーバー自動構築入門 Windows Serverでつくる DBセキュリティ 楽しく学ぶ TypeScriptコーディング シェルスクリプト作成 DOA Windows Server構築 TCP/IPモデル SQLの書き方 環境心理学 行動心理学 CIツール TortoiseGit MVCモデル JDBC モビリティ MaaS 移動革命 中小企業 デジタルマーケティング 量子コンピュータ 農業 農業DX リスキリング 学びなおし Gitコマンド実践 プロジェクト再生 プ譜 心構え プロダクト テックカンパニー 学習体験 スポーツIT DX実現 技術プレゼンテーション フィットネス イメージ構築 ロードマップ ファイル操作 AutoML アジャイル開発 Prometheus SIer SIerビジネス Unity キャリア設計 サバイブ戦略 資格試験 監視 主体性 思考法 哲学 コンポーネント指向 コミュニケーション戦術 自走型チーム Power Automate Power Automate for desktop SSL SSL(HTTPS)通信 HTTPS 個人情報保護法 創造的な仕事 Google Analytics アナリティクス オーラルケア スキルロードマップ ワークスタイル 組織づくり 勉強法 知的財産権 取引関連 新人向け 科目B HTTPクライアント PMBOK®第7版 システム導入プロジェクト ステートフル通信 プロジェクト戦略 統計 確率 関数 Word テクノロジー 温かいテクノロジー Salesforce バージョン管理システム  スクラム開発 AD AAD 新人指導 自律神経専門整体師 競技プログラミング アイディア タスク管 タスク管理 プロジェクト進行 モデリング技術 TCP コンテナ運用 仏教 LinuCレベル1 102試験 データ集計 パワークエリ ビジネスモデル ログ管理 社内会議運営 技術書 読書術 脳の生産性 行動力を高める 放送作家 セロトニン呼吸 自動化 幸せホルモン 手取りを増やす Webサイト構築 新NISA WAF ヨガ 若手社員 病態関連図 言語化 NISA ルーター設定 伝える技術 サーバー自動構築 営業向け 人事向け 会議 生成AI ヒアリング プログラミングの歴史 部下への目配り 部下への心配り ITエンジニアリング デザイン基礎 マクロ SNS SNS依存 イベント イベント演出論 データ基盤アーキテクチャ テレビの手法 サッカー ビジネスモデル仮説構築 セキュリティ芸人 教育 思考の言語化 日本史 歴史研究 コミュニケーション環境 チームの成果 チームワーク 人材育成計画 持続可能なチーム 自動アプリケーション登録 Google Cloudサービス GCP Cloud Pub/Sub 組織を動かす 法改訂 ICT基礎 レスポンシブ対応 持続可能なチームづくり 労働生産性向上 メンバー メンバー別コミュニケーション 成果を出す 研修 セキュリティ常識 スキル キーワード メリット 業界 分析 設計 新社会人 人的資本開示 語彙力 頻出キーワード

実践! Kubernetes 入門|研修コースに参加してみた

calendar_month2022-06-01 公開 update2022-06-02 更新

今回参加したコースは 実践! Kubernetes 入門 です。

IT インフラにおいてコンテナや Docker はすっかり定着しました。 ただ、クラウドでコンテナをオーケストレーションさせる Kubernetes はまだスキルを持った人が少ないのが現状です。

クラウドネイティブの目的は運用と自動化の改善のため、コンテナやKubernetes採用の最大の課題は社内のスキルや人材不足、ローカルではMinikubeとDocker Kubernetesが人気。Canonicalによる調査結果 - Publickey

学習コストが高いと評判なので、私も「 Kubernetes の用途は大規模運用なんでしょ」と参加前は学習しない言い訳していたのですが、講師の大澤さんが Kubernetes の特徴を上手くわかるようにコース設計されていたので、 “宣言的” で “自律的” という感覚を掴めて、「 サーバ 1 台でも全然やったらええやん」と、学習する気持ちになりました!

 

では、どんなコースだったのか、レポートします!

コース情報

想定している受講者 Docker の知識があるとより理解が深まりますが、はじめての人でも問題ありません
受講目標
  • Kubernetes とは何かを知る
  • Pod 、 Service 、 Deployment など、基本的な Kuberntes オブジェクトを理解する
  • kubectl コマンドで Kubernetes の簡単な操作ができる

講師紹介

このコースで登壇されたのは 大澤 文孝 さんです。

講師紹介


テクニカルライター/プログラマー、情報処理資格としてセキュリティスペシャリスト、ネットワークスペシャリストを取得。
Web システムの設計・開発とともに、長年の執筆活動のなかで、電子工作、 Web システム、プログラミング、データベースシステム、パブリッククラウドに関する書籍を多数執筆している。

    主な著書

  • 「さわって学ぶクラウドインフラ docker 基礎からのコンテナ構築」(共著 日経 BP 社刊)
  • 「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂 3 版」(共著 日経 BP 社刊)
  • 「ハンズオンで分かりやすく学べる Google Cloud 実践活用術 データ分析・システム基盤編 Google 監修」(日経 BP 社刊)
  • 「ハンズオンで分かりやすく学べる Google Cloud 実践活用術 AI・機械学習編 Google 監修」(日経 BP 社刊)
  • 「UI まで手の回らないプログラマのための Bootstrap 3 実用ガイド」(翔泳社 刊)
  • 「ゼロからわかる Amazon Web Services 超入門 はじめてのクラウド」(技術評論社 刊) など

Kubernetes とは

Kubernetes はなにをするものかというと、ざっくりいうと「複数台のサーバで複数のコンテナをオーケストレーションするツール」です。

ちなみに大澤さんに読み方を質問したところ、 「クーバネテス」だそうです。

  • 複数台のサーバを使う
    • 全台に kubernetes を動かす構成を組む
    • まとめたものを Kubernetes クラスタと呼ぶ
    • 仮想ネットワークでつなぐ
      • 物理的に離れていようが関係ない
  • ロードバランサや DNS (ラウンドロビン) などを配置する
    • 負荷分散する
  • サーバ 1 台でも OK

物理的に離れていようが関係ない、というのがクラウドらしい技術ですよね。 またサーバ 1 台でも OK というのはオーバーな気もしたのですが、実はそんなことはありませんでした。

Kubernetes と Docker Compose の違いとメリット

同じように複数のコンテナを動かす仕組みとして Docker Compose があります。 その違いと Kubernetes のメリットは何でしょうか。

  • Docker Compose はサーバ 1 台で管理する
    • ex. WordPress コンテナと DB コンテナを 1 台で動かす
    • 複数台では使えない
  • Kubernetes は自律的に動く
    • コンテナを自動で復旧したり、自動でコンテナに負荷分散する
  • サーバ 1 台から n 台にスケールできる

なるほど、 Kubernetes は学習コストの高いので、「大規模運用のときに使うものでしょ」と勝手にフィルターをかけていましたが、 1 台でもちゃんとそのコストに見合ったメリットがあるのですね。

Kubernetes の種類

Kubernetes と一口に言っても実は複数の OSS があります。 伺っていると、 Linux のディストリビューションのような印象を受けました。

  • Google が開発し、それを CNCF (Cloud Native Computing Foundation) に寄贈
  • いろいろな Kubernetes がある
  • 標準は kubeadm から入れる
  • 1 台で使う場合
    • minikube (このコースで使用)
  • 1 台~数台で使う場合

Kubernetes そのものは巨大なソフトウェアなので、構成しやすいように、試しやすいように派生したのかも知れませんね。

Kubernetes の仕組み

では、 Kubernetes はどのように動いているのか、その構成を紹介いただきました。

  • Kubernetes クラスタの中にあるサーバはマスターノードとワーカーノードにわかれる
    • マスターノードはワーカーノードをコントロールする
      • Kubernetes を操作する kubectl コマンドはマスターノードに対して行う
      • マスターノードは冗長構成にすることが普通
    • ワーカーノードにコンテナがある
      • サーバの処理能力やスケール状況によって台数などは変化
    • マスターノードとワーカーノードを 1 台におさめても OK
      • 開発環境やテストなどにはよい
  • マスターノードの中に kube-apiserver (kubectl とのインターフェイス) や Kubescheduler (ワーカーノードのスケジューラ) などがある
    • cloud-controller-manager がクラウドとのインターフェイスになっている(クラウド事業者が提供する)
  • 要は使うには、管理者が kuberctl コマンドを打てるように設定する必要がある

マスターノードの中にあるソフトウェアは OS のような役割が与えられているとイメージすると良いかも知れませんね(ワーカーノードが OS で動く各種ソフトウェアというイメージ)。

 

このほか、改めて「コンテナ」について解説いただきましたが、他コースでも触れていますので、ここでは割愛します。

Kubernetes を動かしてみよう

ここから実際に Kubernetes を使ってみましょう!

研修では SE カレッジで用意した Microsoft Azure の仮想マシンにインストールされた minikube を使って演習します。

読者の方で試したいという方がいらっしゃれば、下のドキュメントをもとに進めてみてください。

minikube start | minikube

minikube を起動

SSH で入り、早速 minikube を動かしてみましょう!

$ minikube start --driver=none
  minikube v1.22.0 on Ubuntu 20.04
✨  Using the none driver based on user configuration
  Starting control plane node minikube in cluster minikube
  Running on localhost (CPUs=2, Memory=7954MB, Disk=29598MB) ...
ℹ️  OS release is Ubuntu 20.04.2 LTS
  minikube 1.25.2 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.25.2
  To disable this notice, run: 'minikube config set WantUpdateNotification false'

# 中略

  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

動作確認がてら、設定ファイルを見てみます。

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/username/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Wed, 20 Apr 2022 05:56:57 UTC
        provider: minikube.sigs.k8s.io
        version: v1.22.0
      name: cluster_info
    server: https://10.0.0.4:8443
  name: minikube

# 中略

current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/username/.minikube/profiles/minikube/client.crt
    client-key: /home/username/.minikube/profiles/minikube/client.key

動作確認できました!

kubectl コマンド

続いて、 Kubernetes クラスタを操作する kubectl コマンドの前に操作の基本を紹介いただきました。

  • Kubernetes のポイントは “望ましい状態 (desired state)” を伝えること
    • ex. kubectl から “Web のコンテナは 3 つあるべき” とコマンドを出す
    • あとはマスターノードがよしなにやってくれる
    • 障害が発生して 1 台死んでも、マスターノードがワーカーノードに新しいコンテナを作るように指示する
      • ちなみにクラスタが死ぬとデータも消えるので、永続化は必須
  • kubectl で指示を出してからしばらく時間がかかる

なるほど、普通コマンドは「~をせよ。 次に~」と人間が命令を考えるところ、 Kubernetes では「これが正常だから、あとはいい感じに」(雑な表現でスイマセン … )ということを伝えるのですね。 これは面白い! 冒頭にあった “自律的に” というのはこういうことですね。

code kubectl の書式

$ kubectl config view
# kubectl コマンド サブコマンド オプション

Kubernetes オブジェクトと Pod

その “望ましい状態” を定義して、 Kubernetes が管理する対象が Kubernetes オブジェクトです。

  • 望ましい状態を管理するすべて(コンテナやネットワークやストレージ)
    • イメージ名とか環境変数とかいろいろ
  • Kubernetes API リファレンス に載っている
  • Pod と呼ばれるコンテナとボリューム(コンテナ間で使えるディレクトリ)のセット
    • Pod には IP アドレスがある
  • だいたいの Pod はコンテナ 1 つだけ
    • 1 つの Pod に複数のコンテナを使うのはコンテナ同士が連動する場合(ログの処理やバッチ処理など)
  • 間違った Pod の使い方
    • clear 1 つの Pod に WordPress コンテナと MySQL コンテナがある
    • なぜなら、複数の WP と MySQL が出来てしまう

この Pod はマニフェスト( Manifest )ファイルと呼ばれるもので定義します。 どんなものか見てみましょう。

  • YAML で書く
  • 利用できるのは空白でタブは NG
  • -: の次は空白を入れる
  • サンプル( Apache で Web サーバを立てる)
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      labels: 
        app: my-app
    spec:
      containers:
        - name: my-container
          image: httpd
          ports:
          - containerPort: 80

このマニフェストで作られた Pod は以下のようなイメージで生成されます。


マニフェストを書いて Pod を作ってみよう

では、 Pod を作ってみましょう。

  1. マニフェストファイルを作ろう(上記の YAML ファイル)
  2. 実行してみよう
    $ kubectl apply -f podexample.yaml
    pod/my-pod created
  3. 確認してみよう
    $ kubectl get pods
    NAME     READY   STATUS    RESTARTS   AGE
    my-pod   1/1     Running   0          2m15s
    • オプションで IP アドレスなどを見てみよう
      $ kubectl get pods -o wide
      NAME     READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
      my-pod   1/1     Running   0          3m55s   172.17.0.3   username   <none>           <none>
    • さらに詳しく見てみよう
      $ kubectl describe pods my-pod
      Name:         my-pod
      Namespace:    default
      Priority:     0
      Node:         username/10.0.0.4
      Start Time:   Wed, 20 Apr 2022 06:19:11 +0000
      Labels:       app=my-app
      Annotations:  <none>
      Status:       Running
      IP:           172.17.0.3
      IPs:
        IP:  172.17.0.3
      Containers:
        my-container:
          Container ID:   docker://e0552e1d3a73262372cbde322ad8bdcbd9ae54d35364bff6a4261ba80e689030
          Image:          httpd
          # 中略
          Mounts:
            /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-jxdlt (ro)
      Conditions:
        Type              Status
        # 中略
        PodScheduled      True
      Volumes:
        kube-api-access-jxdlt:
          Type:                    Projected (a volume that contains injected data from multiple sources)
      
      # 中略
      
      Events:
        Type    Reason     Age    From               Message
        ----    ------     ----   ----               -------
        Normal  Scheduled  4m51s  default-scheduler  Successfully assigned default/my-pod to username
        Normal  Pulling    4m51s  kubelet            Pulling image "httpd"
        Normal  Pulled     4m48s  kubelet            Successfully pulled image "httpd" in 2.150908329s
        Normal  Created    4m48s  kubelet            Created container my-container
        Normal  Started    4m48s  kubelet            Started container my-container
  4. Pod に接続してみよう
    $ curl http://172.17.0.3
    <html><body><h1>It works!</h1></body></html>
  5. アクセスログも見てみよう
    $ kubectl logs my-pod
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
    [Wed Apr 20 06:19:14.686070 2022] [mpm_event:notice] [pid 1:tid 140038973480256] AH00489: Apache/2.4.53 (Unix) configured -- resuming normal operations
    [Wed Apr 20 06:19:14.711492 2022] [core:notice] [pid 1:tid 140038973480256] AH00094: Command line: 'httpd -D FOREGROUND'
    172.17.0.1 - - [20/Apr/2022:06:25:56 +0000] "GET / HTTP/1.1" 200 45
    • コンテナの機能を使ってアクセスログを確認している

外部から接続できるようにしよう

先程はコンテナの機能を使ってアクセスログを出しましたが、今度は外部からアクセスしてみます。

  • Pod はワーカーノードの内部ネットワークで生きている

  • Service オブジェクトを使って外部アクセスできるようにする
    • Service がポートを結ぶ
  • ややこしいが、 Kubernetes クラスタごとに IP アドレスがある
    • ここから Service の IP をたどる
    • 方法は 3 つ

      • ワーカーノードの IP を経由して Sevice のポートにアクセスする NodePort
      • ロードバランサから Service のポートにアクセスする
        • 物理のロードバランサではなくクラウドが用意するロードバランサを使う
      • HTTPS プロキシを使う Ingress (アプリケーションレイヤ)
        • 使っている Kubernetes によって指定がある
    • 今回は汎用的に使える NodePort を使う

Docker と違ってもう一層 Kubernetes クラスタがあるので、このあたりはややこしい … 。

Service を作ってアクセスしてみよう

では、 Service を作ってアクセスしてみましょう。

  1. Service のマニフェストを作ってみよう
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      type: NodePort
      ports: 
      - nodePort: 30000
        port: 8080
        targetPort: 80
        protocol: TCP
      selector:
        app: my-app
    • my-app は pod 作成時に使った app: my-app を指定したから
    • 「イメージすることが大事です」と大澤さんのコメント

  2. 動かしてみよう
    $ kubectl apply -f serviceexample.yaml
    service/my-service created
  3. 確認してみよう
    $ kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          45m
    my-service   NodePort    10.96.136.173   <none>        8080:30000/TCP   50s
  4. 詳細を確認してみよう
    $ kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          45m
    my-service   NodePort    10.96.136.173   <none>        8080:30000/TCP   50s
    
    $ kubectl describe services my-service
    Name:                     my-service
    Namespace:                default
    
    # 中略
    
    Port:                     <unset>  8080/TCP
    TargetPort:               80/TCP
    NodePort:                 <unset>  30000/TCP
    Endpoints:                172.17.0.3:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
  5. 接続してみよう
    $ curl 172.17.0.3:80
    <html><body><h1>It works!</h1></body></html>
  6. ログを確認してみよう
    $ kubectl logs my-pod
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
    [Wed Apr 20 06:19:14.686070 2022] [mpm_event:notice] [pid 1:tid 140038973480256] AH00489: Apache/2.4.53 (Unix) configured -- resuming normal operations
    [Wed Apr 20 06:19:14.711492 2022] [core:notice] [pid 1:tid 140038973480256] AH00094: Command line: 'httpd -D FOREGROUND'
    172.17.0.1 - - [20/Apr/2022:06:25:56 +0000] "GET / HTTP/1.1" 200 45
    172.17.0.1 - - [20/Apr/2022:06:44:13 +0000] "GET / HTTP/1.1" 200 45
    172.17.0.1 - - [20/Apr/2022:06:45:45 +0000] "GET / HTTP/1.1" 200 45
    172.17.0.1 - - [20/Apr/2022:06:45:45 +0000] "GET /favicon.ico HTTP/1.1" 404 196
  7. ブラウザからアクセスしてみよう

Kubernetes を使ったサービスの外部公開の設定は、これまでとはちょっと違って複雑です。 大澤さんのイメージが無いと、どこのポートを使うのかわからなくなってしまうところでした。

Pod のデプロイ Deployment オブジェクト

先程は Pod を 1 つで作成したり、操作していましたが、 Pod を作る度に、 kubectl apply コマンドを個数分だけ実行することになってしまいます。

そこで登場するのがデプロイのためのオブジェクトです。

  • Pod は直接操作しない、作らない
    • そもそも 3 つ Pod を起動することはない
    • 自律的にならない
  • デプロイ用のオブジェクトがある
    • Deployment オブジェクト
      • Pod の更新時は新しく作り直す
      • 捨てやすくなるので、こっちを使うのが常道
      • スケールしやすくなる
    • Stateful オブジェクト
      • Pod のデータを保とうとする
      • あまり使わない

この Deployment オブジェクトがどのように動くのか、見てみましょう。


  • Deployment オブジェクトが実体の ReplicaSet オブジェクトを作る
    • Pod の更新が入ると、今の ReplicaSet を捨てて新しく作る
    • ただし一斉に変わるわけではなく、だんだん Pod を新しくしていく

こういうところがクラウドネイティブらしく、イミュータブルで自律的ですね!

なお、大澤さんから補足があり、「この Deployment から Pod を作るので、先程触れた Pod を 1 つ作るやり方は忘れてください」とのことでした。

Deployment オブジェクトを使ってみよう

では、 Deployment オブジェクトを使って、 Pod を作成してみましょう!

  1. Deployment オブジェクトのマニフェストを書こう
    • レプリカ数やコンテナの定義(イメージやポートなどの設定)などを書く
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: httpd
            ports:
            - containerPort: 80
  2. 動かしてみよう
    $ kubectl apply -f deployexample.yaml
    deployment.apps/my-deployment created
  3. 確認してみよう
    $ kubectl get deployments
    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-deployment   3/3     3            3           45s
  4. ReplicaSet があるか確認してみよう
    $ kubectl get replicasets
    NAME                       DESIRED   CURRENT   READY   AGE
    my-deployment-5bc688cdbf   3         3         3       94s
    $ kubectl get pods -o wide
    NAME                             READY   STATUS    RESTARTS   AGE    IP           NODE       NOMINATED NODE   READINESS GATES
    my-deployment-5bc688cdbf-5vnsh   1/1     Running   0          2m7s   172.17.0.4   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9kgqx   1/1     Running   0          2m7s   172.17.0.3   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9sgzb   1/1     Running   0          2m7s   172.17.0.5   se0830-m   <none>           <none>
  5. Service を作ってみよう
    • もともと selector で指定しているので 3 つの my-app の上にあたる
    $ kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          83m
    my-service   NodePort    10.100.105.10   <none>        8080:30000/TCP   10s
  6. 確認してみよう
    $ kubectl describe services my-service
    Name:                     my-service
    Namespace:                default
    Labels:                   <none>
    Annotations:              <none>
    Selector:                 app=my-app
    Type:                     NodePort
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.100.105.10
    IPs:                      10.100.105.10
    Port:                     <unset>  8080/TCP
    TargetPort:               80/TCP
    NodePort:                 <unset>  30000/TCP
    Endpoints:                172.17.0.3:80,172.17.0.4:80,172.17.0.5:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    • 今の状態

動作確認ができたところで、今度は Deployment オブジェクトを使うと、スケールと更新がカンタンなことを試してみましょう!

まずはスケールです。

  1. Pod の数を増やしてみよう
    $ kubectl scale --replicas=5 deployment/my-deployment
    deployment.apps/my-deployment scaled
  2. 確認してみよう
    $ kubectl get pods -o wide
    NAME                             READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
    my-deployment-5bc688cdbf-5vnsh   1/1     Running   0          9m57s   172.17.0.4   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9d6tr   1/1     Running   0          27s     172.17.0.7   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9kgqx   1/1     Running   0          9m57s   172.17.0.3   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9sgzb   1/1     Running   0          9m57s   172.17.0.5   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-d2s5s   1/1     Running   0          27s     172.17.0.6   se0830-m   <none>           <none>

今度は更新です。

  1. apache から nginx に変えてみよう
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: nginx
            ports:
            - containerPort: 80
  2. 動かしてみよう
    $ kubectl apply -f deployexample_nginx.yaml
    deployment.apps/my-deployment configured
    se0830-m@se0830-m:~$ kubectl get pods -o wide
    NAME                             READY   STATUS        RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
    my-deployment-5bc688cdbf-5vnsh   1/1     Terminating   0          12m     172.17.0.4   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9d6tr   0/1     Terminating   0          3m14s   172.17.0.7   se0830-m   <none>           <none>
    my-deployment-5bc688cdbf-9kgqx   1/1     Running       0          12m     172.17.0.3   se0830-m   <none>           <none>
    my-deployment-5d4f4fc997-nvbjw   1/1     Running       0          4s      172.17.0.6   se0830-m   <none>           <none>
    my-deployment-5d4f4fc997-nzfk7   0/1     Pending       0          0s      <none>       se0830-m   <none>           <none>
    my-deployment-5d4f4fc997-x7t4f   1/1     Running       0          8s      172.17.0.8   se0830-m   <none>           <none>
    • 徐々に変わっている

このあと、ロールバックもやってみましたが、とてもカンタンにできました。

こうやってマニフェストで “望ましい状態” を定義・更新して実行するのは、フロントエンドなどでも出てくる「宣言的」と同じように感じてきました。 と思ったら、 Kubernetes も同じ言葉を使っていたのですね。

3位 宣言的なAPIと自動化
Kubernetesの基本的なコンセプトの1つに、APIが命令的(Imperative)ではなく宣言的(Declarative)であることがあります。
いわば命令的というのはマニュアル運転で、宣言的というのは自動運転のようなものです。
Kubernetesが注目され続ける5つの理由。 KubeCon + CloudNativeCon North America 2018 - Publickey より

永続ボリューム(PersistentVolume)

では、最後のテーマです。 Docker も同じですがコンテナは捨てると、データを保持できないので永続化が必要です。 Kubernetes も同様に必要です。

  • Docker のボリュームマウントと同じ
  • 2 つのディスクを定義する
    • PersistentVolume
      • 実際使用するディスク
    • PersistantVolumeClaim
      • 使用したいディスクの定義を書く
      • インターフェイスの役割
      • それに合致したディスクを割り当てる

永続ボリュームを作ってみよう

では、実際永続ボリュームを作ってみましょう。 なお設定は Kubernetes の種類によって変わります。 今回は minikube での設定です。

  1. PersistentVolume マニフェストを作ってみよう
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-volume
    spec:
      accessModes:
      - ReadOnlyMany
      capacity:
        storage: 5Mi
      storageClassName: standard
      hostPath:
        path: /data/example
  2. PersistentVolumeClaim マニフェストを作ってみよう
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-volume-claim
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Mi
      storageClassName: standard
      volumeName: my-volume
  3. Pod での定義例
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: httpd
            ports:
            - containerPort: 80
            volumeMounts:
            - name: my-volume-storage
              mountPath: /usr/local/apache2/htdocs
          volumes:
            - name: my-volume-storage
              persistentVolumeClaim:
                claimName: my-volume-claim
  4. 作ってみよう
    $ kubectl apply -f persistent.yaml
    persistentvolume/my-volume created
    $ kubectl apply -f deployexample_persistent.yaml
    deployment.apps/my-deployment created
  5. 確認してみよう
    $ kubectl get pods
    NAME                             READY   STATUS    RESTARTS   AGE
    my-deployment-8584ffd4dd-m26sv   1/1     Running   0          66s
    my-deployment-8584ffd4dd-pwj7g   1/1     Running   0          66s
    my-deployment-8584ffd4dd-vgxsc   1/1     Running   0          66s
    
    # 中略
    
    Volumes:
      my-volume-storage:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  my-volume-claim
        ReadOnly:   false
      kube-api-access-qq95g:
        Type:                    Projected (a volume that contains injected data from multiple sources)
    
    # 中略
    
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  84s   default-scheduler  Successfully assigned default/my-deployment-8584ffd4dd-vgxsc to se0830-m
      Normal  Pulling    83s   kubelet            Pulling image "httpd"
      Normal  Pulled     81s   kubelet            Successfully pulled image "httpd" in 2.104436267s
      Normal  Created    81s   kubelet            Created container my-container
      Normal  Started    81s   kubelet            Started container my-container

では、永続化できているか確認してみましょう。

  1. ファイルを置いてみよう
    $ sudo sh -c "echo '<html><body>Hello k8s</body></html>'" > /data/example/index.html

マウントされていることを確認したところで、このコースは修了しました。

まとめ

Kubernetes を動かしながら、その特徴と仕組みを学びました。

コース中、何度も大澤さんがおっしゃったように Kubernetes では直接コンテナを操作するというより、「望ましい状態」を定義して、それを保つように自律的に動きます。 “自律” や “宣言的” というのがピンときていませんでしたが、自分で体験して動作を確認すると、具体的にイメージできるようになりました。

Kubernetes だけでなく、クラウドネイティブな技術の特徴を掴むのに、とてもおすすめのコースでした!

 


SEカレッジについて

label SEカレッジを詳しく知りたいという方はこちらから !!

SEcollege logo
SEカレッジ
IT専門の定額制研修 月額 28,000 円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 講座をほぼ毎日開催中!!

免除修了試験 Q & A

タグ一覧