Contents
この投稿はAnsible 2 Advent Calendar 2019(通称裏アドベントカレンダー?)の11日めの記事です。
1週間全部俺の4回目です!
今回はtower-operatorを使ってk8s(kind)にAWXをサクッと作ってみます。
tower-operator
tower-operatorはJeff GeerlingさんがOperator SDKとAnsibleを組み合わせて作られてるオペレーターです。
このオペレーターを使うことで簡単にAnsible TowerやAWXをk8s上に構築することができます。
ここではkindでクラスタを作ってOperator podをデプロイしAWX環境を構築してみようと思います。
環境
項目 | バージョン |
---|---|
kind | 0.6.0 |
Ansible Tower/AWX Operator | 0.2.0 |
CentOS | 7.7.1908 |
今回の検証で使ったVMのスペックは4CPU/6GB Memoryです。
kindクラスタの準備
kindのインストール
kindコマンドのインストール方法は以下のドキュメントを参考にしてください。
また、kubectlコマンドのインストール方法は以下のドキュメントを参考にしてください。
クラスタの作成
今回はcontrol-planeとworkerを1つずつ作ってみます。
1 2 |
[root@operator ~]# vi kind-cluster.yml |
1 2 3 4 5 6 |
kind: Cluster apiVersion: kind.sigs.k8s.io/v1alpha3 nodes: - role: control-plane - role: worker |
クラスタの作成を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@operator ~]# kind create cluster --config kind-cluster.yml Creating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.16.3) 🖼 ✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 ✓ Joining worker nodes 🚜 Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/ |
ノードを確認してみます。
1 2 3 4 5 |
[root@operator ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready master 67s v1.16.3 kind-worker Ready <none> 26s v1.16.3 |
ラベルの設定をします。
1 2 3 4 5 6 7 |
[root@operator ~]# kubectl label node kind-worker node-role.kubernetes.io/worker=worker node/kind-worker labeled [root@operator ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready master 2m21s v1.16.3 kind-worker Ready worker 100s v1.16.3 |
local-path-provisionerインストール
Ansible Tower/AWXで使用するPostgreSQLのPodがボリュームをマウントするのですが、kindの標準ではうまくマウントできないので次のコマンドでlocal-path-provisionerをインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@operator ~]# kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml namespace/local-path-storage created serviceaccount/local-path-provisioner-service-account created clusterrole.rbac.authorization.k8s.io/local-path-provisioner-role created clusterrolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created deployment.apps/local-path-provisioner created storageclass.storage.k8s.io/local-path created configmap/local-path-config created [root@operator ~]# kubectl patch storageclass standard -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false", "storageclass.beta.kubernetes.io/is-default-class":"false"}}}' storageclass.storage.k8s.io/standard patched [root@operator ~]# kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true", "storageclass.beta.kubernetes.io/is-default-class":"true"}}}' storageclass.storage.k8s.io/local-path patched |
これで、PVおよびPVCは自動で作ってくれます。
Ansible Tower/AWX Operatorデプロイ
次のコマンドでオペレーターをデプロイします。
1 2 3 4 5 6 7 |
[root@operator ~]# kubectl apply -f https://raw.githubusercontent.com/geerlingguy/tower-operator/master/deploy/tower-operator.yaml customresourcedefinition.apiextensions.k8s.io/towers.tower.ansible.com created clusterrole.rbac.authorization.k8s.io/tower-operator created clusterrolebinding.rbac.authorization.k8s.io/tower-operator created serviceaccount/tower-operator created deployment.apps/tower-operator created |
オペレーターpodが起動したか確認します。
1 2 3 4 |
[root@operator ~]# kubectl get pods NAME READY STATUS RESTARTS AGE tower-operator-7d5749cb56-z67q8 2/2 Running 0 2m6s |
AWX podのデプロイ
AWXをデプロイするマニフェストを作成します。
標準だとAnsible Towreがデプロイされていまうので、AWXをデプロイする場合は tower_task_image
と tower_web_image
を上書きします。
1 2 |
[root@operator ~]# vi tower.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--- apiVersion: v1 kind: Namespace metadata: name: tower --- apiVersion: tower.ansible.com/v1alpha1 kind: Tower metadata: name: tower namespace: tower spec: tower_hostname: tower.test tower_secret_key: aabbcc tower_admin_user: admin tower_admin_email: admin@example.com tower_admin_password: password tower_task_image: ansible/awx_task:9.0.1 tower_web_image: ansible/awx_web:9.0.1 |
次のコマンドを実行してクラスタにAWXをデプロイします。
1 2 3 4 |
[root@operator ~]# kubectl apply -f tower.yml namespace/tower created tower.tower.ansible.com/tower created |
AWXのpodが起動したか確認します。
1 2 3 4 5 6 7 8 |
[root@operator ~]# kubectl get pods -n tower NAME READY STATUS RESTARTS AGE tower-memcached-587b55d5fd-pz79s 1/1 Running 0 3m6s tower-postgres-0 1/1 Running 0 3m5s tower-rabbitmq-7f8f6ff647-d6h64 1/1 Running 0 3m4s tower-tower-task-56b8bcfc84-4bq6w 1/1 Running 0 3m2s tower-tower-web-7645554d55-b5wbs 1/1 Running 0 3m3s |
Serviceの作成
外部からAWX podへアクセスするためのServiceを作ってみます。
1 2 |
[root@operator ~]# vi tower-service2.yml |
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Service metadata: name: tower-service2 namespace: tower spec: selector: app: tower ports: - port: 8052 type: NodePort |
1 2 3 |
[root@operator ~]# kubectl apply -f tower-service2.yml service/tower-service2 created |
NodePortの設定を確認します。
今回はクラスタノードのIPに対して 30859
でアクセスすればAWXのWebGUIへアクセスできることが確認できます。
1 2 3 4 5 6 7 8 |
[root@operator ~]# kubectl get svc -n tower NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tower-memcached ClusterIP None <none> 11211/TCP 7m10s tower-postgres ClusterIP None <none> 5432/TCP 7m9s tower-rabbitmq ClusterIP None <none> 5672/TCP 7m8s tower-service ClusterIP 10.96.65.242 <none> 80/TCP 7m7s tower-service2 NodePort 10.102.217.48 <none> 8052:30859/TCP 18s |
NATの設定
今回はNATを入れてアクセスしてみます。
tower-webが起動しているノードのIPを確認します。
1 2 3 4 5 |
[root@operator ~]# kubectl get pods -n tower | grep web tower-tower-web-7645554d55-b5wbs 1/1 Running 0 9m45s [root@operator ~]# kubectl describe pods/tower-tower-web-7645554d55-b5wbs -n tower | grep Node Node: kind-worker/172.17.0.2 |
前、NATを入れるツールを作っていたのでそれを使ってNAT設定を入れてみます。
1 2 3 4 |
[root@operator ~]# curl -L https://raw.githubusercontent.com/sky-joker/docker-container-nat/master/docker-container-nat.sh -O [root@operator ~]# chmod +x docker-container-nat.sh [root@operator ~]# ./docker-container-nat.sh -a -p tcp -n 80 -t 30859 -c 172.17.0.2 |
これで、kindをデプロイしたホストのIPでアクセスすればAWXのログイン画面が表示されます。
URL |
---|
http://IP Addr |
最後に
オペレーターを使う事でk8s上に簡単にAnsible Tower/AWXの環境がデプロイできますね!
これは好きなときに好きなだけデプロイ(リソースが許される限り)できるので、ますます検証が捗りそうです 🙂
4回目は以上です!次!