OpenShiftでCrashLoopしているPodのログを見る
この投稿はOpen PaaS Advent Calendar 2015の10日目の記事です。
OpenShiftでおもむろにnginxをデプロイしてみます。
$ oc new-app nginx # official "nginx" docker image on docker hub
oc get all
してみますが、CrashLoopBackOffという状態になっていて稼働していないようです。RESTARTSが3になっていて増加していってるようです。
$ oc get all NAME DOCKER REPO TAGS UPDATED nginx library/nginx 1.7.10,latest,1 + 19 more... About a minute ago NAME TRIGGERS LATEST nginx ConfigChange, ImageChange 1 CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE nginx-1 nginx library/nginx@sha256:0a8bad8dfc80e38ccdd09c41d4efd2547fa9d6d58d8706431952a2ef312e2034 app=nginx,deployment=nginx-1,deploymentconfig=nginx 1 1m NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE nginx 172.30.126.189 <none> 80/TCP,443/TCP app=nginx,deploymentconfig=nginx 2m NAME READY STATUS RESTARTS AGE nginx-1-0khqs 0/1 CrashLoopBackOff 3 1m
back offというのは意図的に待っている状態で、この場合は再起動のインターバルを待っている状態です。docker pull待ちのDockerPullBackOffというのもあります。
oc logs
でログを見てみましょう。
$ oc logs nginx-1-0khqs Error from server: Internal error occurred: Pod "nginx-1-0khqs" in namespace "test": container "nginx" is in waiting state.
コンテナが現在稼働していないのでログが取れないと言われてしまいました。困りましたね。
このような場合、--previous
というオプションを指定することで、前回のログを見ることができます。
$ oc logs --previous nginx-1-0khqs nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied) 2015/12/15 05:08:11 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2 2015/12/15 05:08:11 [emerg] 1#1: open() "/var/log/nginx/error.log" failed (13: Permission denied)
Permission deniedですね。OpenShiftでPermission deniedが出ている場合は大抵USERが指定されているか、もしくはUSERを指定しておらずrootでの動作を前提としてしまっているイメージです。
OpenShiftではuser IDで権限を制御する部分があるので、USERによるユーザ名指定はデフォルトで禁止されており、動的にユーザIDが割り当たるようになっているため、上記のようなイメージはこのようなパーミッションエラーを引き起こします。詳しい説明はイメージガイドラインのSupport Arbitrary User IDsのところに記述されています。
ちなみにUSER、USER未指定rootの利用を許可する設定もできます。
oc logs --previous
はKubernetes由来のもので、kubectl logs --previous
というコマンドなのですが、どちらもぐぐってもほとんど情報が出てこないという謎の隠しコマンド状態です。なんででしょうね。レアポケモンの紹介でした。
追記: 初出時に「USERの指定がされているためエラーになった」旨で記載していましたが、実際にはnginxのイメージは「USERの指定がされていない、かつ実行時root前提のためエラーになった」というものだったので修正しました。
openshift-ansibleとVagrantでOpenShift Origin v1.1のAll-in-one環境を構築する
この投稿はOpen PaaS Advent Calendar 2015の9日目の記事です。
openshift-ansibleとVagrantでOpenShift Origin v1.1を構築するでは3台構成のOpenShiftを構築しましたが、ちょっと試すだけなら3台も要らないよね?ってことで1台の構成を作ってみましょう。1台であればメモリももうちょっと割り当てられますし。
手順は前回とほぼ同じなのですが、vagrant up
の前にこの環境変数をexportしておきます。
export OPENSHIFT_NUM_NODES=0
0という指定は若干奇妙ですが、masterノードのみセットアップします。masterは実際にはnodeサービスも同居して動作しているので、All-in-one構成として利用可能です。masterのnodeサービスはschedulable=falseになっているので、trueに変更したまま運用します。
vagrant up --provider=libvirt --no-provision vagrant provision vagrant ssh master sudo oadm manage-node ose3-master.example.com --schedulable=true sudo oadm registry --selector=kubernetes.io/hostname=ose3-master.example.com --credentials=/etc/origin/master/openshift-registry.kubeconfig --service-account=registry sudo oadm router --selector=kubernetes.io/hostname=ose3-master.example.com --credentials=/etc/origin/master/openshift-router.kubeconfig --service-account=router sudo vi /etc/origin/master/master-config.yaml # Change the subdomain value as follows: # subdomain: "apps.192.168.100.100.xip.io" sudo systemctl restart origin-master
これで1台構成のOpenShiftができあがりますので、そのまま遊べます。
openshift-ansibleとVagrantでOpenShift Origin v1.1を構築する
この投稿はOpen PaaS Advent Calendar 2015の8日目の記事です。
OpenShiftにはopenshift-ansibleというインストーラーのプロジェクトがあり、Vagrantと組み合わせて簡単にOpenShiftの実行環境が構築できるようになっています。VagrantでのセットアップについてはREADME_vagrant.mdに記述されています。
デフォルトの設定では以下の3台構成のOpenShiftができあがります。
192.168.100.100 ose3-master.example.com 192.168.100.200 ose3-node1.example.com 192.168.100.201 ose3-node2.example.com
これを自分の4 CPU cores, 12GBメモリのラップトップで構築してみましょう。Fedora 23でのVagrant libvirtのセットアップまでのステップはVagrantで構築編を参照してください。
openshift-ansibleではansibleとvagrantのvagrant-hostmanagerプラグインが必要ですので、それらもインストールします。
sudo dnf install ansible -y vagrant plugin install vagrant-hostmanager
CPUやメモリの設定はVagrantfileにハードコードされていますが、多少控え目に定義してあって実際に利用するとつらい感じになりやすいので、cloneした後に若干増やしておきます。
- libvirt.cpus = 2 - libvirt.memory = 1024 + libvirt.cpus = 4 + libvirt.memory = 2048
vagrant up
のときに--no-provision
を忘れずにつけましょう。忘れると1ノード時点でprovisionがはじまってしまうのでやり直すはめになります。
vagrant provision
を実行するとAnsibleによるインストールがはじまるので、結構時間がかかります。
git clone https://github.com/openshift/openshift-ansible/ cd openshift-ansible vi Vagrantfile # modify cpus and memory if needed vagrant up --provider=libvirt --no-provision vagrant provision
マルチノード構成なので、masterノードで作業します。
vagrant ssh master
oc get node
を実行すると3台構成となっているのがわかります。
oc get node NAME LABELS STATUS AGE ose3-master.example.com kubernetes.io/hostname=ose3-master.example.com Ready,SchedulingDisabled 26m ose3-node1.example.com kubernetes.io/hostname=ose3-node1.example.com Ready 26m ose3-node2.example.com kubernetes.io/hostname=ose3-node2.example.com Ready 26m
docker registryとrouterを作成しましょう。3台くらいの構成ではmasterにregistryとrouterを稼働させるのが一般的です。デフォルトでschedulable=falseとなっているので、このときだけtrueに変更します。
sudo oadm manage-node ose3-master.example.com --schedulable=true sudo oadm registry --selector=kubernetes.io/hostname=ose3-master.example.com --credentials=/etc/origin/master/openshift-registry.kubeconfig --service-account=registry sudo oadm router --selector=kubernetes.io/hostname=ose3-master.example.com --credentials=/etc/origin/master/openshift-router.kubeconfig --service-account=router sleep 120 # docker pullがどのくらいの時間で終わるのかは環境依存なので、目視確認したりsleep調整したりしてください sudo oadm manage-node ose3-master.example.com --schedulable=false
master-config.xmlのsubdomainにxip.ioを記述しておくとアプリケーションもそのままアクセスできるようになるので設定しておきましょう。
sudo vi /etc/origin/master/master-config.yaml # Change the subdomain value as follows: # subdomain: "apps.192.168.100.100.xip.io" sudo systemctl restart origin-master
これでmaster上での作業は終わりです。あとはVagrantホストからリモートで利用できます。
vagrant-hostmanagerプラグインによって、vagrantホストの/etc/hosts
エントリも追加されるので、ブラウザでWebコンソールにアクセス可能になっています。オレオレTLSなので警告が出ます。
https://ose3-master.example.com:8443/console/
認証はAllowAllが設定されているので、適当なユーザ名と空ではないパスワードで認証が通るようになっています。
ブラウザアクセスだけではなく、ocコマンドももちろん利用できます。masterからocコマンドを取ってきて実行すれば良いです。
vagrant ssh master -- cat /usr/bin/oc > oc chmod +x ./oc ./oc version ./oc login ose3-master.example.com
さて、プロジェクトを作成してアプリケーションを放り込んでみましょう。
./oc login ose3-master.example.com --username=nekop ./oc new-project test ./oc new-app https://github.com/nekop/hello-sinatra ./oc expose service hello-sinatra
oc get all
で状態を確認すると以下のように見えます。
./oc get all NAME TYPE FROM LATEST hello-sinatra Source Git 1 NAME TYPE FROM STATUS STARTED DURATION hello-sinatra-1 Source Git Running 2 minutes ago 2m48s NAME DOCKER REPO TAGS UPDATED hello-sinatra 172.30.90.98:5000/test/hello-sinatra NAME TRIGGERS LATEST hello-sinatra ConfigChange, ImageChange 0 NAME HOST/PORT PATH SERVICE LABELS INSECURE POLICY TLS TERMINATION hello-sinatra hello-sinatra-test.apps.192.168.100.100.xip.io hello-sinatra app=hello-sinatra NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE hello-sinatra 172.30.44.105 <none> 8080/TCP app=hello-sinatra,deploymentconfig=hello-sinatra 2m NAME READY STATUS RESTARTS AGE hello-sinatra-1-build 1/1 Running 0 2m
ビルドが終われば、http://hello-sinatra-test.apps.192.168.100.100.xip.io
にアクセスすることでアプリケーションが稼働していることを確認できます。
年末調整メモ
年末調整ってなんであんなに書きにくいフォーマットなんだろうね?IT化自動化してほしい。
自分は都民共済(生命保険と介護保険の2つに分かれる)と学資保険が子供2人分なので、生命保険のエントリが4つ、介護保険のエントリが2つ。支払の主体としては自分と奥さんのお財布の区別はないので、自分と奥さんの年末調整、どちらにでも書いていいはず。学資保険の額が大きいので、学資保険を自分と奥さんに振り分けて書く。あとはどっちに書いても控除額は増えないので、自分にまとめて書く。
住宅ローンがある場合は10年分の住宅借入金等特別控除申告書が手元にあるはずなので、残高証明書を元に記入する。
年末調整に向けて届く書類は、保険の支払証明が2通(2社分)、残高証明書、年末調整書類。あとは保管してある住宅借入金等特別控除申告書で、必要書類が揃う。こういうの毎年何いるんだっけ?ってなる。
全部書いたら一応全部写真を取って返送する。
OpenShiftにGogsをセットアップする
インターナルでWebhookが使えるGit hostでhttpしゃべるものが欲しかったのだけど、社内のGitがhttpsなのでフロントエンドでプロキシするか別のGit hostを、ということで気になっていたGogs試してみた。この人ボストンで学生やってるっぽいんだけどめちゃめちゃコード書いててすごい。
private docker registryの時と同じくRunAsAny設定が必要。
oc new-project gogs oc new-app gogs/gogs oc expose dc gogs --port=3000 --name=gogs-http oc expose se gogs-http
http://gogs-http.gogs.tkimura.shift
にアクセスするとセットアップ画面が出るので、httpのURLがデフォルトでlocalhost
になっているのをこのサーバに修正しておしまい。そのあとログイン画面に遷移するけど、最初に作ったユーザがadminになるので普通に登録してログインすればいい。tkimura.shift
は自分のDNSに設定しているオレオレOpenShiftドメイン名。
あとはぽちぽちリポジトリ作ってgit clone http://gogs-http.gogs.tkimura.shift/nekop/first.git
して動いたのでOK。
Gogsは3000と22の二つのポートがexposeされているので、3000のほうを別のServiceにしてRouteを作る。oc expose se gogs
とやってしまうとHTTPとSSHにロードバランスされて面白いことになる。
Dockerの不要なコンテナとイメージを削除する
変なgrepしてたりコマンド置換$(...)
使ってdocker rmから引数ないぞ警告でちゃうような微妙なサンプルが多かったので、自分のバージョンをメモ。
/etc/cron.daily/docker-cleanup
に置いて日次実行にしてます。たまにマニュアルで叩いてたりもします。
#/bin/bash docker ps -q -f status=exited | xargs --no-run-if-empty docker rm docker images -q -f dangling=true | xargs --no-run-if-empty docker rmi
Vagrant libvirt boxのディスクサイズを変更する
Vagrantは便利なんですが、ディスクイメージのサイズが固定されているので、デカイもの突っ込んで新しいイメージを作成とかするときに困ってしまいました。単にデカイのつっこむなら別のディスクをアタッチすればいいのですが、新しいイメージを作る時にはVagrant boxにはディスクイメージは2つ同梱できないので困ります。どうせqcow2のthinなので上限大きくしても特に影響なしで使いやすいですし。
今回はRHEL 7.1のイメージで、Red Hat Container Development Kitという今回のような開発とか評価用途のサポートなしのダウンロードのところにRHEL 7.1のVagrant libvirt boxがあるのでダウンロードします。ちなみにVirtualBox用のもあります。
https://access.redhat.com/downloads/content/293/ver=1/rhel---7/1.0.0/x86_64/product-downloads
ダウンロードしたboxの元サイズは500Mちょいです。.boxはfile *.box
してみるとわかりますがtar.gzなので、展開してみます。
$ mkdir work $ cd work $ tar xf ../rhel-server-libvirt-7.1-0.x86_64.box $ ls -l total 1543500 -rwxr-xr-x. 1 nekop nekop 1580531712 Mar 12 01:25 box.img -rw-r--r--. 1 nekop nekop 62 Mar 12 01:25 metadata.json -rw-r--r--. 1 nekop nekop 356 Mar 12 01:25 Vagrantfile $ file box.img box.img: QEMU QCOW Image (v2), 10737418240 bytes $ cat metadata.json {"provider": "libvirt", "format": "qcow2", "virtual_size": 11}
中身のbox.imgは11Gのqcow2イメージです。今回はこれを20Gへ拡大します。
中身の構成を見てみましょう。
$ virt-filesystems -lh --parts --pvs --vgs --lvs --extra -a box.img Name Type VFS Label MBR Size Parent /dev/sda1 filesystem unknown - - 1.0M - /dev/sda2 filesystem ext4 - - 200M - /dev/VolGroup00/LogVol00 filesystem ext4 - - 8.0G - /dev/VolGroup00/LogVol01 filesystem swap - - 1.5G - /dev/VolGroup00/LogVol00 lv - - - 8.0G /dev/VolGroup00 /dev/VolGroup00/LogVol01 lv - - - 1.5G /dev/VolGroup00 /dev/VolGroup00 vg - - - 9.8G /dev/sda3 /dev/sda3 pv - - - 9.8G - /dev/sda1 partition - - 83 1.0M /dev/sda /dev/sda2 partition - - 83 200M /dev/sda /dev/sda3 partition - - 8e 9.8G /dev/sda
/dev/sda3
がLVMのパーティションで、これを拡大すれば後はオンラインでどうにでも割り当てられますね。謎の1Mの/dev/sda1
がありますが使われていませんね。
20Gのqcow2イメージを作って、virt-resize
で/dev/sda3
をリサイズ指定します。PVも自動的にpvresize
してくれます。
qemu-img create -f qcow2 box.img.new 20G virt-resize --expand /dev/sda3 box.img box.img.new mv box.img.new box.img tar czf ../rhel-7.1-20g.box ./*
これで20Gのイメージが出来上がりました。
起動してルートパーティションを拡大してみます。
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup00-LogVol00 8093624 1520852 6138596 20% / devtmpfs 498944 0 498944 0% /dev tmpfs 508380 0 508380 0% /dev/shm tmpfs 508380 6668 501712 2% /run tmpfs 508380 0 508380 0% /sys/fs/cgroup /dev/vda2 194235 96794 83105 54% /boot $ sudo lvresize -L 12G /dev/VolGroup00/LogVol00 $ sudo resize2fs /dev/VolGroup00/LogVol00 $ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup00-LogVol00 12255112 1524888 10128280 14% / devtmpfs 498944 0 498944 0% /dev tmpfs 508380 0 508380 0% /dev/shm tmpfs 508380 6668 501712 2% /run tmpfs 508380 0 508380 0% /sys/fs/cgroup /dev/vda2 194235 96794 83105 54% /boot