2015年12月14日月曜日

Proxmox VE 4.1 リリース

2015/12/11にリリースされていました。

以下URLまんまですが変更点は以下の通り
http://pve.proxmox.com/wiki/Roadmap#Proxmox_VE_4.1

Linux kernel 4.2 → Linux kernel 4.2.6へ
systemdによるサービスの起動/停止
NTPがデフォルトで有効
インストール時のZFSディスクを8つまでサポート
LVMのシンプロビジョニングサポート
LXCコンテナのサイズ改善
LXCのFedora22とUbuntu15.10のサポート
ガルシア語(スペイン語?)のサポート
WOLのサポート?(KVM: update network boot ROMs)
Turnkey Linux LXC アプライアンスのサポート
pvereportコマンドの追加(ProxmoxVEのシステム情報を出力)
コンテナのHAサポート
その他もろもろのバグ改善

Turnkey Linux、初めて知りました。
勉強不足ですね。

2015年12月10日木曜日

Proxmox veで各コンテナの使用量を比較する

コンテナは基本、ライブマイグレーションできない(できそう)ので
じゃあCoreOSをVMとして作成してコンテナ動かせばライブマイグレーション
できることになるのでは、と思い(VMwareが既に思いついてましたが)
以下、比較してみました。

比較用コンテナ:CentOS7

LXCコンテナ
 メモリ 47MB
 →そりゃそうですね


VM:CoreOS配下でdokcerコンテナ起動
 メモリ 149MB
 →+100MBですが低い値で稼働できますね


VM:CentOS7S配下でdokcerコンテナ起動
 メモリ 629MB
 →まんま仮想マシンCentOSのリソースが使ってますね・・・

VM:VMware PhotosOS配下でdokcerコンテナ起動
 メモリ 112MB
 →おおっCoreOSよりもメモリ節約できていますね

ライブマイグレーションの恩恵を考えるとVMとしてコンテナ用ホストを作成してその配下で
コンテナを動かすという運用もコンテナによってはありではないでしょうか。
vMotionとか簡単にできますしね。


2015年12月9日水曜日

手っ取り早くfluentdを試す。

CentOSにてログ収集ツールfluentdを手っ取り早く試す手順です。(手っ取り早いか?)

 参考URL
 http://docs.fluentd.org/articles/install-by-rpm


【インストール】
 ログ受信側、送信側で以下を実行します。



curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
service td-agent start



【ログ設定】
①ログ受信側


mkdir /var/log/fluentd/
chmod 744 /var/log/fluentd/
vi /etc/td-agent/td-agent.conf


td-agent.confを以下に編集


<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
<match log.*>
  type file
  path /var/log/fluentd/messages.log
  time_format %Y%m%dT%H%M%S%z
</match>


サービス再起動


service td-agent restart


②ログ送信側


mkdir /var/log/fluentd/
chmod 744 /var/log/fluentd/
vi /etc/td-agent/td-agent.conf
chmod 644 /var/log/messages

td-agent.confを以下に編集


<source>
  type tail
  path /var/log/messages
  format syslog
  pos_file /var/log/fluentd/messages.pos
  tag log.messages
</source>
<match log.*>
  type forward
  <server>
    host [ログ送信側のIPアドレス]
    port 24224
  </server>
</match>

サービス再起動


service td-agent restart


【動作確認】
①ログ送信側/受信側
 
 /var/log/td-agent/td-agent.log にエラーログないことを確認

②ログ送信側


 logger test

③ログ受信側

 /var/log/fluentd/ 以下にログが生成されたことを確認



2015年12月3日木曜日

CoreOSでDockerプライベートリポジトリを構築する

DockerRegistryを使用してローカル環境にコンテナイメージを格納するプライベートリポジトリサーバを作成します。
プライベートリポジトリを構築することでetcd2 + fleetのクラスタ環境をローカル内で完結することができます。

【参考URL】
https://coreos.com/os/docs/latest/registry-authentication.html
https://docs.docker.com/registry/deploying/

【事前準備】
docker pullは基本的にSSL通信です。
ローカルのリポジトリサーバ構築時でも同様にSSL通信を行うのですがその場合証明書作成等が必要となるため
cloud-config.ymlに下記を追記することで非SSL通信でdocker pullするようにします。
(インターネットからdocker pullする場合も非SSL通信になるのでご注意を)

```bash
write_files:
  - path: /etc/systemd/system/docker.service.d/50-insecure-registry.conf
    content: |
        [Service]
        Environment='DOCKER_OPTS=--insecure-registry="192.168.159.0/24"'
```

リポジトリサーバをダウンロードします。
リポジトリデータはホストの/home/registryにマウントすることでデータを永続化します。

docker run -d -p 5000:5000 --restart=always --name registry -v /home/registry:/var/lib/registry registry:2

ローカルリポジトリに登録するコンテナをダウンロードします

docker pull centos:6

ダウンロードしたコンテナイメージをタグ付けします。

docker tag centos:6 localhost:5000/centos

タグ付けしたコンテナイメージをアップロードします。

docker push localhost:5000/centos

CoreOSホストの/home/registryを参照するとdockerレジストリイメージが格納されていることがわかります。

ls /home/registry
docker


他のCoreOSホストからローカルリポジトリのイメージをダウンロードします
192.168.159.160はローカルレジストリを起動しているCoreOSホストのIPです。

docker pull 192.168.159.160:5000/centos

他のCoreOSホストからイメージをpushすることもできます。

docker push 192.168.159.160:5000/centos


許可されていないホストからも簡単にpushできるのでポート制限等必要ですね。




CoreOS flannelでホスト間通信を行う

etcd2でクラスタ構成後、複数CoreOSのコンテナ間で通信できるようにflannelを使用します。
設定は簡単で以下のURLに従ってcloud-config.ymlに追記するだけです。

参考URL
https://coreos.com/flannel/docs/latest/flannel-config.html

そのままconfigコピーで行けました。


coreos:
  units:
    - name: flanneld.service
      drop-ins:
        - name: 50-network-config.conf
          content: |
            [Service]
            ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'
      command: start

    - name: redis.service
      content: |
        [Unit]
        Requires=flanneld.service
        After=flanneld.service

        [Service]
        ExecStart=/usr/bin/docker run redis
        Restart=always
      command: start



dockerサービスが起動する前に起動する必要があるとの記載があったため
   - name: docker.service
より上にconfigをコピーします。


#cloud-config

hostname: core[1-3]
coreos:
  units:
    - name: vmtoolsd.service
      command: start
      content: |
        [Unit]
        Description=VMware Tools Agent
        Documentation=http://open-vm-tools.sourceforge.net/
        ConditionVirtualization=vmware

        [Service]
        ExecStartPre=/usr/bin/ln -sfT /usr/share/oem/vmware-tools /etc/vmware-tools
        ExecStart=/usr/share/oem/bin/vmtoolsd
        TimeoutStopSec=5

    - name: 10-static.network
      runtime: no
      content: |
        [Match]
        Name=eno16777984

        [Network]
        Address=192.168.1.[1-3]/24
        Gateway=192.168.1.254
        DNS=192.168.1.1
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start

    - name: flanneld.service
      drop-ins:
        - name: 50-network-config.conf
          content: |
            [Service]
            ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'
      command: start

    - name: redis.service
      content: |
        [Unit]
        Requires=flanneld.service
        After=flanneld.service
        [Service]
        ExecStart=/usr/bin/docker run redis
        Restart=always
      command: start

    - name: docker.service
      command: start
  oem:
    bug-report-url: "https://github.com/coreos/bugs/issues"
    id: vmware
    name: VMWare
    version-id: "9.10.0-r1"
  etcd2:
    discovery: "[curl -w "\n" 'https://discovery.etcd.io/new?size=3']"
    advertise-client-urls: "http://192.168.1.[1-3]:2379"
    initial-advertise-peer-urls: "http://192.168.1.[1-3]:2380"
    listen-client-urls: "http://0.0.0.0:2379,http://0.0.0.0:4001"
    listen-peer-urls: "http://192.168.1.[1-3]:2380,http://192.168.1.[1-3]:7001"



すでにCoreOSでDockerが起動しているのでホストを再起動します。
再起動するとredisというコンテナが作成されていました。
flannelはコンテナとして動作するのですね。

コンテナを新規作成後ipアドレスを確認すると[10.0.0.0/16]セグメントでIPアドレスが割り当てられていました。
コンテナはもちろんCoreOSからでもpingが通ります。


CoreOS etcd2でDNS Discoveryでクラスタ構成を組む

DNS Discoveryを利用したCoreOSのetcd2クラスタ環境を構築しました。
DNSサーバにSRVレコード追加するだけですので本番環境ではDNS Discovery方式が簡単かつメンテナンスしやすいのではないでしょうか。

参考URL
https://coreos.com/etcd/docs/2.0.12/clustering.html#dns-discovery

上記にて
listen-client-urls http://infra0.example.com:2379
とあるのですが
listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001
としないとクラスタ組めませんでした。

【準備】
 ディスカバリ用のDNSサーバを構築します。
  etcdクラスタのAレコード及びSRVレコードを作成します。
 めんどくさいのでWindowsサーバにDNSの役割追加して以下のレコード構成にしました。


[DNSサーバ]
 -[前方参照ゾーン]
  -[test.com]
      (親フォルダと同じ) CNAME [DNSサーバ].test.com
      (親フォルダと同じ) NS [DNSサーバ]
      (親フォルダと同じ) SOA  [DNSサーバ]
      [DNSサーバ] A  192.168.159.160
      etcd001 A 192.168.159.161
      etcd001 A 192.168.159.162
      etcd001 A 192.168.159.163
      -[_tcp]
        _etcd-server SRV [0][0][2380]etcd001.test.com
        _etcd-server SRV [0][0][2380]etcd002.test.com
        _etcd-server SRV [0][0][2380]etcd003.test.com


 SRVレコードはサービスに[_etcd-server] ポート番号に[2380]を指定してクラスタ参加ホストを登録します。

後は以下の要領でcloud-config.ymlを登録します。


#cloud-config

hostname: etcd00[1-3]
coreos:
  units:
    - name: vmtoolsd.service
      command: start
      content: |
        [Unit]
        Description=VMware Tools Agent
        Documentation=http://open-vm-tools.sourceforge.net/
        ConditionVirtualization=vmware

        [Service]
        ExecStartPre=/usr/bin/ln -sfT /usr/share/oem/vmware-tools /etc/vmware-tools
        ExecStart=/usr/share/oem/bin/vmtoolsd
        TimeoutStopSec=5
    - name: 10-static.network
      runtime: no
      content: |
        [Match]
        Name=eno16777984

        [Network]
        Address=192.168.159.16[1-3]/24
        Gateway=192.168.159.2
        DNS=192.168.159.160  
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start
    - name: docker.service
      command: start
  oem:
    bug-report-url: "https://github.com/coreos/bugs/issues"
    id: vmwarea
    name: VMWare
    version-id: "9.10.0-r1"

  etcd2:
    name: etcd00[1-3]
    discovery-srv: test.com
    initial-advertise-peer-urls: http://etcd00[1-3].test.com:2380
    initial-cluster-token: etcd-cluster-1
    initial-cluster-state: new
    advertise-client-urls: http://etcd00[1-3].test.com:2379
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    listen-peer-urls: http://etcd00[1-3].test.com:2380



クラスタ追加する場合はSRVレコードにホストを登録するだけですので非常に管理もしやすいですね。