めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

OpenShift Origin構築手順メモ

何の話かというと

OpenShift Originを最新バージョンで構築する手順です。最新バージョンを対象にしているので、手順は日々変わるでしょう。これは、2015/12/27現在の手順です。

2016年は、OpenShiftにも本気出すことになりそうなので、この環境を使って、OpenShiftでDockerイメージを管理する方法などを解説していく予定です。。。。

(参考資料)
OpenShift Origin Latest/Installation and Configuration/Installing Advanced Installation

前提環境

Linux KVMの仮想マシン3台で、マスター x 1 + ノード x 2 の環境を構築します。はじめに、サブネット「192.168.200.0/24」の仮想ネットワーク「external01」を用意します。

external01.xml

<network>
  <name>external01</name>
  <forward mode='nat' />
  <brdige name='virbr1' stp='off' delay='0' />
  <ip address='192.168.200.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.200.200' end='192.168.200.254' />
    </dhcp>
  </ip>
</network>
# virsh net-define external01.xml
# virsh net-autostart external01
# virsh net-start external01

続いて、この仮想ネットワークにNICを接続した仮想マシンを3つ用意して、それぞれにCentOS7を最小構成でインストールします。仮想マシンのスペックは、すべて共通で、vCPU x 2、メモリー4GB、仮想ディスク64GB程度です。ディスクはパーティション構成にして、未使用の「/dev/vda4」を20GB程度用意しておきます。(Dockerのローカルイメージ置き場として利用します。)ホストネームとIPアドレスは下記を設定します。

役割 ホストネーム IPアドレス
マスター oso-master01.example.com 192.168.200.20
ノード#1 oso-node01.example.com 192.168.200.21
ノード#2 oso-node02.example.com 192.168.200.22

準備作業

ゲストOSがインストールできたら、全サーバーで共通の準備作業として、以下を実行します。「/etc/hosts」については、ホストLinuxにも同じエントリーを追加しておくとよいでしょう。

# cat <<EOF >>/etc/hosts
192.168.200.20 oso-master01 oso-master01.example.com
192.168.200.21 oso-node01 oso-node01.example.com
192.168.200.22 oso-node02 oso-node02.example.com
EOF

# yum -y update
# yum -y install wget git net-tools bind-utils iptables-services bridge-utils bash-completion docker

# systemctl stop firewalld.service
# systemctl mask firewalld.service
# systemctl enable iptables.service
# systemctl start iptables.service

# pvcreate /dev/vda4
# vgcreate docker-vg /dev/vda4
# cat <<EOF > /etc/sysconfig/docker-storage-setup
VG=docker-vg
EOF
# docker-storage-setup  
# systemctl stop docker.service
# rm -rf /var/lib/docker/*
# systemctl start docker.service

インストール

マスター上で実行します。Ansibleのプレイブックが用意されているので、ほぼ全自動です。

# ssh-keygen
# ssh-copy-id oso-master01.example.com
# ssh-copy-id oso-node01.example.com
# ssh-copy-id oso-node02.example.com

# yum -y install epel-release
# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo
# yum -y --enablerepo=epel install ansible
# yum -y install pyOpenSSL
# cd ~
# git clone https://github.com/openshift/openshift-ansible
# cd openshift-ansible

# cat <<EOF >/etc/ansible/hosts
[OSEv3:children]
masters
nodes

[OSEv3:vars]
ansible_ssh_user=root
deployment_type=origin

[masters]
oso-master01.example.com

[nodes]
oso-master01.example.com openshift_node_labels="{'region':'infra','zone':'default'}" openshift_schedulable=false
oso-node01.example.com openshift_node_labels="{'region': 'primary', 'zone': 'zone01'}"
oso-node02.example.com openshift_node_labels="{'region': 'primary', 'zone': 'zone02'}"
EOF

# ansible-playbook ~/openshift-ansible/playbooks/byo/config.yml

初期設定

htpasswdによるユーザー認証を設定します。「/etc/origin/master/master-config.yaml」を開いて、「oauthConifg:」を以下に変更します。

oauthConfig:
  assetPublicURL: https://oso-master01.example.com:8443/console/
  grantConfig:
    method: auto
  identityProviders:
  - name: my_htpasswd_provider
    challenge: true
    login: true
    provider:
      apiVersion: v1
      kind: HTPasswdPasswordIdentityProvider
      file: /etc/origin/openshift-htpasswd

パスワードファイルを作成して、ユーザー「enakai」を登録します。

# yum -y install httpd-tools
# htpasswd -c /etc/origin/openshift-htpasswd enakai

アプリケーションのドメイン名のベース部分を指定します。「/etc/origin/master/master-config.yaml」を開いて、「rougingConifg:」を以下に変更します。

routingConfig:
  subdomain:  "oso.example.com"

ここで、マスターを再起動しておきます。

# systemctl restart origin-master.service

内部レジストリーとルーターのPodをデプロイします。

# oc login -u system:admin
# cd /etc/origin/master
# oadm registry --service-account=registry \
    --config=admin.kubeconfig \
    --credentials=openshift-registry.kubeconfig \
    --mount-host=/var/lib/docker-registry
# oadm router --service-account=router --credentials=openshift-router.kubeconfig 

次のコマンドで、内部レジストリーのIPアドレスを確認しておきます。この例では、「172.30.84.64」です。

# oc get service docker-registry
NAME              CLUSTER_IP     EXTERNAL_IP   PORT(S)    SELECTOR                  AGE
docker-registry   172.30.84.64   <none>        5000/TCP   docker-registry=default   8h

次のコマンドで、ルーターがデプロイされたノードのIPアドレスを確認します。この例では、「192.168.200.22」になります。

# oc describe pod $(oc get pod | awk '/router/{print $1}') | grep node
Node:				oso-node02.example.com/192.168.200.22

先に設定したアプリケーションドメイン「*.oso.example.com」へのアクセスは、すべて、このIPアドレスに転送されるように、外部のDNSを設定する必要があります。ここでは、簡易的に、先に用意した仮想ネットワーク「external01」のdnsmasqに対してワイルドカードエントリーを無理やり追加しておきます。(あくまで簡易的なテスト目的です。)

# echo "address=/oso.example.com/192.168.200.22" >> /var/lib/libvirt/dnsmasq/external01.conf
# pkill -f dnsmasq/external01.conf
# /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/external01.conf

※ホストLinuxを再起動すると、この設定は消えるので注意してください。

さらに、ホストLinuxの「/etc/resolv.conf」の「nameserver」エントリーを次のように修正します。

nameserver 192.168.200.1
nameserver 8.8.8.8  # <=== 外部DNS

これで、external01に接続した仮想マシン、および、ホストLinuxからは、ワイルドカードDNSが有効になります。アプリケーションの動作確認をする際は、ホストLinux上のFirefoxからアプリケーションにアクセスします。

内部レジストリーの公開

内部レジストリーを外部からもアクセスできるようにルーティングを設定します。

はじめに、安全のために、レジストリーへのアクセスをTLS化しておきます。「172.30.84.64」の部分は先に確認したレジストリーのIPアドレスを指定します。

# oc login -u system:admin
# oc project default
# cd /etc/origin/master
# oadm ca create-server-cert --signer-cert=ca.crt \
    --signer-key=ca.key --signer-serial=ca.serial.txt \
    --hostnames='registry.oso.example.com,172.30.84.64' \
    --cert=registry.crt --key=registry.key
# oc secrets new registry-secret registry.crt registry.key
# oc secrets add serviceaccounts/default secrets/registry-secret
# oc volume dc/docker-registry --add --type=secret --secret-name=registry-secret -m /etc/secrets
# oc env dc/docker-registry \
    REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \
    REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key

ここでは、独自の認証局を使用しているため、レジストリーにアクセスするクライアント側に認証局の証明書をインポートしておきます。最低限、マスター、および、各ノードにインポートしておきます。

まず、これらのサーバーは、インストール時に設定ファイル「/etc/sysconfig/docker」に「--inseure-registry」が設定されていることがあります。

OPTIONS='--insecure-registry=172.30.0.0/16 --selinux-enabled   '

TLS化した場合、これは不要になるので、次のように削除しておきます。

OPTIONS='--selinux-enabled'

そして、次の手順で証明書を所定のディレクトリにコピーしておきます。

# mkdir -p /etc/docker/certs.d/172.30.84.64:5000
# mkdir -p /etc/docker/certs.d/registry.oso.example.com
# cp ca.crt /etc/docker/certs.d/172.30.84.64:5000/
# cp ca.crt /etc/docker/certs.d/registry.oso.example.com/
# systemctl restart docker.service

# for i in oso-node01 oso-node02; do
  ssh $i.example.com "mkdir -p /etc/docker/certs.d/172.30.84.64:5000"
  ssh $i.example.com "mkdir -p /etc/docker/certs.d/registry.oso.example.com"
  scp ca.crt $i.example.com:/etc/docker/certs.d/172.30.84.64:5000/
  scp ca.crt $i.example.com:/etc/docker/certs.d/registry.oso.example.com/
  ssh $i.example.com "systemctl restart docker.service"
done

外部のクライアントを使用する際には、同じ「ca.crt」ファイルを「/etc/docker/certs.d/registry.oso.example.com」以下に置いて、docker.serviceを再起動しておきます。

最後に次の定義ファイルを用いて、ルーティングを設定します。

registry_route.yml

apiVersion: v1
kind: Route
metadata:
  name: registry
spec:
  host: registry.oso.example.com 
  to:
    kind: Service
    name: docker-registry 
  tls:
    termination: passthrough
# oc create -f registry_route.yml

これで、外部からは、「registry.oso.example.com」でレジストリーにアクセス可能になります。具体的なアクセス方法は、この後の記事で説明していきます。