[Ansible]AWXをminikubeで公開する方法


# 概要

Minikubeを使ってAWXをサーバ外からアクセスするための手順紹介です。

AWXのドキュメントを見ながら環境作成するとminikubeが紹介されるのでそのまま構築しがちですが
minikubeは、ローカル環境内での開発環境を提供するものでローカル環境を超えてネットワーク上からアクセスするにはかなり面倒な設定が必要になります。

筆者も、何も考えずminikubeで作ってみたが外部からのアクセスできないことに気づき四苦八苦しました。
それでも、[ドキュメント](https://github.com/ansible/awx-operator)通りにminikubeでAWXを作りたいということがあるかと思うので対応方法を書いておきます。

# 環境
- OS: Centos7.9
- Docker: 20.10.12
- minikube: 1.24.0
- kubernetes: 1.22.3
- AWX operator: 0.15.0
- AWX: 19.5.0

# Minikubeの仕様

MinikubeをDockerドライバで動かした場合、全体像は以下の図の通りとなっています。

![minikube.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/77b3b951-05f5-6aeb-1636-0d59c701e11d.png)

ポイントとしては以下の2つでminikubeが一般ユーザ向けに考えられている点です。
そのため外部にウェルノウンポートでポート公開するにはminikube外の仕組みを使って上げる必要があります。

- docker環境にコンテナとしてKubernetesホストを立てているため、kubectlでポート公開するように設定しても公開先はDockerを動かしているローカルホストまで
- minikubeはroot権限では動かせないため、ウェルノウンポートを外部公開する事はできない

`minikube tunnel`を使うことで`192.168.49.2`から`10.96.0.0/12`にトンネルを貼ることができ外部公開をすることができる。
ただし、ルーティング設定が必要となるのとコマンドはフォアグラウンドでの実行となるためサービス化できない。

# 手順

以下がminikubeで外部公開するための手順です。
通常の手順外の作業は`※`をつけています。

手順は6.以外は一般ユーザとして実行しています。

1. 必要資材のダウンロード
2. **minikube kubectlをalias登録※**
3. minikube start
4. AWX Operatorのインストール
5. AWXのデプロイ
6. **firewalldでポート転送※**


## 1. 事前準備

構築に必要な下記資材をダウンロード・インストールしておく

- git
- minikube
- awx-operator

## 2. **minikube kubectlをalias登録※**

ドキュメントでは、下記コマンドで問題ないと言われているがawx-operatorv0.15.0時点では3. のAWX Operatorのインストールをするタイミングでエイリアスが読み取れず失敗してしまう。

```bash
alias kubectl="minikube kubectl --"
```


```bash:error
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
cd config/manager && /home/awx/awx-operator-0.15.0/bin/kustomize edit set image controller=quay.io/ansible/awx-operator:
cd config/default && /home/awx/awx-operator-0.15.0/bin/kustomize edit set namespace awx
/home/awx/awx-operator-0.15.0/bin/kustomize build config/default | kubectl apply -f -
/bin/sh: kubectl: コマンドが見つかりません
make: *** [deploy] エラー 127
```

そのため、`/usr/local/bin`配下に下記bashスクリプトを置いて対応する。

```bash:/usr/local/bin/kubectl
#!/bin/bash
args="$@"
minikube kubectl -- $args
```

## 3. minikube start

minikubeをスタートします。
特にドキュメントから変更はなく下記コマンドで問題ありません。

```bash
minikube start --cpus=4 --memory=6g --addons=ingress
```

## 4. AWX Operatorのインストール

AWX Operatorをインストールします。
AWX Operatorをgitからcloneするときは`git cehckout`でタグを指定してあげてください。

```bash
export NAMESPACE=my-namespace
make deploy
```

## 5. AWXのデプロイ

マニフェストファイルを作って`kubectl apply`します。
今回、HTTPSでアクセスできるようにするためingressを使います。
`ingress_type: ingress`を入れてあげると勝手にingress側で証明書作成してくれるようでした。

```yaml:awx.yml
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
spec:
  hostname: awx.example.com
  service_type: ClusterIP
  ingress_type: ingress
```

## 6. **firewalldでポート転送※**

上記手順までで、ローカルホストから`awx.example.com`を使って、minikubeのエンドポイント(192.168.49.2)へのアクセスは可能になります。
ただし、外部からはアクセスできないため別途firewalldでポート転送をしてあげます。
こうすることで、外部からアクセスが可能になります。

```bash
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toport=443:toaddr=`minikube ip`
sudo firewall-cmd --reload
```

# 参考URL

- https://github.com/ansible/awx-operator/issues/614
- https://github.com/ansible/awx-operator/issues/468