Contents
前回、ラズパイで作ったk3sクラスタ上にAWXをデプロイしてなんとか動く状態まですることはできましたが正直実用的ではありませんでした。
これに納得できなかった自分は、あれやこれやと色々試してみて一先ず動かせるところまで出来たのでやってみたことを書いてみようと思います。
ROC-RK3328-CCを買ってみた
ラズパイで動かないのはメモリー不足だと思っていた自分は、メモリーが積んであるARMボードを探していたところ ROC-RK3328-CC を見つけました。
メモリーが4GB乗っていたのでイケるんじゃね!?と思って早速注文!
海外からの輸入でしたが、1700円程度払ってお急ぎ便で注文してwktkしながら待っていたら数日で届きました。
待ってたぜぇ〜!この時をよぉ〜!! pic.twitter.com/47tHEl3ts6
— 日常系インフラ自動化もふもふおじさん@Ansible(コンテナ基盤構築とか自動化やりたい) (@sky_jokerxx) 2019年5月16日
ROC-RK3328-CCは Libre Computer
が作っていて、専用のイメージでしか起動しないのでUbuntuをチョイスし起動することを確認!
さっそくk3sを入れようとしたところ、k3sを動かすためのモジュールが導入できなずに断念…。
aptでインストールしようとするとどうもバージョン依存かなんかで そんなパッケージ無い!
って怒られました。
専用イメージおそるべし…という事で一旦諦め…。
諦めが悪い自分が次に試したもの
やっぱり、諦められず色々調べてみたら ROCK64 を見つけました。
これもメモリーが4GBで、日本のamazonで変えるため早速注文!
しかも、ROCK64のイメージ一覧を確認すると CentOS
があるじゃないですか!
これは次の日にすぐ到着しました 🙂
届いた
試す‼️ pic.twitter.com/3JgXKPdDxa— 日常系インフラ自動化もふもふおじさん@Ansible(コンテナ基盤構築とか自動化やりたい) (@sky_jokerxx) 2019年5月17日
ちなみにUSBは以下を購入しました。
早速、MicroSDにCentOSを入れて起動を確認!!
よっしゃ!と思ってOSの設定しようとしたら、ファイルシステムがRead Onlyに😇😇😇
どうも最新バージョンの基盤とイメージではカーネル起動時にエラーが出てファイルシステムがうまく認識できないようでCentOSは断念…。
しょうがいないので、駄目元でUbunt 18のイメージを使ったら問題なく起動しました。
で、k3s動くんかなぁと思いながらセットアップしたらめちゃんこ簡単に動くじゃ無いですか。
ktkr!!と言うことで今の構成は次のようになっています。
Rock64は秋月電子通商で買った方が安かったです。が、すぐ欲しかったので今回はAmazonでポチりました。
ラズパイ + Rock64のk3sでAWXを動かす
クラスタ構成
クラスタ構成はこんな感じになっています。
AWXのpodはRock64上で動かします。
Ubuntuのセットアップ手順
ネットワーク設定
rock64でログインしてsudoします。
ユーザー | パスワード |
---|---|
rock64 | rock64 |
以下のように環境に合わせてIPを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rock64@k3s-node01:~$ sudo su - [sudo] password for rock64: root@k3s-node01:~# vi /etc/netplan/eth0.yaml network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.0.141/24] gateway4: 192.168.0.1 nameservers: addresses: [192.168.0.1] |
設定を反映します。
1 2 |
root@k3s-node01:~# netplan apply |
ホスト名/hosts設定
ホスト名とhostsを設定します。
1 2 3 4 5 6 7 |
root@k3s-node01:~# hostnamectl set-hostname --static k3s-node01 root@k3s-node01:~# vi /etc/hosts (snip) 192.168.0.140 k3s-master 192.168.0.141 k3s-node01 192.168.0.142 k3s-node02 |
k3s agent導入
以下の手順(Fedoraと同じ)で導入しました。
AWXデプロイ
k3sにAWXをデプロイします。
普通にデプロイしてしまうと /var/lib/awx/projects
が awx-web
と awx-celery
で共有できず手動でProjectを追加できなかったり、podを動かすノードを固定化したかったのでマニフェストを以下のように書き換えました。
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
[root@k3s-master installer]# vi roles/kubernetes/templates/deployment.yml.j2 (snip) --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: {{ kubernetes_deployment_name }} namespace: {{ kubernetes_namespace }} spec: serviceName: {{ kubernetes_deployment_name }} replicas: 1 template: metadata: labels: name: {{ kubernetes_deployment_name }}-web-deploy service: django app: {{ kubernetes_deployment_name }} spec: serviceAccountName: awx terminationGracePeriodSeconds: 10 containers: - name: {{ kubernetes_deployment_name }}-web image: "{{ kubernetes_web_image }}:{{ kubernetes_web_version }}" imagePullPolicy: Always ports: - containerPort: 8052 volumeMounts: - name: {{ kubernetes_deployment_name }}-application-config mountPath: "/etc/tower" readOnly: true - name: "{{ kubernetes_deployment_name }}-application-credentials" mountPath: "/etc/tower/conf.d/" readOnly: true - name: awx-web-application-projects mountPath: /var/lib/awx/projects - name: {{ kubernetes_deployment_name }}-celery securityContext: privileged: true image: "{{ kubernetes_task_image }}:{{ kubernetes_task_version }}" command: - /usr/bin/launch_awx_task.sh imagePullPolicy: Always volumeMounts: - name: {{ kubernetes_deployment_name }}-application-config mountPath: "/etc/tower" readOnly: true - name: "{{ kubernetes_deployment_name }}-application-credentials" mountPath: "/etc/tower/conf.d/" readOnly: true - name: awx-celery-application-projects mountPath: "/var/lib/awx/projects" - name: {{ kubernetes_deployment_name }}-rabbit image: "{{ kubernetes_rabbitmq_image }}:{{ kubernetes_rabbitmq_version }}" imagePullPolicy: Always ports: - name: http protocol: TCP containerPort: 15672 - name: amqp protocol: TCP containerPort: 5672 livenessProbe: exec: command: ["rabbitmqctl", "status"] initialDelaySeconds: 30 timeoutSeconds: 10 readinessProbe: exec: command: ["rabbitmqctl", "status"] initialDelaySeconds: 10 timeoutSeconds: 10 env: - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: RABBITMQ_USE_LONGNAME value: "true" - name: RABBITMQ_NODENAME value: "rabbit@$(MY_POD_IP)" - name: RABBITMQ_ERLANG_COOKIE valueFrom: secretKeyRef: name: "{{ kubernetes_deployment_name }}-secrets" key: rabbitmq_erlang_cookie - name: K8S_SERVICE_NAME value: "rabbitmq" volumeMounts: - name: rabbitmq-config mountPath: /etc/rabbitmq - name: {{ kubernetes_deployment_name }}-memcached image: "{{ kubernetes_memcached_image }}:{{ kubernetes_memcached_version }}" imagePullPolicy: Always volumes: - name: {{ kubernetes_deployment_name }}-application-config configMap: name: {{ kubernetes_deployment_name }}-config items: - key: {{ kubernetes_deployment_name }}_settings path: settings.py - key: secret_key path: SECRET_KEY - name: "{{ kubernetes_deployment_name }}-application-credentials" secret: secretName: "{{ kubernetes_deployment_name }}-secrets" items: - key: credentials_py path: 'credentials.py' - key: environment_sh path: 'environment.sh' - name: rabbitmq-config configMap: name: rabbitmq-config items: - key: rabbitmq.conf path: rabbitmq.conf - key: enabled_plugins path: enabled_plugins - key: rabbitmq_definitions.json path: rabbitmq_definitions.json - name: awx-web-application-projects hostPath: path: /var/lib/awx/projects - name: awx-celery-application-projects hostPath: path: /var/lib/awx/projects affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k3s-node01 (snip) |
あと、一時的にデプロイされるmanagement-podはmasterで動かすようにしました。
awx podと同じノードで動かすと処理が重くなるため分けたかったからです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@k3s-master installer]# vi roles/kubernetes/templates/management-pod.yml.j2 --- apiVersion: v1 kind: Pod metadata: name: ansible-tower-management namespace: {{ kubernetes_namespace }} spec: containers: (snip) affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k3s-master (snip) |
この状態でデプロイします。
1 2 |
[root@k3s-master installer]# ansible-playbook install.yml -i inventory |
Rock64でのAWX体感速度
以下は、Apacheをインストール(SSH経由)するPlaybookを実行した時の動画です。
Playbookは手動で作っています。
awx-0 pod on Rock64 from sky_joker on Vimeo.
gitでPlaybookをcloneする時は、もっさりします。
そのため、快適に使う場合はSSDを使った方がいいかもしれません。(Rock64はUSB3.0且つUSBブートが可能です)
一先ず、そこまでストレスを感じずにやりたかったことは出来るようになったので個人的には満足しました 🙂
これで遊べる٩( ‘ω’ )و
ヒートシンクについては以下がオススメです。
余談
Rock64に間違えて12VのUSBを挿してしまったためか初回購入したものは壊してしまいました。
電源は入るんですが、MicroSDから起動せず…
そのため、2台目を購入したりしています。
2台目きました pic.twitter.com/Ef9KevCS4H
— 日常系インフラ自動化もふもふおじさん@Ansible(コンテナ基盤構築とか自動化やりたい) (@sky_jokerxx) 2019年5月19日
間違えて5V以上を挿すと壊れる可能性があます。。。