awx-operatorを使ってk8s上にAWXをデプロイする

執筆日: 2021-04-24

# 環境
OS: Ubuntu 20.10
K8s: MicroK8s

# MicroK8sインストール

Kubernetes環境を他の方法で用意した場合はこの章をスキップ

参考: https://microk8s.io/

1コマンドで完了

```
# snap install microk8s --classic
```

しばらく時間が掛かるので放置する。microk8sが使えるようになると以下のコマンドが実施できる

```
# microk8s status
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    dns                  # CoreDNS
    ha-cluster           # Configure high availability on the current node
    storage              # Storage class; allocates storage from host directory
  disabled:
    ambassador           # Ambassador API Gateway and Ingress
    cilium               # SDN, fast with full network policy
    dashboard            # The Kubernetes dashboard
    fluentd              # Elasticsearch-Fluentd-Kibana logging and monitoring
    gpu                  # Automatic enablement of Nvidia CUDA
    helm                 # Helm 2 - the package manager for Kubernetes
    helm3                # Helm 3 - Kubernetes package manager
    host-access          # Allow Pods connecting to Host services smoothly
    ingress              # Ingress controller for external access
    istio                # Core Istio service mesh services
    jaeger               # Kubernetes Jaeger operator with its simple config
    keda                 # Kubernetes-based Event Driven Autoscaling
    knative              # The Knative framework on Kubernetes.
    kubeflow             # Kubeflow for easy ML deployments
    linkerd              # Linkerd is a service mesh for Kubernetes and other frameworks
    metallb              # Loadbalancer for your Kubernetes cluster
    metrics-server       # K8s Metrics Server for API access to service metrics
    multus               # Multus CNI enables attaching multiple network interfaces to pods
    portainer            # Portainer UI for your Kubernetes cluster
    prometheus           # Prometheus operator for monitoring and logging
    rbac                 # Role-Based Access Control for authorisation
    registry             # Private image registry exposed on localhost:32000
    traefik              # traefik Ingress controller for external access

```

- AWX用のPostgresがPVCを必要とする
- WebGUIとPostgresがPod間の名前解決を必要とする

上記の理由から以下のコマンドでCoreDNS/Storageを有効化しておく

```
# microk8s enable dns storage
```

# AWXのインストール
参考: https://github.com/ansible/awx/blob/devel/INSTALL.md

## awx-operatorの適用
現時点でのawx-opperatorの最新タグが0.8.0のため、以下コマンドでoperatorをインストール

```
# kubectl apply -f https://raw.githubusercontent.com/ansible/awx-operator/0.8.0/deploy/awx-operator.yaml
```

OperatorのPodが起動するまで放置

## AWXデプロイ

AWX用のnamespaceを作成してデプロイする

```yaml
# cat awx.yaml 
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
  namespace: awx
spec:
  tower_ingress_type: Ingress
```

```
# kubectl create ns awx
# kubectl apply -f awx.yaml
```

デプロイ完了まで放置
AWXのWebGUIのアクセスURLは以下で確認する
NodePortが30195なので、Webブラウザから`http://localhost:30195`にアクセスすることでAWXのトップページにアクセスできる。

```
# kubectl get svc -n awx
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
awx-postgres   ClusterIP   None             <none>        5432/TCP       39m
awx-service    NodePort    10.152.183.252   <none>        80:30195/TCP   38m
```

Pod起動後はAWX自体のアップグレード処理が内部で走るため、こちらもしばらく放置することになる。
処理が完了すると、ログイン画面が表示される

![Screenshot from 2021-04-24 13-29-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190055/779b9042-a513-362f-2bb9-dbac833b7600.png)

adminユーザーのパスワードは以下で確認可能。

```
# kubectl get secret awx-admin-password -o jsonpath='{.data.password}' | base64 --decode
```

## adminユーザーでログインできないときは

インストールのとき試行錯誤したためか、ログインに失敗した。このときはadminではないsuperuserを新たに作成することで対応した。

```
# kubectl exec -n awx pod/awx-b5f6cf4d4-sqmsd --container awx-web -it awx-manage createsuperuser
```

参考: https://github.com/ansible/awx-operator/issues/123