mito’s blog

IT技術メインの雑記。思い立ったが吉日。

[AWX] Ubuntuにk3sとawx-operatorでAWXを構築する(更新2023.03.28)

はじめに

AWXバージョン21をk3s上にawx-operatorで構築します。
構築手順は、整理したらそんなに複雑ではなかったです。また、Githubにはminikubeを例にした構築手順が載っていますが、k3sは軽いというし触ってみたかったので。

GitHub - ansible/awx-operator: An Ansible AWX operator for Kubernetes built with Operator SDK and Ansible. 🤖



更新2023.03.28

いくつかワーニングが出ますが、以下の環境(latest)でも同じ手順で構築できました。

環境
  • AWX: 21.14(latest)
  • OS: Ubuntu 22.04
    • Keyのタイプはed25519で作成してください。
    • インスタンスタイプ: t3.medium
    • 容量: 30GB
    • セキュリティグループ: sshとポート30080をあけます。
  • k3s: v1.25.7(latest)
  • kustomize: v5.0.1(latest)
  • awx-operator: 1.4.0


環境

EC2に構築します。

  • AWX: 21.4
  • OS: Ubuntu 22.04
    • Keyのタイプはed25519で作成してください。
    • インスタンスタイプ: t3.medium
    • 容量: 30GB
    • セキュリティグループ: sshとポート30080をあけます。
  • k3s: v1.24.3
  • kustomize: v4.5.7
  • awx-operator: 0.26.0


Ubuntuのパッケージアップデート

パッケージを最新に上げます。

$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot
# OKを押す


k3sのインストール

1行でインストールできます。
インストール後、サービスが起動完了するまで少々待ちます。

$ sudo curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
[INFO]  Finding release for channel stable
[INFO]  Using v1.24.3+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.24.3+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.24.3+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s


オプションについて

  • --write-kubeconfig-mode 644

エラーメッセージ

error: error loading config file "/etc/rancher/k3s/k3s.yaml": open /etc/rancher/k3s/k3s.yaml: permission denied



Kustomizeのインストールとマニフェストの適用

Kustomizeは、マニフェスト管理ツールです(今回初めて触りました)。
Kustomizeをインストールし、マニフェストを作成・適用します。
マニフェストには、awx-operatorのバージョンを指定します。

$ sudo curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
{Version:kustomize/v4.5.7 GitCommit:56d82a8378dfc8dc3b3b1085e5a6e67b82966bd7 BuildDate:2022-08-02T16:35:54Z GoOs:linux GoArch:amd64}
kustomize installed to /home/ubuntu/kustomize
$ 
$ 
$ vi kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # Find the latest tag here: https://github.com/ansible/awx-operator/releases
  - github.com/ansible/awx-operator/config/default?ref=0.26.0        # 任意のバージョンを指定

# Set the image tags to match the git version from above
images:
  - name: quay.io/ansible/awx-operator
    newTag: 0.26.0        # 任意のバージョンを指定

# Specify a custom namespace in which to install AWX
namespace: awx
$ 
$ 
$ sudo ./kustomize build . | kubectl apply -f -
namespace/awx created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
serviceaccount/awx-operator-controller-manager created
role.rbac.authorization.k8s.io/awx-operator-awx-manager-role created
role.rbac.authorization.k8s.io/awx-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/awx-operator-awx-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-awx-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created
$ 
$ 
$ kubectl get pods -n awx
NAME                                               READY   STATUS    RESTARTS   AGE
awx-operator-controller-manager-7f89bd5797-89w7b   2/2     Running   0          4m5s


AWXのインストール(マニフェストの追加)

AWXをデプロイするawx-demo.yamlの作成と、kustomization.yamlのresourcesにawx-demo.yamlを追加します。
awx-demo.yamlのportは適宜変更してください。

  • AWXをデプロイするawx-demo.yamlの作成
$ vi awx-demo.yaml
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: nodeport
  # default nodeport_port is 30080
  nodeport_port: 30080


  • kustomization.yamlのresourcesにawx-demo.yamlを追加
$ vi kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # Find the latest tag here: https://github.com/ansible/awx-operator/releases
  - github.com/ansible/awx-operator/config/default?ref=0.26.0
  - awx-demo.yaml                     # この行を追加

# Set the image tags to match the git version from above
images:
  - name: quay.io/ansible/awx-operator
    newTag: 0.26.0

# Specify a custom namespace in which to install AWX
namespace: awx


  • マニュフェストの適用
$ sudo ./kustomize build . | kubectl apply -f -
namespace/awx unchanged
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com unchanged
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com unchanged
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com unchanged
serviceaccount/awx-operator-controller-manager unchanged
role.rbac.authorization.k8s.io/awx-operator-awx-manager-role configured
role.rbac.authorization.k8s.io/awx-operator-leader-election-role unchanged
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader unchanged
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role unchanged
rolebinding.rbac.authorization.k8s.io/awx-operator-awx-manager-rolebinding unchanged
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding unchanged
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding unchanged
configmap/awx-operator-awx-manager-config unchanged
service/awx-operator-controller-manager-metrics-service unchanged
deployment.apps/awx-operator-controller-manager configured
awx.awx.ansible.com/awx-demo created


  • AWXの構築

ログを確認しながら、インストール完了まで待ちます。

$ kubectl logs -f deployments/awx-operator-controller-manager -c awx-manager -n awx
()
--------------------------- Ansible Task StdOut -------------------------------

 TASK [Remove ownerReferences reference] ********************************
ok: [localhost] => (item=None) => {"censored": "the output has been hidden due to the fact that 'no_log: true' was specified for this result", "changed": false}

-------------------------------------------------------------------------------
{"level":"info","ts":1662367322.9867978,"logger":"runner","msg":"Ansible-runner exited successfully","job":"3826332412612488260","name":"awx-demo","namespace":"awx"}

----- Ansible Task Status Event StdOut (awx.ansible.com/v1beta1, Kind=AWX, awx-demo/awx) -----


PLAY RECAP *********************************************************************
localhost                  : ok=69   changed=0    unreachable=0    failed=0    skipped=50   rescued=0    ignored=0

----------
Ctrl+cで抜けます


awx-demoのステータスがRunningになったら、portとadminパスワードを確認します。

$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator" -n awx
NAME                        READY   STATUS    RESTARTS   AGE
awx-demo-postgres-13-0      1/1     Running   0          3m25s
awx-demo-858b46b795-rqj2j   4/4     Running   0          2m54s
$ 
$ 
$  kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator" -n awx
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
awx-demo-postgres-13   ClusterIP   None           <none>        5432/TCP       9m52s
awx-demo-service       NodePort    10.43.66.172   <none>        80:30080/TCP   9m23s # ポートの確認
$ 
$ 
$ kubectl get secret awx-demo-admin-password -o jsonpath="{.data.password}" -n awx | base64 --decode
qJcokXXXXXXXXXXXXX    # パスワードの確認


AWXにアクセス

AWXにブラウザで接続します。

  • URL: http://IPアドレス:30080
  • ユーザ名: admin
  • パスワード: 上記コマンドで確認したパスワード

無事アクセスでき、DEMOジョブテンプレートも動きました。


その他

UIもそうだけど、ワークフローテンプレートが作り方が結構変わっていて興味深い。
トポロジーは小規模ならそこまで気にしなくていいのかな?コントローラーと実行ノードが分かれているだけで、この辺りは使いやすそう。


参考

大変助かりました!