※2019/11/10 AWXのバージョンを8.0.0→9.0.1へ変更。ほとんど内容に変更はありません。
はじめに
AWXを触ってみようと思い、@sky_jokerxx 氏のBlogにある以下の記事を参考にk3s環境上にデプロイを試みました。
RANCHER LABSのK3SにAWXをデプロイしてみた | 日常系エンジニアのTech Blog
が、ブログ記事の頃と諸々のバージョンが変わっていることから、色々とハマってしまいました。
なんとなく解決できたので、記録を残しておきます。
ハマったポイント
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
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まで上げました。
他にもデプロイできない
事象
Apply Deploymentでコケます。
原因
上記と同じくAPIの仕様変更と、AWX 8.0.0リリース時に残留していたバグ(AWX9.0.1では反映されてました)が原因です。
対処
Deploymentのテンプレートファイルを修正しました。
上記の変更点を加味した結果
以下のような手順でデプロイしました。
k3s環境の準備
以前の記事で作った手順と同じです。
2019/10/24現在、バージョンを指定しなければv0.10.0がインストールされます。
helmの準備
以下のYAMLを準備し、applyします。
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
$ kubectl apply -f helm-tiller.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
クライアントにhelmコマンドをインストールし、(Mac+Homebrew環境)
helm initでtillerをデプロイします。
$ brew install kubernetes-helm
$ helm init --service-account tiller
helm versionの結果が以下のようになればOKです。
$ 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が導入されたので使ってみます。
$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
local-path-provisioner-58fb86bdfd-pfxsw 1/1 Running 0 6h38m
...
ConfigMap用のYAMLを作りapplyします。
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"]
}
]
}
$ kubectl apply -f local-path-config.yaml
configmap/local-path-config created
AWXリポジトリのクローン
AWXのReleasesから、~~現時点(2019/10/24)で最新の8.0.0を使うことにしました。~~2019/11/10時点では9.0.1が最新です。
$ git clone https://github.com/ansible/awx.git
$ cd awx
$ git checkout -b 9.0.1 refs/tags/9.0.1
inventoryファイルの書き換え
環境に合わせて書き換えます。
最低限必要そうな内容だと以下のようになります。
--- 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を書き換えます。
--- 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配下に入れる設定も加えています。
--- 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
---
いざデプロイ
$ cd installer
$ ansible-playbook -i inventory install.yml
しばらく待って、
PLAY RECAP *********************************************************************************
localhost : ok=30 changed=15 unreachable=0 failed=0 skipped=72 rescued=0 ignored=3
のような行が表示されたら完了です。
全コンテナが上がったことを確認し、
$ 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 にアクセスして、
ログイン画面が表示されたら完了です。
ユーザー名/パスワードはinventoryファイルの中に書いてあります。