[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のダッシュボードにアクセスして利用できる。テスト目的としては十分なはず。