2018年3月24日土曜日

OpenShift をサクッと試せる minishift を試してみた

概要

OpenShift は簡単に言ってしまえば kubernetes のエンタープライズ版になります
実際はライセンスを購入する必要がありますが簡単に試せる minishift というツールがあったので試してみました

環境

  • macOS 10.13.2
  • minishift v1.14.0+1ec5877
  • VirtualBox 5.1.30r118389

インストール

  • brew cask install minishift

今回は Mac なのでこれでインストールできます

minishift サーバの起動

  • minishift start --vm-driver=virtualbox

VirtualBox 上に minishift サーバ兼コンテナホスト VM を 1 つ立ててくれます
OS は minishift-b2d-iso という専用の OS を使っているようです
ISO やバイナリ、イメージのダウンロードが実行されるのである程度時間がかかります

Mac 上に Openshift 上のコンテナホストおよびコンテナを制御する oc コマンドがインストールされているので以下のコマンドで PATH に通します

  • eval $(minishift oc-env)

これで oc コマンドが使えるようになります
一応確認で oc version と打ってみてください
後述している証明書のエラーが出なければ完了です

minishift サーバ確認

VirtualBox 上に構築された VM の中を確認してみましょう

  • minishift ssh

で boot2docker のコンテナホストにログインしましょう
docker ps -a で確認するとすでにいくつかのコンテナが起動しているかと思います
minishift を動作させるのに必要なコンテナになるのでそのままにしておきます

管理画面

https://192.168.99.100:8443 にアクセスしてみましょう
192.168.99.100 は構築した minishift サーバのアドレスです

デフォルトは developer ユーザもしくは system ユーザでログインできます
developer ユーザはパスワードなしになっています
system ユーザのパスワードは「admin」です

まだ何もないですが以下のような UI が表示されるはずです
openshift1.png

コンテナを起動してみる

先の程の system ユーザを使って作業します
Mac 上の oc コマンドを使って制御します

まずはログインします
ログインしないで作業すると error: Error from server (Forbidden) というエラーになり進みません

  • oc login -u system

パスワードは admin と入力してください
次に test という名前のプロジェクトを作成します
ちなみにコマンドからプロジェクトを作成すると管理画面でも確認することができます

  • oc new-project test
  • oc project test

ログイン、プロジェクトの選択できたらアプリを作成します
アプリを作成するとコンテナも作成されます

  • oc new-app https://github.com/openshift/nodejs-ex -l name=myapp

-l オプションでラベルを付与することであとで削除しやすくしておきます
イメージの push などがあるので多少時間がかかります
コンテナができているか確認してみましょう

  • oc get pods
NAME                READY     STATUS      RESTARTS   AGE
nodejs-ex-1-build   0/1       Completed   0          3m
nodejs-ex-1-t9z5s   1/1       Running     0          9s

nodejs-ex-1-t9z5s というアプリ陽のコンテナが作成されました
build コンテナは Complelted になっていれば OK です
build コンテナのログを確認してみましょう

  • oc logs -f bc/nodejs-ex

これで「Push successful」 になっていれば OK です
OpenShift 内にあるプライベートリポジトリにイメージを push してそこからコンテナを起動しています
ちなみに bc は buildconfigs の略で OpenShift ではこれをリソースと読んでいます
リソースには様々な種類あり例えば dc は deploymentconfigs の略になります
ちなみに先ほどの new-app で buildconfigs, builds, imagestreams, deploymentconfigs, po, rc, svc のリソースが作成されています

外部からアクセスできるようにする

あとは外部からアクセスできるようにするだけです

  • oc expose svc/nodejs-ex

これで OK です
内部に DNS がありドメインを振ってくれています

  • oc status

でアクセスする URL が確認できます

http://nodejs-ex-test.192.168.99.100.nip.io to pod port 8080-tcp (svc/nodejs-ex)
  dc/nodejs-ex deploys istag/nodejs-ex:latest <-
    bc/nodejs-ex source builds https://github.com/openshift/nodejs-ex on openshift/nodejs:6 
    deployment #1 deployed 4 minutes ago - 1 pod

動作確認

内部のドメインにアクセスしてみましょう
http://nodejs-ex-test.192.168.99.100.nip.io

するとアプリにアクセスできると思います
openshift2.png

  • minishift openshift service nodejs-ex --in-browser -n test

でも確認できます

後処理

  • oc delete all -l name=myapp

で一通りのリソースを削除後

  • minishift stop

で OK です
サーバも不要な場合は minishift delete してください

Tips

Unable to connect to the server: x509: certificate signed by unknown authority

oc コマンド実行時に Unable to connect to the server: x509: certificate signed by unknown authority というエラーが出た場合には ~/.kube ファイルを一旦削除してから minishift start するようにしてください
どうやら oc コマンドが .kube ディレクトリを見ているようで同じホスト上で minikube を先に実行していると .kube ディレクトリがすでに出来ているようで minishift 用の .kube ディレクトリができていないみたいです
またすでに minishift start してしまっている場合は一旦 delete して再度 start する必要があります

  • minishift stop
  • minishift delete
  • rm -rf ~/.minishift
  • rm -rf ~/.kube
  • minishift start

oc login 時の注意

またログインする際に oc login -u system:admin という感じでログインするとユーザ名が「system:admin」という名前になってしまい管理画面などでプロジェクトを確認することができません
パスワードを指定する場合は -p オプションで指定するので注意してください
もしログイン先が間違っていると minishift openshift service nodejs-ex --in-browser -n test したときもそんなプロジェクトないと言われてエラーになってしまいます

コマンド

すべてのリソースを確認

  • oc get all

リソースの詳細を確認

  • oc describe svc/nodejs-ex

指定したリソースの取得

  • oc get svc

現在のプロジェクトの確認

  • oc project

最後に

minishift を Mac + VirtualBox で試してみました
名前からピンと来ている人はいると思いますが minishift は minikube の fork プロジェクトです
コマンドなども少し似ています
なので minikube に慣れている人であれば minishift は簡単に理解できると思います

まだ軽くしか触っていないので詳しくは不明ですが kubernetes にユーザ管理やプロジェクトの概念が追加されている感じです
また事前に準備されているカテゴリからアプリを簡単に展開することもできます
イメージ的には Rancher に近い感じだと思います

参考サイト

2018年3月23日金曜日

コンテナオーケストレーションツールの Rancher を試してみた

概要

Rancher は kubernetes などのコンテナマネージメントツールを更にラップして簡単にコンテナマネージメントをできるオーケストレーションツールになります
要するに kubernetes の難しい概念などを吸収して使いやすくしてくれています
それに加えて kubernetes にない ACL などの機能も提供してくれます
とりあえず今回は Rancher サーバを構築してコンテナホストの追加と挙動の確認まで行ってみました

環境

Rancher サーバ

  • macOS 10.13.2
  • Rancher v1.6.14

コンテナホスト

  • vagrant 2.0.3
  • VirtualBox 5.1.30r118389
  • Ubuntu 16.04
  • docker 17.12.1-ce, build 7390fc6

構成

Rancher サーバの起動

Mac 上でコンテナを起動するだけです

  • docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:stable

http://172.28.128.1:8080/ にアクセスできます
172.28.128.1 は vboxnet1 が刺さっているローカルの Mac です

コンテナホストの追加

今回は vagrant を使って Mac 上に Ubuntu 16.04 を構築してそこに dockerd をインストールしました
https://hawksnowlog.blogspot.jp/2018/03/install-vagrant-on-macos-high-sierra.html

Rancher には docker-machine の機能が実装されており、docker-machine で使えるドライバを使えば EC2 や digitalOcean に自動で構築することもできるようです

コンテナホストができたら Rancker 用のエージェントコンテナを起動します

  • docker run -e CATTLE_AGENT_IP="172.22.128.1" --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.9 http://172.28.128.1:8080/v1/scripts/277730D04E89F34BABFE:1514678400000:7Ob2cE0CNfOeYCsrbQOYHg24go
INFO: Running Agent Registration Process, CATTLE_URL=http://172.28.128.1:8080/v1
INFO: Attempting to connect to: http://172.28.128.1:8080/v1
INFO: http://172.28.128.1:8080/v1 is accessible
INFO: Inspecting host capabilities
INFO: Boot2Docker: false
INFO: Host writable: true
INFO: Token: xxxxxxxx
INFO: Running registration
INFO: Printing Environment
INFO: ENV: CATTLE_ACCESS_KEY=7FCF2ED7B53F4910177A
INFO: ENV: CATTLE_AGENT_IP=172.22.128.1
INFO: ENV: CATTLE_HOME=/var/lib/cattle
INFO: ENV: CATTLE_REGISTRATION_ACCESS_KEY=registrationToken
INFO: ENV: CATTLE_REGISTRATION_SECRET_KEY=xxxxxxx
INFO: ENV: CATTLE_SECRET_KEY=xxxxxxx
INFO: ENV: CATTLE_URL=http://172.28.128.1:8080/v1
INFO: ENV: DETECTED_CATTLE_AGENT_IP=172.17.0.1
INFO: ENV: RANCHER_AGENT_IMAGE=rancher/agent:v1.2.9
INFO: Launched Rancher Agent: d928df0e9a8326fc857a0b3295fc5f81419adffd912c6a130bdb8fa80340decb

成功時のログは上記の通りです

エージェント側から Rancher サーバが見える必要があります
このコマンドは Rancher の管理画面から生成することができます
http://172.28.128.1:8080/env/1a5/infra/hosts/add?driver=custom

rancher1.png

エージェント用のコンテナが起動すると別のコンテナが 10 個起動するようです
管理画面 (Stacks -> All) で見ると Stack とそれぞれのコンテナがカテゴライズされているのがわかります
rancher2.png

コンテナを立ち上げてみる

docker コマンドでもできますが、せっかくなので UI から立ち上げてみます

INFRASTRUCTURE -> Containers -> Add Container

で新規でコンテナを立ち上げることができます
DockerHub にあるrancker3.pngイメージ名とポートしています

これで立ち上がると以下のようにメトリックを確認することができます
rancker4.png

Public に公開されている IP はコンテナホスト上の docker0 インタフェースに付与された IP のようです
172.28.128.3 の vboxnet1 のネットワークではないようです

最後に

Rancher を試してみました
今回は単一のコンテナを立ち上げただけなので Stack や Service の機能の仕組みは使っていません
Stack は複数のコンテナ定義を登録しておくことができる機能です
docker-compose.yml を登録することもできるます
更に LoadBalancer なども登録することができます
Service はコンテナ定義や LoadBalancer など Stack に登録することができるコンポーネントの単位になります

なので基本は Stack でアプリの定義をしたあとで Stack 単位でアプリの起動やスケールアウトを行っていきます

また今回は Ubuntu を構築してわざわざ docker をインストールしました
初めは docker-machine の virtualbox ドライバを使って構築したのですがどうやら boot2docker ではエージェントが動作しないようなので仕方なく Ubuntu を構築しました

参考サイト

2018年3月22日木曜日

macOS High Sierra に Vagrant をインストールして Ubuntu を構築する

概要

macOS High Sierra に Vagrant をインストールしてみました
ついでに Ubuntu を構築してみました

環境

  • macOS 10.13.2
  • vagrant 2.0.3
  • VirtualBox 5.1.30r118389

Vagrant のインストール

公式サイトから dmg をダウンロードしてインストールする必要があります
今回は vagrant_2.0.3_x86_64.dmg というインストーラがダウンロードできました

ダウンロードできたらダブルクリックして開きましょう
そして vagrant.pkg をダブルクリックして起動します
vagrant1.png

あとはインストーラの指示に従ってインストールすれば OK です
vagrant2.png

ターミナルを起動してコマンドが使えるか確認してみましょう

  • vagrant -v

Vagrant 2.0.3 と表示されれば OK です

Ubuntu を構築する

適当な作業用ディレクトリを作成しそこに Vagrantfiile を配置して構築します

  • mkdir -p /path/to/vagrant/ubuntu
  • cd /path/to/vagrant/ubuntu
  • touch Vagrantfilie
  • vim Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.network "private_network", type: "dhcp"
end
  • vagrant up

で起動します
今回は直接サーバにアクセスするので Host Only Adapter のネットワークを追加しています

ちなみに xenial64 だと Ubuntu 16.04 になります
他のバージョンの Ubuntu はこちらを参照してください

動作確認

  • vagrant ssh
  • ip a show

(一部抜粋)

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:64:a1:33 brd ff:ff:ff:ff:ff:ff
    inet 172.28.128.3/24 brd 172.28.128.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe64:a133/64 scope link 
       valid_lft forever preferred_lft forever

すでに vboxnet1 がすでにある環境で private_network を指定すると新規で vboxnet2 が出来て 172.28 帯を割り当てるようです
ホストマシンは 172.28.128.1 が割り当たっていました
ホストマシンから 172.28 帯でアクセスすることもできるようになっています

その他

停止

  • vagrant halt

削除

  • vagrant detroy

VirtualBox から確認

  • VBoxManage list vms

最後に

macOS 上に Vagrant をインストールしてみました
High Sierra でも特に問題なく使えるようです

2018年3月21日水曜日

rbVmomi で vMotion する方法 (RelocateVM_Task 編)

概要

rbVmomi を使って VM の vMotion をしてみました
今回は RelocateVM_Task を使って vMotion しています

環境

  • Ubuntu 16.04.3
  • Ruby 2.3.1p112
  • gem 2.5.1
  • rbvmomi 1.11.3
  • vCenter 6.5

コード

require 'rbvmomi'

vim = RbVmomi::VIM.connect(
  host: '192.168.100.1',
  user: 'vcenter-user',
  password: 'vcenter-pass',
  insecure: 'true'
)

dc = vim.serviceInstance.find_datacenter('datacenter') || fail('datacenter not found')
vm = dc.find_vm('directory/path/to/vm') || fail('VM not found')

host = nil
priority = :defaultPriority
dc.hostFolder.children.each { |cluster|
  if cluster.is_a? RbVmomi::VIM::ClusterComputeResource
    host = cluster.host.select { |host|
      host.name == 'target_hostname'
    }.first
  end
}

migrate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(host: host)
vm.RelocateVM_Task(spec: migrate_spec, priority: priority).wait_for_completion

RelocateVM_Task の場合 VirtualMachineRelocateSpec を引数に取ります
また今回は host のみを指定しているため単純なホスト間の vMotion になりますがストレージ情報も指定できます
ストレージ情報を指定すると Storage vMotion にすることができます

host の情報は MigrateVM_Task 同様 HostSystem の情報を指定する必要があります

最後に

RelocateVM_Task を使って rbVmomi から vMotion してみました
vSphere 6.5 からはこちらを使うことが推奨されています

2018年3月20日火曜日

rbVmomi で vMotion する方法 (MigrateVM_Task 編)

概要

rbVmomi を使って VM の vMotion をしてみました
今回は MigrateVM_Task を使って vMotion しています

環境

  • Ubuntu 16.04.3
  • Ruby 2.3.1p112
  • gem 2.5.1
  • rbvmomi 1.11.3
  • vCenter 6.5

コード

require 'rbvmomi'

vim = RbVmomi::VIM.connect(
  host: '192.168.100.1',
  user: 'vcenter-user',
  password: 'vcenter-pass',
  insecure: 'true'
)

dc = vim.serviceInstance.find_datacenter('datacenter') || fail('datacenter not found')
vm = dc.find_vm('directory/path/to/vm') || fail('VM not found')

host = nil
priority = :defaultPriority
dc.hostFolder.children.each { |cluster|
  if cluster.is_a? RbVmomi::VIM::ClusterComputeResource
    host = cluster.host.select { |host|
      host.name == 'target_hostname'
    }.first
  end
}
vm.MigrateVM_Task(host: host, priority: priority).wait_for_completion

host と priority を指定しています
host は文字列をただ指定するだけではだめで HostSystem クラスのオブジェクトを設定する必要があります

今回はクラスタ直下にあるホストを取得していますが環境によってはフォルダを挟んでいる環境もあると思うので検索ロジックの部分は必要に併せて変更してください

最後に

MigrateVM_Task を使って rbVmomi で vMotion してみました
ちなみに MigrateVM_Task は vCenter 6.5 では deprecated になっているので RelocateVM_Task を使うようにしましょう

2018年3月19日月曜日

kompose を使って kubernetes 上で docker-compose してみる

概要

kompose は kubernetes 上で docker-compose.yml を実行するためのツールです
既存の docker-compose.yml を使って動作を確認してみました

環境

  • macOS 10.13.2
  • minikube 0.25.0
  • kubectl 1.9.2
  • VertualBox 5.1.30r118389
  • kompose 1.10.0

インストール

  • brew install kompose

その他のプラットフォームのインストール方法はこちら

ちょっとだけ変更する

  • git clone -b ver_golang_for_vch https://github.com/kakakikikeke/memo.git
  • cd memo
  • vim docker-compose.yml
version: '2'
services:
  web:
    image: kakakikikeke/memo:ver_golang_for_vch
    ports:
      - 80:8080
    links:
      - redis
    environment:
      - REDIS_URL=redis://redis:6379/0
    labels:
      kompose.service.type: LoadBalancer
  redis:
    image: redis:latest

kompose.service.type: LoadBalancer の部分だけ追記してあげます
これをやらないとアプリが外部からアクセスすることができません

コンバートする

  • kompose convert -f docker-compose.yml
INFO Kubernetes file "redis-service.yaml" created 
INFO Kubernetes file "web-service.yaml" created   
INFO Kubernetes file "redis-deployment.yaml" created 
INFO Kubernetes file "web-deployment.yaml" created

こんな感じでファイルが分割されます
中身を見ると kubernetes 形式の YAML フォーマットに変換されています

起動する

  • kompose up -f docker-compose.yml

で OK です
ログは以下の通り

INFO We are going to create Kubernetes Deployments, Services and PersistentVolumeClaims for your Dockerized application. If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead. 

INFO Deploying application in "default" namespace 
INFO Successfully created Service: redis          
INFO Successfully created Service: web            
INFO Successfully created Deployment: redis       
INFO Successfully created Deployment: web         

Your application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods,pvc' for details.

指示通り get コマンドで確認してみましょう
コンテナが Running 状態になれば OK です

  • kubectl get deployment,svc,pods,pvc
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/redis   1         1         1            1           2m
deploy/web     1         1         1            1           2m

NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
svc/kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        7h
svc/redis        ClusterIP      None             <none>        55555/TCP      2m
svc/web          LoadBalancer   10.105.101.184   <pending>     80:30146/TCP   2m

NAME                        READY     STATUS    RESTARTS   AGE
po/redis-69867bff9f-ztdcj   1/1       Running   0          2m
po/web-bdd7555b4-cfplp      1/1       Running   0          2m

動作確認

アプリにアクセスしてみましょう

  • minikube service web

でブラウザが開いてアプリにアクセスできます
もしは今回の場合であれば

  • curl $(minikube ip):30146

でアクセスすることができます

ダウンさせる

  • kompose down

で pods, deployments, services すべて削除してくれます

最後に

kubernetes 上で使える docker-compose 「kompose」を使ってみました
既存の docker-compose.yml をそのまま使えて便利です
コマンドもほぼ docker-compose と同様なので簡単に使えます

stop コマンドはないので kompose コマンド経由で停止する場合は down させるしかなさそうです
基本は up だけやらせてあとは kubectl で deployments と services を操作する感じかなと思います

あと LoadBlancer を追記した部分ですが公式を見ると up 後に services に対してロードバランサを追加してあげても良さそうです

  • kubectl expose deployment web --type="LoadBalancer"

参考サイト

2018年3月18日日曜日

kubectl run 時に deployments を一緒に作成しない方法

概要

kubectl run は deployments と pods を同時に作成してくれます
とりあえずコンテナだけ立てたい時には deployments は不要なのでその方法を紹介します

環境

  • macOS 10.13.2
  • minikube 0.25.0
  • kubectl 1.9.2
  • VertualBox 5.1.30r118389

deployments を作成しない方法

  • kubectl run nginx --image=nginx --restart=Never

--restart=Never を指定するだけです

もしくは pod 用の YAML ファイルを作成して kubectl create -f でも pod のみ作成することができます

参考サイト