k3s v0.10.0 (k8s v1.16.2) 上に AWX 9.0.1をデプロイ

※2019/11/10　AWXのバージョンを8.0.0→9.0.1へ変更。ほとんど内容に変更はありません。

# はじめに
AWXを触ってみようと思い、@sky_jokerxx 氏の[Blog](https://sky-joker.tech/)にある以下の記事を参考にk3s環境上にデプロイを試みました。
[RANCHER LABSのK3SにAWXをデプロイしてみた | 日常系エンジニアのTech Blog](https://sky-joker.tech/2019/04/23/rancher-labs%e3%81%aek3s%e3%81%abawx%e3%82%92%e3%83%86%e3%82%99%e3%83%95%e3%82%9a%e3%83%ad%e3%82%a4%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f/)

が、ブログ記事の頃と諸々のバージョンが変わっていることから、色々とハマってしまいました。
なんとなく解決できたので、記録を残しておきます。

#ハマったポイント
### PostgreSQL がデプロイできない
####事象
k3s v0.9.1の環境でデプロイすると、
Deploy and Activate Postgres (Kubernetes)
の工程で必ずコケます。

####原因
containerdのバグです。
参考：[Upgrade containerd to include a fix for CRI issue #1280 · Issue #931 · rancher/k3s](https://github.com/rancher/k3s/issues/931)
k3sのバージョンをv0.8.1(k8s v1.14.6)まで下げるか、現時点の最新であるv0.10.0(k8s v1.16.2)まで上げるかのどちらかの対応が必要です。

####対処
今回はv0.10.0に上げることにしました。

### PostgreSQL がデプロイできない(2)
####事象
k3s v0.10.0の環境でデプロイしても、
Deploy and Activate Postgres (Kubernetes)
の工程で同じくコケます。

####原因
Kubernetes v1.16からAPIの仕様が変わり、指定のバージョンのhelm chart(6.2.1)ではデプロイに失敗します。

####対処
PostgreSQLのchartのバージョンを[6.5.0](https://hub.helm.sh/charts/stable/postgresql/6.5.0)まで上げました。

## 他にもデプロイできない
####事象
Apply Deploymentでコケます。

####原因
上記と同じくAPIの仕様変更~~と、[AWX 8.0.0リリース時に残留していたバグ](https://github.com/ansible/awx/commit/e5dfc62dce225cf5c7edee4f26847da1c666063e#diff-642b14a5fd9b35b514e48a19b448c27f)~~(AWX9.0.1では反映されてました)が原因です。

####対処
Deploymentのテンプレートファイルを修正しました。


#上記の変更点を加味した結果
以下のような手順でデプロイしました。

###k3s環境の準備
[以前の記事](https://qiita.com/ussvgr/items/b98ada65563edf77f12b)で作った手順と同じです。
2019/10/24現在、バージョンを指定しなければv0.10.0がインストールされます。

###helmの準備
以下のYAMLを準備し、applyします。

```helm-tiller.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
```
```bash
$ kubectl apply -f helm-tiller.yaml 
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
```

クライアントにhelmコマンドをインストールし、(Mac+Homebrew環境)
helm initでtillerをデプロイします。

```bash
$ brew install kubernetes-helm
$ helm init --service-account tiller
```
helm versionの結果が以下のようになればOKです。

```bash
$ helm version
Client: &version.Version{SemVer:"v2.15.0", GitCommit:"c2440264ca6c078a06e088a838b0476d2fc14750", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.15.0", GitCommit:"c2440264ca6c078a06e088a838b0476d2fc14750", GitTreeState:"clean"}
```

###Storageの準備
k3sに標準インストール時から[local-path-provisioner](https://github.com/rancher/local-path-provisioner)が導入されたので使ってみます。

```bash
$ kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
local-path-provisioner-58fb86bdfd-pfxsw   1/1     Running   0          6h38m
...
```

ConfigMap用のYAMLを作りapplyします。

```local-path-config.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: local-path-config
  namespace: kube-system
data:
  config.json: |-
        {
                "nodePathMap":[
                {
                        "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
                        "paths":["/opt/local-path-provisioner"]
                }
                ]
        }
```
```bash
$ kubectl apply -f local-path-config.yaml 
configmap/local-path-config created
```

###AWXリポジトリのクローン
[AWXのReleases](https://github.com/ansible/awx/releases)から、~~現時点(2019/10/24)で最新の8.0.0を使うことにしました。~~2019/11/10時点では9.0.1が最新です。

```bash
$ git clone https://github.com/ansible/awx.git
$ cd awx
$ git checkout -b 9.0.1 refs/tags/9.0.1
```

###inventoryファイルの書き換え
環境に合わせて書き換えます。
最低限必要そうな内容だと以下のようになります。

```diff
--- installer/inventory.orig	2019-10-24 02:12:48.000000000 +0900
+++ installer/inventory		2019-10-24 02:16:54.000000000 +0900
 # Kubernetes Install
-# kubernetes_context=test-cluster
-# kubernetes_namespace=awx
-# tiller_namespace=kube-system
+kubernetes_context=default
+kubernetes_namespace=awx
+tiller_namespace=kube-system
 # Optional Kubernetes Variables
-# pg_persistence_storageClass=StorageClassName
+pg_persistence_storageClass=local-path
```

###PostgreSQL用helm chartのバージョン書き換え
installer/roles/kubernetes/tasks/main.ymlを書き換えます。

```diff
--- installer/roles/kubernetes/tasks/main.yml.orig	2019-10-24 02:16:16.000000000 +0900
+++ installer/roles/kubernetes/tasks/main.yml		2019-10-24 02:18:26.000000000 +0900
@@ -90,7 +90,7 @@
         helm repo update --tiller-namespace={{ tiller_namespace | default('kube-system') }}
         echo {{ pg_values | quote }} | helm upgrade {{ postgresql_service_name }} --install \
           --namespace {{ kubernetes_namespace }} \
-          --version="6.2.1" \
+          --version="6.5.0" \
           --tiller-namespace={{ tiller_namespace | default('kube-system') }} \
           --values - \
           stable/postgresql
```

###Deploymentテンプレートファイルの編集
installer/roles/kubernetes/templates/deployment.yml.j2を編集します。
冒頭のハマりポイントの回避の他に、MetalLB配下に入れる設定も加えています。

```diff
--- installer/roles/kubernetes/templates/deployment.yml.j2.bak	2019-11-10 14:43:20.000000000 +0900
+++ installer/roles/kubernetes/templates/deployment.yml.j2	2019-11-10 14:22:09.000000000 +0900
@@ -131,12 +131,15 @@ userNames:
 {% endif %}
 
 ---
-apiVersion: apps/v1beta1
+apiVersion: apps/v1
 kind: StatefulSet
 metadata:
   name: {{ kubernetes_deployment_name }}
   namespace: {{ kubernetes_namespace }}
 spec:
+  selector:
+    matchLabels:
+      app: {{ kubernetes_deployment_name }}
   serviceName: {{ kubernetes_deployment_name }}
   replicas: 1
   template:
@@ -489,11 +492,12 @@ metadata:
   labels:
     name: {{ kubernetes_deployment_name }}-web-svc
 spec:
-  type: "NodePort"
+  type: LoadBalancer
   ports:
     - name: http
       port: 80
       targetPort: 8052
+  loadBalancerIP: 192.168.24.105
   selector:
     name: {{ kubernetes_deployment_name }}-web-deploy
 ---
```

###いざデプロイ
```bash
$ cd installer
$ ansible-playbook -i inventory install.yml
```
しばらく待って、

```bash
PLAY RECAP *********************************************************************************
localhost                  : ok=30   changed=15   unreachable=0    failed=0    skipped=72   rescued=0    ignored=3   
```
のような行が表示されたら完了です。

全コンテナが上がったことを確認し、

```bash
$ kubectl get pod -n awx
NAME                          READY   STATUS    RESTARTS   AGE
awx-postgresql-postgresql-0   1/1     Running   0          25m
awx-0                         4/4     Running   0          35s
```

http://192.168.24.105 にアクセスして、
<img width="773" alt="スクリーンショット 2019-10-24 3.46.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/ea7d8fa4-a50f-5c12-979d-a387eb0236f5.png">
ログイン画面が表示されたら完了です。
ユーザー名／パスワードはinventoryファイルの中に書いてあります。

![スクリーンショット 2019-11-10 16.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/88801375-ef62-1a2e-c22a-0cf8bf8749d2.png)