OpenShift Container Platform 3.7をAWS上にシングルノードでセットアップする
OpenShift 全部俺 Advent Calendar 2017
OpenShiftをAWSでセットアップするリファレンスアーキテクチャやCloudFormationやデプロイスクリプトなどはいろいろ用意されていますが、本番構成向けのもったりした構成です。AWS上でのテスト用にシングルノードセットアップを使いたい場合があるので、手順を書いておきます。
VPC, Internet Gateway, Subnetなどは事前に作成する前提です。EC2 Instanceは以下のものを利用しました。
- AMI: RHEL-7.4_HVM_GA-20170724-x86_64-1-Access2-GP2
- Instance Type: m4.xlarge (4 vCPU, 16G mem)
- Disk: 80GB
- Tag:
kubernetes.io/cluster/foo=owned
- Elastic IP付与
Elastic IPの生IPやながーいホスト名は扱いづらいので、Route 53でmasterのホスト名とワイルドカードアプリケーションドメインをCNAMEもしくはAレコードで上記Elastic IPに設定します。
AWS上でKubernetesを利用する場合はkubernetes.io/cluster/<clusterid>
タグが必要になります。設定しないと同一アカウント内の複数のKubernetesクラスタがEBSの奪い合いなどリソースの処理で競合して面白いことが起きます。
Security Groupは適切に設定してください。Allow All設定でAllowAllPasswordIdentityProviderの設定であれば当然ですがビットコイン掘られます。
起動したら前回と同じように以下のようなスクリプトを用意してsudoで流し込みます。
RHSM_USERNAME= RHSM_PASSWORD= RHSM_POOLID= OPENSHIFT_VERSION=3.7 subscription-manager register --username=$RHSM_USERNAME --password=$RHSM_PASSWORD subscription-manager attach --pool $RHSM_POOLID subscription-manager repos --disable=* subscription-manager repos \ --enable=rhel-7-server-rpms \ --enable=rhel-7-server-extras-rpms \ --enable=rhel-7-server-optional-rpms \ --enable=rhel-7-server-rh-common-rpms \ --enable=rhel-7-fast-datapath-rpms \ --enable=rhel-7-server-ose-$OPENSHIFT_VERSION-rpms yum install chrony wget git net-tools bind-utils iptables-services bridge-utils nfs-utils sos sysstat bash-completion lsof tcpdump yum-utils yum-cron docker atomic-openshift-utils -y sed -i 's/DOCKER_STORAGE_OPTIONS=/DOCKER_STORAGE_OPTIONS="--storage-driver overlay2"/' /etc/sysconfig/docker-storage systemctl enable chronyd docker systemctl start chronyd docker reboot
再度接続したらansibleの準備です。
$ ssh-keygen $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ sudo mkdir -p /etc/aws $ sudo cat <<EOF > /etc/aws/aws.conf [Global] Zone = ap-northeast-1c EOF $ sudo vi /etc/ansible/hosts
Ansibleのhostsファイルはこんな感じです。AWSやOpenStackなどのクラウド環境上ではホスト定義にopenshift_hostnameパラメータを定義してはいけません。Kubernetesのクラウドインテグレーションは内部ホスト名を要求するので、オーバーライドするといろいろエラーになります。
[OSEv3:children] masters etcd nodes [OSEv3:vars] ansible_ssh_user=ec2-user ansible_become=true deployment_type=openshift-enterprise openshift_master_identity_providers=[{'name': 'htpasswd', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] os_sdn_network_plugin_name=redhat/openshift-ovs-multitenant openshift_node_kubelet_args={'kube-reserved': ['cpu=100m,memory=100Mi'], 'system-reserved':['cpu=100m,memory=100Mi'], 'eviction-hard': [ 'memory.available<4%', 'nodefs.available<4%', 'nodefs.inodesFree<4%', 'imagefs.available<4%', 'imagefs.inodesFree<4%' ], 'eviction-soft': [ 'memory.available<8%', 'nodefs.available<8%', 'nodefs.inodesFree<8%', 'imagefs.available<8%', 'imagefs.inodesFree<8%' ], 'eviction-soft-grace-period': [ 'memory.available=1m30s', 'nodefs.available=1m30s', 'nodefs.inodesFree=1m30s', 'imagefs.available=1m30s', 'imagefs.inodesFree=1m30s' ]} openshift_disable_check=memory_availability,disk_availability openshift_master_cluster_public_hostname=master.example.com openshift_master_default_subdomain=apps.example.com openshift_cloudprovider_kind=aws openshift_cloudprovider_aws_access_key="{{ lookup('env','AWS_ACCESS_KEY_ID') }}" openshift_cloudprovider_aws_secret_key="{{ lookup('env','AWS_SECRET_ACCESS_KEY') }}" openshift_clusterid=foo [masters] master.example.com [etcd] master.example.com [nodes] master.example.com openshift_node_labels="{'region': 'infra'}" openshift_schedulable=true
インストールを行なえばEBS PVのダイナミックプロビジョニングもセットアップされている状態になっているはずです。
export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... ansible-playbook -vvvv /usr/share/ansible/openshift-ansible/playbooks/byo/config.yml | tee -a openshift-install-$(date +%Y%m%d%H%M%S).log reboot