何の話かというと
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」でレジストリーにアクセス可能になります。具体的なアクセス方法は、この後の記事で説明していきます。