※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ファイルの中に書いてあります。