[macOS] minikubeのインストールとAWXのデプロイ

macOSのDocker Desktopを利用してminikubeを起動し、その上のawx-operatorを利用してAWXをデプロイする手順の備忘録。

環境

  • HW: MacBook Pro(14"/2021)
  • CPU: Apple M1 Max
  • MEM: 32GB
  • OS: macOS Monterey 12.2.1
  • Docker: Docker Desktop 4.6.1 (76265)
  • Kubernetes: minikube v1.25.2 (commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7)

kubectlコマンドのインストール

まずはkubectlコマンドを公式ドキュメントにしたがってインストールする。m1のアーキテクチャはarm64なので、うっかり忘れてx86_64版をインストールしないこと。

minikubeをkubectlのaliasとして利用するという手もあるが、この手のやつはロクなことにならないので、クライアントコマンドくらいは普通にインストールしておく。

$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
$ sudo install kubectl /usr/local/bin
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:51:05Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"darwin/arm64"}

minikubeのインストール

Docker Desktopが提供してくれているKubernetes環境を利用しても良いが、ここではawx-operatorの公式ドキュメントでも紹介されることの多い、minikubeを利用してDocker Desktop & Kubernetesの環境を構築する。初心者が背伸びをすると大怪我するので無理はしない。これも忘れずarm64版をインストールする。

インストール手順は公式ドキュメントのminikube startにしたがう。

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
$ sudo install minikube-darwin-arm64 /usr/local/bin/minikube
$ minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7

minikubeを起動

Docker Desktopに割り当てたメモリサイズにしたがって、minikubeを起動する。ingress-nginx-controllerを利用するので、あらかじめaddonsで指定しておく。minikubeのaddons設定は便利でよい。

$ minikube start --cpus=6 --memory=16g --addons=ingress
 minikube v1.25.2 on Darwin 12.2.1 (arm64)
 Automatically selected the docker driver
 Starting control plane node minikube in cluster minikube
 Pulling base image ...
 Creating docker container (CPUs=6, Memory=16384MB) ...
 Preparing Kubernetes v1.23.3 on Docker 20.10.12 ...
 ▪ kubelet.housekeeping-interval=5m
 ▪ Generating certificates and keys ...
 ▪ Booting up control plane ...
 ▪ Configuring RBAC rules ...
 Verifying Kubernetes components...
 After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
 ▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.1.1
 ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
 ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
 ▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
 Verifying ingress addon...
 Enabled addons: storage-provisioner, default-storageclass, ingress
 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

# minikubeのステータス確認
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

# minikubeのIPアドレスを確認
$ minikube ip
192.168.49.2

# namespaceを確認(ingress-nginxが存在していること)
$ kubectl get namespace -A
NAME              STATUS   AGE
default           Active   8m10s
ingress-nginx     Active   8m8s
kube-node-lease   Active   8m12s
kube-public       Active   8m12s
kube-system       Active   8m12s

# podの起動状態を確認(ingress-nginx-controllerが起動していること)
kubectl get pods -A
NAMESPACE       NAME                                       READY   STATUS      RESTARTS        AGE
ingress-nginx   ingress-nginx-admission-create-nl49t       0/1     Completed   0               8m22s
ingress-nginx   ingress-nginx-admission-patch-hngwm        0/1     Completed   1               8m22s
ingress-nginx   ingress-nginx-controller-cc8496874-t6tlv   1/1     Running     0               8m22s
kube-system     coredns-64897985d-fmrc8                    1/1     Running     0               8m22s
kube-system     etcd-minikube                              1/1     Running     0               8m35s
kube-system     kube-apiserver-minikube                    1/1     Running     0               8m36s
kube-system     kube-controller-manager-minikube           1/1     Running     0               8m36s
kube-system     kube-proxy-6rd66                           1/1     Running     0               8m22s
kube-system     kube-scheduler-minikube                    1/1     Running     0               8m34s
kube-system     storage-provisioner                        1/1     Running     1 (8m21s ago)   8m34s

awx-operatorのデプロイ

upstreamのawx-operatorのリポジトリをcloneして、awx-operatorをデプロイする。現在(2022/03)は、make deployでおわり。namespaceはawxがデフォルトなので、変更したい場合はexport NAMESPACE=<ネームスペース>環境変数を定義してから実行する。

$ git clone https://github.com/ansible/awx-operator.git
$ cd awx-operator
$ make deploy
namespace/awx created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
serviceaccount/awx-operator-controller-manager created
role.rbac.authorization.k8s.io/awx-operator-awx-manager-role created
role.rbac.authorization.k8s.io/awx-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/awx-operator-awx-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-awx-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created


# podが起動するまで見届ける
kubectl get pods -n awx -w
NAME                                               READY   STATUS              RESTARTS   AGE
awx-operator-controller-manager-86dc5b757b-m7ldr   0/2     ContainerCreating   0          50s
awx-operator-controller-manager-86dc5b757b-m7ldr   1/2     Running             0          68s
awx-operator-controller-manager-86dc5b757b-m7ldr   2/2     Running             0          80s
^C

AWXをデプロイする

公式サイトのmeloさんのデモを参考にしつつ、ingress-nginxを利用するようなawx-demo.ymlを作成する。

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: ClusterIP
  ingress_type: ingress
  hostname: awx-demo.test.fgrep.org

awx-demo.ymlをnamespace:awxにapplyして、AWXをデプロイする。。各podがRunning状態となっても、DBマイグレーションなどの処理がバックグラウンドで動作しているので、サービスとして利用できるようになるには時間がかかる。

$ kubectl apply -f awx-demo.yml -n awx
awx.awx.ansible.com/awx-demo created

# デプロイが完了するのを待つ
$ kubectl get pods -n awx -w
NAME                                               READY   STATUS    RESTARTS   AGE
awx-operator-controller-manager-86dc5b757b-m7ldr   2/2     Running   0          9m40s
awx-demo-postgres-0                                0/1     Pending   0          0s
awx-demo-postgres-0                                0/1     Pending   0          0s
awx-demo-postgres-0                                0/1     Pending   0          1s
awx-demo-postgres-0                                0/1     Init:0/1   0          1s
awx-demo-postgres-0                                0/1     PodInitializing   0          14s
awx-demo-postgres-0                                1/1     Running           0          29s
awx-demo-766fffc8c8-rgvr9                          0/4     Pending           0          0s
awx-demo-766fffc8c8-rgvr9                          0/4     Pending           0          0s
awx-demo-766fffc8c8-rgvr9                          0/4     ContainerCreating   0          0s
awx-demo-766fffc8c8-rgvr9                          4/4     Running             0          51s

# serviceの確認
$ kubectl get service -n awx -o wide
NAME                                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE   SELECTOR
awx-demo-postgres                                 ClusterIP   None            <none>        5432/TCP   18m   app.kubernetes.io/component=database,app.kubernetes.io/instance=postgres-awx-demo,app.kubernetes.io/managed-by=awx-operator,app.kubernetes.io/name=postgres,app.kubernetes.io/part-of=awx-demo
awx-demo-service                                  ClusterIP   10.104.107.15   <none>        80/TCP     17m   app.kubernetes.io/component=awx,app.kubernetes.io/managed-by=awx-operator,app.kubernetes.io/name=awx-demo
awx-operator-controller-manager-metrics-service   ClusterIP   10.102.81.112   <none>        8443/TCP   29m   control-plane=controller-manager

# ingress-nginxの確認
$ kubectl get ingress -n awx
NAME               CLASS   HOSTS                     ADDRESS        PORTS   AGE
awx-demo-ingress   nginx   awx-demo.test.fgrep.org   192.168.49.2   80      18m

# ダッシュボードのadminユーザのパスワードを確認
$ kubectl get secret awx-demo-admin-password -o jsonpath="{.data.password}" -n awx| base64 --decode
<YOUR_PASSWORD>

minikue tunnelでawx-demoのサービスにアクセス経路を作る。ダッシュボードへのトンネルを終了したければCTRL+C

$ minikube tunnel
  Tunnel successfully started

  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

  The service/ingress awx-demo-ingress requires privileged ports to be exposed: [80 443]
  sudo permission will be asked for it.
  Starting tunnel for service awx-demo-ingress.
Password: ********

/etc/hostsにawx-test.test.fgrep.orgへのアクセスが127.0.0.1に向くようにエントリを追加する。

127.0.0.1       localhost awx-test.test.fgrep.org

Webブラウザ経由でダッシュボードにアクセス

これで、母艦であるmacosからWebブラウザ経由でAWXのダッシュボードにアクセスして利用できる。テスト目的としては十分なはず。