Contents
ラズパイを使ってk8sクラスタを作ってるのを見て「ラズパイでAnsibleクラスター作ったら面白いかも」と思ってこんなのを作りました。
Ansibleのラズペリーパイ包み🤤🤤🤤 pic.twitter.com/1UwIWm3A1x
— 日常系インフラ自動化もふもふおじさん@Ansible(コンテナ基盤構築とか自動化やりたい) (@sky_jokerxx) 2019年4月15日
で、単純にAnsibleを入れて動かすだけでは物足りないので、k3s入れてAnsible Towerアップストリーム版の AWX をラズパイで動かしてみよう!と思って実際にやってみたら色々ハマりました。。。
けど、一応動くところまでは出来たので構築方法について書いてみようと思います。
環境
環境は以下のものを使用します。
イメージ図
k3sクラスタとコンテナ配置のイメージです。
k3s-node01はUSBの外付けSSDを使用しています。
理由は、AWXのPodを動かすのにメモリーが足りなくてSWAPを使うため、なるべく速いストレージにしたかったからです。
構築手順
PostgreSQLのデプロイ
デプロイ準備
PostgreSQLはk3s-node02で動作させます。
そのため、DBを保存するディレクトリを作成します。
ここでは /opt/data
に保存させます。
1 2 3 4 5 |
[root@k3s-node02 ~]# mkdir /opt/data [root@k3s-node02 ~]# chown 70:70 /opt/data/ [root@k3s-node02 ~]# ls -ld /opt/data/ drwxr-xr-x 2 70 70 4096 May 6 01:03 /opt/data/ |
デプロイ
PostgreSQLのデプロイ用マニフェストを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
[root@k3s-master ~]# vi postgresql_deploy.yml apiVersion: apps/v1 kind: Deployment metadata: name: postgresql namespace: awx spec: replicas: 1 selector: matchLabels: app: postgresql template: metadata: labels: app: postgresql spec: containers: - name: postgresql96 image: arm64v8/postgres:9.6-alpine ports: - containerPort: 5432 resources: requests: cpu: 1500m memory: 500Mi volumeMounts: - mountPath: "/var/lib/postgresql/data" name: postgresqldb volumes: - name: postgresqldb hostPath: path: /opt/data affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k3s-node02 |
今回はNodePortで接続させるためPostgreSQLのサービス用マニフェストを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@k3s-master ~]# vi postgresql_srv.yml apiVersion: v1 kind: Service metadata: name: postgresql96-np namespace: awx spec: selector: app: postgresql ports: - port: 5432 type: NodePort |
namespaceを作成します。
1 2 3 |
[root@k3s-master ~]# kubectl create namespace awx namespace/awx created |
PostgreSQLのコンテナをデプロイします。
1 2 3 4 5 |
[root@k3s-master ~]# kubectl create -f postgresql_deploy.yml deployment.apps/postgresql created [root@k3s-master ~]# kubectl create -f postgresql_srv.yml service/postgresql96-np created |
Podが起動しているか確認します。
1 2 3 4 |
[root@k3s-master ~]# kubectl -n awx get pods NAME READY STATUS RESTARTS AGE postgresql-684f9c4f7c-l9c4m 1/1 Running 0 39s |
DBの設定
AWX用のユーザーDBを設定します。
ここでは、アカウントとパスワードはAWXのinventoryに書かれているデフォルトのもので設定しています。
アカウント | パスワード |
---|---|
awx | awxpass |
1 2 3 4 5 6 7 |
[root@k3s-master ~]# kubectl -n awx exec -it postgresql-684f9c4f7c-l9c4m bash bash-4.4# su - postgres postgresql-684f9c4f7c-l9c4m:~$ createuser -P awx Enter password for new role: Enter it again: postgresql-684f9c4f7c-l9c4m:~$ createdb -O awx awx |
PostgreSQLの遠隔接続設定を変更します。
1 2 3 4 5 6 7 8 |
postgresql-684f9c4f7c-l9c4m:~$ vi data/pg_hba.conf (snip) #host all all all trust local all all trust host all all 0.0.0.0/0 password postgresql-684f9c4f7c-l9c4m:~$ pg_ctl reload -D /var/lib/postgresql/data/ server signaled |
遠隔接続確認
必要であれば遠隔から接続できるか確認します。
接続するためのポートを確認します。
ここでは 32654
でアクセスができます。
1 2 3 4 |
[root@k3s-master ~]# kubectl -n awx get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE postgresql96-np NodePort 10.43.242.87 <none> 5432:32654/TCP 4m12s |
接続確認してみます。
1 2 3 4 5 6 7 |
[root@localhost ~]# psql -h 192.168.0.142 -p 32654 -U awx -d awx ユーザ awx のパスワード: psql (9.6.12) "help" でヘルプを表示します. awx=> \q |
SWAPファイルの作成
標準のSWAPサイズでは足りないためk3s-node01で拡張します。
1 2 3 4 5 6 7 8 |
[root@k3s-node01 ~]# dd if=/dev/zero of=/swapfile bs=1M count=4096 [root@k3s-node01 ~]# mkswap /swapfile [root@k3s-node01 ~]# chmod 600 /swapfile [root@k3s-node01 ~]# swapon /swapfile [root@k3s-node01 ~]# vi /etc/fstab (snip) /swapfile swap swap defaults 0 0 |
AWXのデプロイ
必要なパッケージのインストール
master側に必要なパッケージをインストールします。
1 2 |
[root@k3s-master ~]# yum -y install git ansible |
リポジトリクローン
AWXのリポジトリをクローンして指定したバージョンのブランチを作成します。
1 2 3 4 |
[root@k3s-master ~]# git clone https://github.com/ansible/awx.git [root@k3s-master awx]# git checkout -b 4.0.0 refs/tags/4.0.0 Switched to a new branch '4.0.0' |
各ファイルの修正
inventory
ファイルを修正します。
1 2 3 4 5 6 7 8 9 10 11 |
[root@k3s-master awx]# cd installer/ [root@k3s-master installer]# vi inventory (snip) # Kubernetes Install kubernetes_context=awx-cluster kubernetes_namespace=awx (snip) pg_hostname=192.168.0.142 (snip) pg_port=32654 |
roles/kubernetes/defaults/main.yml
を修正します。
AWX/rabbitmqイメージと各コンテナの必要スペックを変更します。
AWXのイメージは以下のものを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[root@k3s-master installer]# vi roles/kubernetes/defaults/main.yml (snip) #kubernetes_task_image: "{{ tower_package_name | default('ansible/awx_task') }}" kubernetes_task_image: "{{ tower_package_name | default('skyjokerxx/awx_task') }}" (snip) #kubernetes_web_image: "{{ tower_package_name | default('ansible/awx_web') }}" kubernetes_web_image: "{{ tower_package_name | default('skyjokerxx/awx_web') }}" (snip) web_mem_request: 0.2 web_cpu_request: 1200 task_mem_request: 0.4 task_cpu_request: 1500 rabbitmq_mem_request: 0.1 rabbitmq_cpu_request: 500 memcached_mem_request: 0.1 memcached_cpu_request: 500 kubernetes_rabbitmq_version: "alpine" kubernetes_rabbitmq_image: "arm64v8/rabbitmq" (snip) |
デプロイ
AWXをデプロイします。
1 2 |
[root@k3s-master installer]# ansible-playbook install.yml -i inventory |
AWXへアクセス
Webアクセスするポートを確認します。
ここでは 30355
です。
1 2 3 4 5 6 7 |
[root@k3s-master ~]# kubectl -n awx get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE awx-rmq-mgmt ClusterIP 10.43.149.72 <none> 15672/TCP 34m awx-web-svc NodePort 10.43.82.197 <none> 80:30355/TCP 34m postgresql96-np NodePort 10.43.242.87 <none> 5432:32654/TCP 53m rabbitmq NodePort 10.43.73.183 <none> 15672:30560/TCP,5672:30316/TCP 34m |
http://クラスタのどれかのホストIP:30355
へアクセスしてログイン画面が表示されるか確認します。
inventoryで設定したアカウントとパスワードでログインできるか確認します。
デフォルトは以下のものです。
アカウント | パスワード |
---|---|
admin | password |
結果
一先ず、ラズパイでAWXを動かすことはできました。
しかし、スペックがやっぱり足りないので動作が結構もたつきます。。。
今後ももう少しチューニングでなんとかならないか手が空いたら色々試してみようと思います。
ちなみに体感はこんな感じです。
AWX on Raspberry pi from sky_joker on Vimeo.