タグ

ブックマーク / deeeet.com (17)

  • Kubernetes YAMLの壁

    Kubernetes に入門しようする人を躊躇させる原因のひとつは間違いなくYAMLによる設定ファイルだろう.Kubernetesにアプリケーションをデプロイするとき,例えそれがシンプルなサーバーアプリケーションであっても,多くのYAMLファイルを手で記述する必要がある.初心者を慄かせるその大量のYAMLはよくwall of YAMLYAMLの壁)などと揶揄される. 初心者でなくてもKubernetesYAMLは煩わしい.YAML自体は単なるKubernetes APIへのリクエストボディであり慣れてしまえば実はそんなに難しくない.しかし記述する内容のほとんどがBoilerplateであり何度も書いていると飽き飽きする(実際にはほとんどがコピペだが).あるアプリケーションの開発環境と番環境のYAMLファイルをいかに効率的に管理するかについて決定的な方法もない. そもそもKuberne

  • GolangでAPI Clientを実装する

    特定のAPIを利用するコマンドラインツールやサービスを書く場合はClientパッケージ(SDKと呼ばれることも多いが記事ではClientと呼ぶ)を使うことが多いと思う.広く使われているサービスのAPIであれば大抵はオフィシャルにClientパッケージが提供されている.例えば以下のようなものが挙げられる. https://github.com/aws/aws-sdk-go https://github.com/Azure/azure-sdk-for-go https://github.com/PagerDuty/go-pagerduty https://github.com/hashicorp/atlas-go 特別使いにくい場合を除けば再実装は避けオフィシャルに提供されているものを使ってしまえばよいと思う(まともなものなら互換性などをちゃんと考慮してくれるはずなので).一方で小さなサービ

  • 複数プロジェクトを抱えるチームでのデプロイ自動化

    複数プロジェクトを抱えるチームでのデプロイ自動化 1つのチームで,10以上のプロジェクト,コードベースを抱える場合にどのようにデプロイの自動化を進めたか,工夫したこと,考慮したことなどをまとめておく. デプロイツールには,Python製のfabricを採用しているが,他のツールでも同様のことはできそう.なお,fabricの基的な使い方などは既にインターネット上に良い記事がたくさんあるので書かない(最後の参考の項を見てください). fabricの選択 シェルスクリプトとCapistranoを考慮した. まず,シェルスクリプトは人によって書き方が違うため,統一が難しくメンテナンスコストも高い.また共通化も難しい. 次に,Capistranoは,裏でやってくれることが多く,学習コストも高い.プロジェクトによってはかなり特殊な環境へのデプロイも抱えているため,Capistranoの前提から外れる

    okinaka
    okinaka 2016/06/09
  • Hashicorp Ottoを読む

    Hashicorpから2015年秋の新作が2つ登場した. Otto - HashiCorp Nomad - HashiCorp Ottoがなかなか面白そうなのでコードを追いつつ,Ottoとは何か? なぜ必要になったのか? どのように動作するのか? を簡単にまとめてみる. バージョンは 0.1.0 を対象にしている(イニシャルインプレッションである) Ottoとは何か? 公式はVagrantの後継と表現されている.が,それはローカル開発環境の構築も担っているという意味で後継であり,自分なりの言葉で表現してみると「OttoはHashicorpの各ツールを抽象化し開発環境の構築からインフラの整備,デプロイまでを一手に担うツール」である.ちなみにOttoという名前の由来はAutomationと語感が似ているからかつ元々そういう名前のbotがいたからとのこと. なぜOttoか? なぜVagrantで

    okinaka
    okinaka 2015/10/05
  • デプロイ自動化とServerspec

    Serverspecの献ありがとうございました.とても面白かったです.詳しい書評はすでに素晴らしい記事がいくつかあるので,僕は現チームでどのようにServerspecを導入したか,どのように使っているかについて書きたいと思います. Serverspec導入の背景 今のチームではサーバーのセッアップおよびデプロイにChefを使っている.にも書かれているようにこのような構成管理ツールを使っている場合はそのツールを信頼するべきであり,Serverspecのようなテストツールは必要ない.僕らのチームもそのような理由でServerspecの導入には至っていなかった. しかしアプリケーションが複雑になりChefのレシピも混沌とするようになるとそれは成立しなくなる.見通しの悪いレシピはChefへの信頼度を落とす.信頼度の低下はデプロイ不信に繋がり人手(筋肉)によるテストが始まる. サーバーの数がそ

  • etcd/consulに認証情報を安全に保存する

    etcd/consulに認証情報を安全に保存する 分散Key-Valueストアとしてetcdやconsulの利用が増えている.ここにアプリケーションの設定値などを保存し,各ホストからそれらを購読して利用する. また,X-as-a-Serviceといった外部サービスの利用も多くなってきた.その場合API Tokenやパスワードといった認証情報が必要になる.PaaSやTwelve-factor的なアーキテクチャを採用する場合は,それらの値を環境変数に保存して利用することが多い(危険であるという意見はある.cf. http://techlife.cookpad.com/entry/envchain).etcdやconsulといった分散Key-Valueストアの利用を前提としたアーキテクチャでは,そこに外部に漏らしたくない設定値も一緒に保存してしまうのがシンプルになる. しかし,そういった設定値を

  • Fleetの使い方,Unitファイルの書き方

    Fleetの使い方,Unitファイルの書き方 CoreOSに入門した | SOTA CoreOSではすべてのアプリケーションをDockerで動かす.このとき,コンテナによるサービスをCoreOSクラスタのどのマシンで起動するかをいちいち人手で決めるわけにはいけない.クラスタ内のリソースの状態や動いているサービスに基づき,適切なマシンでコンテナを動かすスケジューリングの仕組みが必要になる. このスケジューリングとコンテナの管理にCoreOSはfleetを用いる. fleetを使うとCoreOSクラスタが1つのinit systemで動いているかのようにそれを扱うことができるようになる.開発者はどのマシンでどのDockerコンテナが動いているかを気にする必要がなくなる. 例えば,5つのコンテナを動かす必要があれば,fleetはクラスタのどこかでその5つのコンテナが動いてることを保証する.もしコ

  • わかりやすいREADME.mdを書く

    GitHubなどに自分のツールやライブラリを公開するとき,README.mdは重要な役割を担っている.レポジトリを訪れたユーザが自分のツールを使ってくれるか否かの第一歩はREADME.mdにかかっている,と言っても過言ではない.実際自分が使う側になったときも,まずREADME.mdを読んで判断していると思う. 成功しているプロジェクトを参考にしつつ,自分が実践していることをまとめておく.ここに書いていることはあくまで(自分の中で)最低限的なものである.プロジェクトが成長していくにつれてREADMEはあるべき姿に成長していくべきだと思う. READMEの役割 README.mdには大きく2つの役割がある. プロジェクト,ツールの使い方,インストール方法 プロジェクト,ツールの宣伝 元々READMEは前者の役割しかなかったが,GitHubの仕組み上,後者の役割も徐々に重要になっている. さらに

    okinaka
    okinaka 2014/08/01
  • HerokuのAPIデザイン

    Herokuが自ら実践しているAPIデザインガイドをGithubに公開した. “HTTP API Design Guide” このガイドは些細なデザイン上の議論を避けて,ビジネスロジックに集中すること目的としている.Heroku特有なものではなく,一般にも十分適用できる知見となっている. 最近は,モバイル向けにAPIをつくることも多いため,勉強もかねて抄訳した.なお内容は,HTTP+JSONのAPIについて基的な知識があることが前提となっている. 適切なステータスコードを返す それぞれのレスポンスは適切なHTTPステータスコード返すこと.例えば,“成功"を示すステータスコードは以下に従う. 200: GETやDELETE,PATCHリクエストが成功し,同時に処理が完了した場合 201: POSTリクエストが成功し,同時に処理が完了した場合 202: POSTやDELETE,PATCHリク

    okinaka
    okinaka 2014/06/05
  • Dockerのネットワークの基礎

    今までいろいろ触ってきて,Dockerネットワーク周りに関しては何となくは理解していたが,人に説明できるほど理解してなかったのでまとめておく.基は,Advanced networking - Docker Documentationがベースになっている. 仮想ブリッジの仕組み Dockerのネットワークは,仮想ブリッジdocker0を通じて管理され,他のネットワークとは隔離された環境で動作する. Dockerデーモンを起動すると, 仮想ブリッジdocker0の作成 ホストの既存ルートからの空きのIPアドレス空間を検索 空きから特定の範囲のIPアドレス空間を取得 取得したIPアドレス空間をdocker0に割り当て が行われる. コンテナを起動すると,コンテナには以下が割り当てられる. docker0に紐づいたveth(Virtual Ethernet)インターフェース docker0に割り

  • Vagrant1.6のDocker provider

    Vagrant1.6のDocker provider Feature Preview: Docker-Based Development Environments Vagrant 1.6からDocker providerがサポートされた.つまり,VagrantでVMだけでなくコンテナも管理できるようになった. この機能はネイティブでDockerをサポートしてないOSXでも使え,この場合は裏側でProxy VM(boot2docker box)が勝手に立ち上がって,その上でコンテナが立ち上がる.つまり,以下のようになる. OSX -> (Proxy VM) -> Docker Container OSXの場合,これは今までboot2dockerを使ってやってきたのと変わらない.ただ,Docker providerを使うと,boot2dockerの立ち上げまで面倒を見てくれる. 何が嬉しいのか

  • DotenvではなくDirenvを使う

    DotenvではなくDirenvを使う Dotenvは,.envファイルから環境変数を読み込むためのツール.他人には共有したくないパスワードやキーなどを.envに環境変数として記述しておき,実行時にそれを読み込むといった使い方をする.例えば自分は,vagrantからDigitalOceanを使う際に,CLIENT_IDやAPI_KEYを.envに記述してVagrantfileでそれを読み込むという使い方をしていた. ただ,Dotenvは汎用性が低い.Dotenvを有効にするには,プログラム内から明示的にDotenv.loadを呼ぶ必要がある,もしくは,dotenvでプログラムを起動する必要がある.例えば,test-kitchenのdigitaloceanドライバーを使う際には,vagrantの場合と同様にCLIENT_IDやAPI_KEYが必要になる.しかし,test-kitchenでユー

  • Dockerとは何か?どこで使うべきか?

    この記事はDockerに関する実験的な記事や,Buildpackを使ってHeroku AppをDocker Containerとして使えるようにする“building”の開発などで知られるCenturyLink Labsの “What is Docker and When To Use It”の翻訳です. Dockerとは何か?Dockerをどこで使うべきか?についてよく見かける記事とは違った視点から説明されています. 翻訳は許可をとった上で行っています. Dockerとは何でないか Dockerとは何かを説明する前に,Dockerは何でないかについて述べる.Dockerの否定形は何か?Dockerの制限は何か?Dockerが得意でないことは何か? DockerLXCのようなLinux Containerではない DockerLXCだけのラッパーではない(理論的には仮想マシンも管理でき

  • Packerを使ってChef/Puppet/AnsibleでDockerのイメージをつくる

    Packerを使ってChef/Puppet/AnsibleでDockerのイメージをつくる Packerは,Vagrantの作者であるMitchell Hashimoto氏によって開発が進められているVirtualBoxやVMWare,Amazon EC2などの仮想マシンのテンプレートの作成を行うツール.VagrantのVirtualBox用のBoxを作るveeweeに置き換わるツールとして知られている.最近のアップデートDockerのイメージのビルドをサポートした. TL;DR Packerを使えばDockerのイメージをDockerfileを使わずビルドすることができる つまり,Dockerfileの特有な記述を使わず,今まで慣れ親しんできたChefやPuppet,Ansibleのようなプロビジョニングツールを使ってDockerのイメージをビルドできる. 参考 Dockerイメージの

  • "実践Vagrant"を読んだ

    "実践Vagrant"を読んだ O’Reilly Japan - 実践 Vagrant Vagrantは普通に問題なく使えているし,をわざわざ読む必要もないと思ったが,以下のようなモチベーションで購入. Mitchell Hashimoto氏の設計思想的な部分を知りたかった プラグインをつくりたかった 落ち穂拾い まず,設計思想.1章に”Vagrant道”という節があり,ユースケースというか,Vagrantを使った高レベルなワークフローが説明されている.開発者や運用技術者からみて,普段のプロジェクトの中でVagrantがどのような役割を果たすのかが簡単にまとめられている.Vagrantが近年の開発環境にあまりに自然に入り込んできたのは,このようなビジョンがあってからこそだと思う.誰もが理解できるビジョンを掲げ,それをコードに落とし込むところがMitchell氏のすごさなんだと改めて認識し

  • Vagrant + DockerでSinatraを動かす

    Vagrant + DockerでSinatraを動かす tcnksm/docker-sinatra 簡単なsinatraアプリケーションをDocker上で動かしてみた. まずはsinatraアプリケーション.特別なことはなく,Procfileとconfig.ruを準備して,foremanで動かす.外部からのアクセスを有効にするため,ListenAddressを指定しておく. #Procfile web: bundle exec rackup config.ru -p 4567 -s thin -o 0.0.0.0 次に,Vagrantの設定.VagrantはDockerのprovisioningが有効な1.4を利用する.vagrantのインストールは以下のBrewfileを準備して,brew bundleする. tap phinze/homebrew-cask install brew-

  • Dockerで継続的インテグレーション | SOTA

    Dockerで継続的インテグレーション Dockerで複数バージョンのrubyがインストールされたイメージを作るを使って,ローカルでTravis CI的なビルドテストを実現する方法を書く. 準備 (OS X) Vagrantを使う.バージョン1.4からはDockerのprovisioningに対応してるのでそれを使う. Download Vagrant - Vagrantより.dmgをダウンロードしてきてインストール. インストールしたら,rubyプロジェクトに移動して以下を実行する. vagrant init precise64 http://files.vagrantup.com/precise64.box Vagrantfileを以下のように編集する.ここでは,docker-rbenvで作成した,複数バージョンのruby (1.8,7と1.9.3,2.0.0)とそれぞれにbundle

  • 1