--- title: Tanzu Application Platform 1.2 (Full Profile) をAKSにインストールしAzure ADと連携するメモ - Self Signed編 tags: ["Kubernetes", "Cartographer", "AKS", "Tanzu", "TAP", "Knative", "Azure", "Backstage"] categories: ["Dev", "CaaS", "Kubernetes", "TAP"] date: 2022-07-19T18:04:53Z updated: 2022-08-14T16:59:53Z --- > ℹ️ 2022-08-14 1.2.1版にアップデートしました。 [Tanzu Application Platform 1.2](https://docs.vmware.com/en/Tanzu-Application-Platform/1.2/tap//GUID-overview.html) をAKSにインストールします。 本記事ではTAPをInstallし、"Hello World"なアプリケーションをソースコードからデプロイする機能("Source to URL")を試します。
コンテナレジストリにはACRを使用し、RBACをAzure ADと連携します。
また、Self Signedな証明書でHTTPSを有効にします。 **目次** ### 必要なCLI 以下のCLIは事前にインストール済みとします。 * [kubectl](https://kubernetes.io/docs/tasks/tools/) * [az](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) ### リソースグループ作成 ``` az group create --name tap-rg --location japaneast ``` ### ACRインスタンスの作成 今回はACRのadminアカウントを使用します。 ``` ACR_NAME=tap${RANDOM} az acr create --resource-group tap-rg \ --location japaneast \ --name ${ACR_NAME} --sku standard \ --admin-enabled true ``` ``` ACR_SERVER=${ACR_NAME}.azurecr.io ACR_USERNAME=${ACR_NAME} ACR_PASSWORD=$(az acr credential show --name ${ACR_NAME} --resource-group tap-rg --query 'passwords[0].value' --output tsv) docker login ${ACR_SERVER} -u ${ACR_USERNAME} -p ${ACR_PASSWORD} ``` ### AKSクラスタの作成 AKSクラスタにはstandard_f4s_v2 (4 vCPU, 8GB Memory)のWorker Nodeを使用し、cluster-autoscalerを有効にしておきます。またAzure ADとの連携を有効にします。 ``` az aks create \ --resource-group tap-rg \ --location japaneast \ --name tap-sandbox \ --node-count 2 \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 10 \ --node-vm-size standard_f4s_v2 \ --load-balancer-sku standard \ --zones 1 2 3 \ --generate-ssh-keys \ --attach-acr ${ACR_NAME} \ --enable-aad ``` TAPのインストールはadminアカウントで行います。 ``` az aks get-credentials --resource-group tap-rg --name tap-sandbox --admin --overwrite-existing ``` 後にContourのEnvoyへのIPを静的に設定するための、権限をAKSクラスタに与ます。以下のドキュメントを参考にしました。
https://docs.microsoft.com/en-us/azure/aks/static-ip#create-a-service-using-the-static-ip-address ``` RG_ID=$(az group show --name tap-rg -o tsv --query id ) SP_APP_ID=$(az aks show --name tap-sandbox --resource-group tap-rg --query "identity.principalId" -o tsv) az role assignment create --assignee-object-id ${SP_APP_ID} --assignee-principal-type "ServicePrincipal" --role "Network Contributor" --scope ${RG_ID} ``` ### Pivnet CLIのインストール ここでは [`pivnet`](https://github.com/pivotal-cf/pivnet-cli) CLIを使用して必要なソフトウェアをダウンロードします。 `pivnet` CLIはbrewでインストールできます。 ``` brew install pivotal/tap/pivnet-cli ``` [VMware Tanzu Network](https://network.tanzu.vmware.com/) のAPI Tokenを取得して、`pivnet` CLIでログインします。 ``` pivnet login --api-token= ``` ### EULAの承諾 初めてインストールする場合は、以下のコンポーネントのEULAをAcceptしてください。 * [Tanzu Application Platform](https://network.tanzu.vmware.com/products/tanzu-application-platform/) * [Cluster Essentials for VMware Tanzu](https://network.tanzu.vmware.com/products/tanzu-cluster-essentials/) > ⚠️ EULAで定められている使用期間は30日間です。とは言え、特にソフトウェア的に制限がかけられているわけではありません。 ### Tanzu CLIのインストール ``` # For Mac pivnet download-product-files --product-slug='tanzu-application-platform' --release-version='1.2.1' --glob='tanzu-framework-darwin-amd64.tar' # For Linux pivnet download-product-files --product-slug='tanzu-application-platform' --release-version='1.2.1' --glob='tanzu-framework-linux-amd64.tar' # For Windows pivnet download-product-files --product-slug='tanzu-application-platform' --release-version='1.2.1' --glob='tanzu-framework-windows-amd64.zip' ``` ``` tar xvf tanzu-framework-*-amd64.tar install cli/core/v0.11.6/tanzu-core-*_amd64 /usr/local/bin/tanzu export TANZU_CLI_NO_INIT=true ``` ``` $ tanzu version version: v0.11.6 buildDate: 2022-05-20 sha: 90440e2b ``` プラグインのインストール ``` tanzu plugin install --local cli all ``` ### Cluster Essentials for VMware Tanzuのインストール TAPのインストールに必要なKapp ControllerとSecretgen Controllerをデプロイするために [Cluster Essentials for VMware Tanzu](https://network.tanzu.vmware.com/products/tanzu-cluster-essentials/#/releases/1130414) をインストールします。 ``` # Mac pivnet download-product-files --product-slug='tanzu-cluster-essentials' --release-version='1.2.0' --glob='tanzu-cluster-essentials-darwin-amd64-*' # Linux pivnet download-product-files --product-slug='tanzu-cluster-essentials' --release-version='1.2.0' --glob='tanzu-cluster-essentials-linux-amd64-*' ``` ```yaml TANZUNET_USERNAME=... TANZUNET_PASSWORD=... mkdir tanzu-cluster-essentials tar xzvf tanzu-cluster-essentials-*-amd64-*.tgz -C tanzu-cluster-essentials export INSTALL_BUNDLE=registry.tanzu.vmware.com/tanzu-cluster-essentials/cluster-essentials-bundle:1.2.0 export INSTALL_REGISTRY_HOSTNAME=registry.tanzu.vmware.com export INSTALL_REGISTRY_USERNAME=${TANZUNET_USERNAME} export INSTALL_REGISTRY_PASSWORD=${TANZUNET_PASSWORD} cd tanzu-cluster-essentials ./install.sh --yes cd .. ``` ### Tanzu Application Platformのインストール #### TAP用Package Repositoryの登録 ``` TANZUNET_USERNAME=... TANZUNET_PASSWORD=... kubectl create ns tap-install tanzu secret registry add tap-registry \ --username "${TANZUNET_USERNAME}" \ --password "${TANZUNET_PASSWORD}" \ --server registry.tanzu.vmware.com \ --export-to-all-namespaces \ --yes \ --namespace tap-install tanzu package repository add tanzu-tap-repository \ --url registry.tanzu.vmware.com/tanzu-application-platform/tap-packages:1.2.1 \ --namespace tap-install ``` #### Envoy用のPublic IPを作成 ``` az network public-ip create --resource-group tap-rg --location japaneast --name envoy-ip --sku Standard --allocation-method static ``` ``` ENVOY_IP=$(az network public-ip show --resource-group tap-rg --name envoy-ip --query ipAddress --output tsv) ``` #### Full Profileのインストール TAPをインストールするための`tap-values.yml`を作成します。 `cnrs.domain_name`には仮のドメインを指定します。あとでenvoyのExternal IPが設定されてから変更します。 Learning Centerは使用しないため、またgrypeは個別にインストールした方良いため([こちらの記事](https://ik.am/entries/698)参照)、 これらのパッケージは`excluded_packages`除外します。 また、Cloud Native RuntimesはKnative Servingしか使わないので、それ以外のリソースを削除するoverlayを設定します。 ```yaml DOMAIN_NAME=$(echo ${ENVOY_IP} | sed 's/\./-/g').sslip.io cat < tap-values.yml profile: full ceip_policy_disclosed: true cnrs: domain_name: ${DOMAIN_NAME} domain_template: "{{.Name}}-{{.Namespace}}.{{.Domain}}" default_tls_secret: tanzu-system-ingress/cnrs-default-tls buildservice: kp_default_repository: ${ACR_SERVER}/build-service kp_default_repository_username: ${ACR_USERNAME} kp_default_repository_password: ${ACR_PASSWORD} supply_chain: basic ootb_supply_chain_basic: registry: server: ${ACR_SERVER} repository: supply-chain gitops: ssh_secret: git-ssh contour: infrastructure_provider: azure envoy: service: type: LoadBalancer externalTrafficPolicy: Local annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: tap-rg tap_gui: ingressEnabled: true ingressDomain: ${DOMAIN_NAME} service_type: ClusterIP tls: secretName: cnrs-default-tls namespace: tanzu-system-ingress app_config: app: baseUrl: https://tap-gui.${DOMAIN_NAME} backend: baseUrl: https://tap-gui.${DOMAIN_NAME} cors: origin: https://tap-gui.${DOMAIN_NAME} catalog: locations: - type: url target: https://github.com/sample-accelerators/tanzu-java-web-app/blob/main/catalog/catalog-info.yaml - type: url target: https://github.com/sample-accelerators/spring-petclinic/blob/accelerator/catalog/catalog-info.yaml - type: url target: https://github.com/tanzu-japan/spring-music/blob/tanzu/catalog/catalog-info.yaml accelerator: domain: ${DOMAIN_NAME} ingress: include: true enable_tls: true tls: secret_name: cnrs-default-tls namespace: tanzu-system-ingress server: service_type: ClusterIP metadata_store: app_service_type: ClusterIP ingress_enabled: "true" ingress_domain: ${DOMAIN_NAME} scanning: metadataStore: url: "" # Disable embedded integration since it's deprecated package_overlays: - name: contour secrets: - name: contour-loadbalancer-ip - name: cnrs secrets: - name: cnrs-default-tls - name: cnrs-slim - name: metadata-store secrets: - name: metadata-store-ingress-tls excluded_packages: - grype.scanning.apps.tanzu.vmware.com - learningcenter.tanzu.vmware.com - workshops.learningcenter.tanzu.vmware.com EOF ``` > ℹ️ LoadBalacerに関する[annotations](https://docs.microsoft.com/en-us/azure/aks/load-balancer-standard#additional-customizations-via-kubernetes-annotations)は`contour.envoy.service.annotations`に指定可能です。 ContourのEnvoyに対するLoad BalancerのIPを固定するための次の定義をoverlayで作成します。以下のドキュメントを参考にしました。 * https://docs.microsoft.com/en-us/azure/aks/static-ip#create-a-service-using-the-static-ip-address ```yaml cat < contour-loadbalancer-ip.yml #@ load("@ytt:overlay", "overlay") #@overlay/match by=overlay.subset({"kind": "Service", "metadata": {"name": "envoy"}}) --- spec: #@overlay/match missing_ok=True loadBalancerIP: ${ENVOY_IP} EOF ``` Cloud Native Runtimesで使用するデフォルトのTLS証明書を用意するための次の定義をoverlayで作成します。以下のドキュメントを参考にしました。 * https://docs.vmware.com/en/Cloud-Native-Runtimes-for-VMware-Tanzu/1.3/tanzu-cloud-native-runtimes/GUID-knative-default-tls.html * https://knative.dev/docs/serving/using-a-tls-cert/#manually-adding-a-tls-certificate ```yaml cat < cnrs-default-tls.yml #@ load("@ytt:data", "data") #@ load("@ytt:overlay", "overlay") #@ namespace = data.values.ingress.external.namespace --- apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: cnrs-selfsigned-issuer namespace: #@ namespace spec: selfSigned: { } --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: cnrs-ca namespace: #@ namespace spec: commonName: cnrs-ca isCA: true issuerRef: kind: Issuer name: cnrs-selfsigned-issuer secretName: cnrs-ca --- apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: cnrs-ca-issuer namespace: #@ namespace spec: ca: secretName: cnrs-ca --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: cnrs-default-tls namespace: #@ namespace spec: dnsNames: - #@ "*.{}".format(data.values.domain_name) issuerRef: kind: Issuer name: cnrs-ca-issuer secretName: cnrs-default-tls --- apiVersion: projectcontour.io/v1 kind: TLSCertificateDelegation metadata: name: contour-delegation namespace: #@ namespace spec: delegations: - secretName: cnrs-default-tls targetNamespaces: - "*" #@overlay/match by=overlay.subset({"metadata":{"name":"config-network"}, "kind": "ConfigMap"}) --- data: #@overlay/match missing_ok=True default-external-scheme: https EOF ``` Cloud Native RuntimesからKnative Serving以外のリソースを削除するoverlayを作成します。 ```yaml cat < cnrs-slim.yml #@ load("@ytt:overlay", "overlay") #@overlay/match by=overlay.subset({"metadata":{"namespace":"knative-eventing"}}), expects="1+" #@overlay/remove --- #@overlay/match by=overlay.subset({"metadata":{"namespace":"knative-sources"}}), expects="1+" #@overlay/remove --- #@overlay/match by=overlay.subset({"metadata":{"namespace":"triggermesh"}}), expects="1+" #@overlay/remove --- #@overlay/match by=overlay.subset({"metadata":{"namespace":"vmware-sources"}}), expects="1+" #@overlay/remove --- EOF ``` Metadata StoreにCloud Native RuntimesのデフォルトのTLS証明書を使うoverlayを作成します。 ```yaml cat < metadata-store-ingress-tls.yml #@ load("@ytt:overlay", "overlay") #@overlay/match by=overlay.subset({"metadata":{"name":"metadata-store-ingress"}, "kind": "HTTPProxy"}) --- spec: virtualhost: tls: secretName: tanzu-system-ingress/cnrs-default-tls #@overlay/match by=overlay.subset({"metadata":{"name":"ingress-cert"}, "kind": "Certificate"}) #@overlay/remove --- EOF ``` overlayファイルをSecretとして作成します。 ``` kubectl -n tap-install create secret generic contour-loadbalancer-ip \ -o yaml \ --dry-run=client \ --from-file=contour-loadbalancer-ip.yml \ | kubectl apply -f- kubectl -n tap-install create secret generic cnrs-default-tls \ -o yaml \ --dry-run=client \ --from-file=cnrs-default-tls.yml \ | kubectl apply -f- kubectl -n tap-install create secret generic cnrs-slim \ -o yaml \ --dry-run=client \ --from-file=cnrs-slim.yml \ | kubectl apply -f- kubectl -n tap-install create secret generic metadata-store-ingress-tls \ -o yaml \ --dry-run=client \ --from-file=metadata-store-ingress-tls.yml \ | kubectl apply -f- ``` TAPをインストールします。 ``` tanzu package install tap -p tap.tanzu.vmware.com -v 1.2.1 --values-file tap-values.yml -n tap-install --wait=false ``` インストールの進捗は次のコマンドで確認します。 ``` watch kubectl get node,app,pod -A -owide ``` 途中で`Reconcile failed`と出力されても、再度Reconcileすることで`Reconcile failed`になることがあります。 全てのappが `Reconcile succeeded` になるまで待ちます。10分くらいかかります。次のコマンドでwaitできます。 ``` kubectl wait app -n tap-install tap --for=jsonpath='{.status.friendlyDescription}'="Reconcile succeeded" --timeout=30m ``` 完了すれば次のログが出力されます。 ``` app.kappctrl.k14s.io/tap condition met ``` インストール完了後のapp一覧は次のとおりです。 ``` $ kubectl get app -n tap-install NAME DESCRIPTION SINCE-DEPLOY AGE accelerator Reconcile succeeded 7m58s 8m5s api-portal Reconcile succeeded 99s 12m appliveview Reconcile succeeded 7m25s 8m4s appliveview-connector Reconcile succeeded 97s 12m appliveview-conventions Reconcile succeeded 8m25s 8m32s appsso Reconcile succeeded 9m37s 9m44s buildservice Reconcile succeeded 12m 12m cartographer Reconcile succeeded 8m58s 9m43s cert-manager Reconcile succeeded 12m 12m cnrs Reconcile succeeded 7m9s 8m4s contour Reconcile succeeded 9m37s 9m44s conventions-controller Reconcile succeeded 9m38s 9m45s developer-conventions Reconcile succeeded 8m26s 8m32s fluxcd-source-controller Reconcile succeeded 66s 12m image-policy-webhook Reconcile succeeded 9m38s 9m44s metadata-store Reconcile succeeded 6m56s 8m3s ootb-delivery-basic Reconcile succeeded 6m36s 6m43s ootb-supply-chain-basic Reconcile succeeded 6m36s 6m43s ootb-templates Reconcile succeeded 6m48s 8m2s policy-controller Reconcile succeeded 9m36s 9m44s scanning Reconcile succeeded 12m 12m service-bindings Reconcile succeeded 2m10s 12m services-toolkit Reconcile succeeded 12m 12m source-controller Reconcile succeeded 9m38s 9m45s spring-boot-conventions Reconcile succeeded 8m25s 8m32s tap Reconcile succeeded 8m6s 13m tap-auth Reconcile succeeded 2m44s 12m tap-gui Reconcile succeeded 6m54s 8m3s tap-telemetry Reconcile succeeded 2m30s 12m tekton-pipelines Reconcile succeeded 99s 12m ``` インストールされたパッケージは次の通りです。 ``` $ kubectl get packageinstall -n tap-install NAME PACKAGE NAME PACKAGE VERSION DESCRIPTION AGE accelerator accelerator.apps.tanzu.vmware.com 1.2.2 Reconcile succeeded 8m30s api-portal api-portal.tanzu.vmware.com 1.0.24 Reconcile succeeded 13m appliveview backend.appliveview.tanzu.vmware.com 1.2.1 Reconcile succeeded 8m30s appliveview-connector connector.appliveview.tanzu.vmware.com 1.2.1 Reconcile succeeded 13m appliveview-conventions conventions.appliveview.tanzu.vmware.com 1.2.1 Reconcile succeeded 8m57s appsso sso.apps.tanzu.vmware.com 1.0.0 Reconcile succeeded 10m buildservice buildservice.tanzu.vmware.com 1.6.1 Reconcile succeeded 13m cartographer cartographer.tanzu.vmware.com 0.4.3 Reconcile succeeded 10m cert-manager cert-manager.tanzu.vmware.com 1.5.3+tap.2 Reconcile succeeded 13m cnrs cnrs.tanzu.vmware.com 1.3.0 Reconcile succeeded 8m30s contour contour.tanzu.vmware.com 1.18.2+tap.2 Reconcile succeeded 10m conventions-controller controller.conventions.apps.tanzu.vmware.com 0.7.0 Reconcile succeeded 10m developer-conventions developer-conventions.tanzu.vmware.com 0.7.0 Reconcile succeeded 8m57s fluxcd-source-controller fluxcd.source.controller.tanzu.vmware.com 0.16.4 Reconcile succeeded 13m image-policy-webhook image-policy-webhook.signing.apps.tanzu.vmware.com 1.1.4 Reconcile succeeded 10m metadata-store metadata-store.apps.tanzu.vmware.com 1.2.2 Reconcile succeeded 8m30s ootb-delivery-basic ootb-delivery-basic.tanzu.vmware.com 0.8.1 Reconcile succeeded 7m9s ootb-supply-chain-basic ootb-supply-chain-basic.tanzu.vmware.com 0.8.1 Reconcile succeeded 7m9s ootb-templates ootb-templates.tanzu.vmware.com 0.8.1 Reconcile succeeded 8m30s policy-controller policy.apps.tanzu.vmware.com 1.0.1 Reconcile succeeded 10m scanning scanning.apps.tanzu.vmware.com 1.2.2 Reconcile succeeded 13m service-bindings service-bindings.labs.vmware.com 0.7.2 Reconcile succeeded 13m services-toolkit services-toolkit.tanzu.vmware.com 0.7.1 Reconcile succeeded 13m source-controller controller.source.apps.tanzu.vmware.com 0.4.1 Reconcile succeeded 10m spring-boot-conventions spring-boot-conventions.tanzu.vmware.com 0.4.1 Reconcile succeeded 8m57s tap tap.tanzu.vmware.com 1.2.1 Reconcile succeeded 13m tap-auth tap-auth.tanzu.vmware.com 1.0.1 Reconcile succeeded 13m tap-gui tap-gui.tanzu.vmware.com 1.2.4 Reconcile succeeded 8m30s tap-telemetry tap-telemetry.tanzu.vmware.com 0.2.1 Reconcile succeeded 13m tekton-pipelines tekton.tanzu.vmware.com 0.33.5 Reconcile succeeded 13m ``` デプロイされたPodは次の通りです。 ``` $ kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE accelerator-system acc-engine-7b96d498f6-b87l9 1/1 Running 0 8m43s accelerator-system acc-server-7c758b6cb9-mflbr 1/1 Running 0 8m43s accelerator-system accelerator-controller-manager-79484f6977-mw2pw 1/1 Running 0 8m44s api-portal api-portal-server-586f76979-6l2s8 1/1 Running 0 13m app-live-view-connector application-live-view-connector-l86xt 1/1 Running 0 13m app-live-view-connector application-live-view-connector-t8vll 1/1 Running 0 6m13s app-live-view-conventions appliveview-webhook-856c959857-lrzft 1/1 Running 0 9m13s app-live-view application-live-view-server-5f6f764699-bjh4t 1/1 Running 0 8m13s appsso operator-db468688d-fv9v8 1/1 Running 0 10m build-service build-pod-image-fetcher-7dftf 5/5 Running 0 13m build-service build-pod-image-fetcher-rpdhw 5/5 Running 0 6m13s build-service dependency-updater-controller-7d7c9677b-rs2s6 1/1 Running 0 13m build-service secret-syncer-controller-bbc6ffd5f-frfhb 1/1 Running 0 13m build-service smart-warmer-image-fetcher-4cxxc 2/2 Running 0 6m13s build-service smart-warmer-image-fetcher-dgk6j 0/2 Pending 0 6m55s build-service warmer-controller-74dd99c57b-gqxl8 1/1 Running 0 13m cartographer-system cartographer-controller-7666cc78d5-rzwvm 1/1 Running 0 9m40s cartographer-system cartographer-conventions-controller-manager-d4c7979b4-msv6q 1/1 Running 0 9m40s cert-injection-webhook cert-injection-webhook-bd7bbb8cb-6p7wt 1/1 Running 0 13m cert-manager cert-manager-cainjector-969787b54-gcchx 1/1 Running 0 13m cert-manager cert-manager-fcd5cb59d-z77pw 1/1 Running 0 13m cert-manager cert-manager-webhook-7574849877-h58dg 1/1 Running 0 13m conventions-system conventions-controller-manager-76d746d877-gcznt 1/1 Running 0 10m cosign-system policy-webhook-fcc48cbbb-9kn8s 1/1 Running 0 10m cosign-system webhook-59b45c5b79-pdm7k 1/1 Running 0 10m developer-conventions webhook-cbd9cf9c4-tb92z 1/1 Running 0 9m15s flux-system source-controller-cbdcf5f6f-77db9 1/1 Running 0 13m image-policy-system image-policy-controller-manager-689f59cbdf-ksnvn 2/2 Running 0 10m kapp-controller kapp-controller-64668dd9c7-t5vh9 2/2 Running 0 17m knative-serving activator-66b9b5454f-64469 1/1 Running 0 7m31s knative-serving activator-66b9b5454f-9phh6 1/1 Running 0 7m31s knative-serving activator-66b9b5454f-gltwj 1/1 Running 0 7m45s knative-serving autoscaler-5bdf74df9b-n29jp 1/1 Running 0 7m44s knative-serving autoscaler-hpa-549ccbcddd-br9bh 1/1 Running 0 7m45s knative-serving controller-6f8888dc9f-vfvv8 1/1 Running 0 7m44s knative-serving domain-mapping-687fd6c4c4-dcc65 1/1 Running 0 7m44s knative-serving domainmapping-webhook-b797d6986-6r9x4 1/1 Running 0 7m44s knative-serving net-certmanager-controller-84c78bd9d6-jvjxn 1/1 Running 0 7m45s knative-serving net-certmanager-webhook-68955f5454-9pvwd 1/1 Running 0 7m44s knative-serving net-contour-controller-c77b5894d-kvs5k 1/1 Running 0 7m45s knative-serving webhook-97cd4c9c6-p79gn 1/1 Running 0 7m45s knative-serving webhook-97cd4c9c6-wn68h 1/1 Running 0 7m28s kpack kpack-controller-7f64d78f8b-4jp8k 1/1 Running 0 13m kpack kpack-webhook-5fcb786696-p29ql 1/1 Running 0 13m kube-system azure-ip-masq-agent-7kt6c 1/1 Running 0 19m kube-system azure-ip-masq-agent-kvdl9 1/1 Running 0 7m7s kube-system cloud-node-manager-l7lpv 1/1 Running 0 19m kube-system cloud-node-manager-mrdcb 1/1 Running 0 7m7s kube-system coredns-autoscaler-7d56cd888-4ggnc 1/1 Running 0 20m kube-system coredns-dc97c5f55-t4h44 1/1 Running 0 18m kube-system coredns-dc97c5f55-w8n8w 1/1 Running 0 20m kube-system csi-azuredisk-node-45lzs 3/3 Running 0 7m7s kube-system csi-azuredisk-node-7dqhz 3/3 Running 0 19m kube-system csi-azurefile-node-78pxj 3/3 Running 0 19m kube-system csi-azurefile-node-p4lvw 3/3 Running 0 7m7s kube-system konnectivity-agent-6b6985fc46-4vk66 1/1 Running 0 9m7s kube-system konnectivity-agent-6b6985fc46-tq8gn 1/1 Running 0 14m kube-system kube-proxy-h95xs 1/1 Running 0 19m kube-system kube-proxy-z5dtj 1/1 Running 0 7m7s kube-system metrics-server-64b66fbbc8-qkcgc 1/1 Running 0 20m metadata-store metadata-store-app-7c6fffd957-cbsc5 2/2 Running 1 (2m42s ago) 7m42s metadata-store metadata-store-db-0 1/1 Running 0 7m42s scan-link-system scan-link-controller-manager-77458f487f-6xxxw 2/2 Running 0 13m secretgen-controller secretgen-controller-6b9f68cf88-rt7gv 1/1 Running 0 16m service-bindings manager-5ddb7fccf9-27wzc 1/1 Running 0 13m services-toolkit resource-claims-apiserver-79bb6955b7-7nb8m 1/1 Running 0 13m services-toolkit services-toolkit-controller-manager-66d8568756-7lp77 1/1 Running 0 13m source-system source-controller-manager-7cdb8d487-bpx6g 1/1 Running 0 10m spring-boot-convention spring-boot-webhook-7b6856848f-qk677 1/1 Running 0 9m14s stacks-operator-system controller-manager-7c7d6b956f-2fcd8 1/1 Running 0 13m tanzu-system-ingress contour-6c9c987f9f-5jjt5 1/1 Running 0 9m8s tanzu-system-ingress contour-6c9c987f9f-h2sf4 1/1 Running 0 10m tanzu-system-ingress envoy-bkh2j 2/2 Running 0 10m tanzu-system-ingress envoy-x85m9 2/2 Running 0 6m13s tap-gui server-f557887d9-mwstv 1/1 Running 0 7m40s tap-telemetry tap-telemetry-informer-679589c4b5-5kqz4 1/1 Running 4 (7m34s ago) 13m tekton-pipelines tekton-pipelines-controller-6c4f7cffdb-zv2b9 1/1 Running 0 13m tekton-pipelines tekton-pipelines-webhook-596d648db5-mrtks 1/1 Running 0 13m ``` Build Serviceで使用されるClusterBuilderがACRに作成されていることを確認します。 ``` $ kubectl get clusterbuilder NAME LATESTIMAGE READY base tap28868.azurecr.io/build-service:clusterbuilder-base@sha256:5c4c3eef1a24a456264873b9bd4e85d8f4b7faf4fec114f0d3de4b686d6a4fa6 True default tap28868.azurecr.io/build-service:clusterbuilder-default@sha256:5c4c3eef1a24a456264873b9bd4e85d8f4b7faf4fec114f0d3de4b686d6a4fa6 True ``` 次のコマンドを実行し、EnvoyのIPを取得して、`${ENVOY_IP}`と同じ値になっていることを確認してください。 ``` kubectl get -n tanzu-system-ingress svc envoy -ojsonpath='{.status.loadBalancer.ingress[0].ip}' ``` Ingress (Contour)経由でアクセスできるコンポーネントは次の通りです。 ``` $ kubectl get httpproxy -A NAMESPACE NAME FQDN TLS SECRET STATUS STATUS DESCRIPTION accelerator-system accelerator accelerator.20-89-141-216.sslip.io tanzu-system-ingress/cnrs-default-tls valid Valid HTTPProxy metadata-store metadata-store-ingress metadata-store.20-89-141-216.sslip.io tanzu-system-ingress/cnrs-default-tls valid Valid HTTPProxy tap-gui tap-gui tap-gui.20-89-141-216.sslip.io tanzu-system-ingress/cnrs-default-tls valid Valid HTTPProxy ``` ### TAP GUIへのアクセス TAP GUIへのホスト名は次のコマンドで確認できます。 ``` $ kubectl get httpproxy -n tap-gui tap-gui -ojsonpath='{.spec.virtualhost.fqdn}' tap-gui.20-89-141-216.sslip.io ``` このホスト名へHTTPSでアクセスします。 > ⚠️ `cnrs.domain_name`の設定変更後TAP-GUIのPodが再作成されるので、再作成後にアクセスしてください。 image 自己署名証明書を使用しているので"THIS IS UNSAFE"を入力してください。 image TAP GUIの認証設定を行っていないので、Guest Userでログインします。後ほどAzure ADでログインできるようにします。 image "YOUR ORGANIZATION"の"All"をクリックします。 インストール時に設定したCatalogが登録されています。 image サイドバーの➕アイコンをクリックすると"Accelerators"一覧が表示されます。 image ### ADグループの作成とメンバー追加 TAP Developer用のADグループを作成します。 ``` GROUP_ID=$(az ad group create --display-name tap-demo-developer --mail-nickname tap-demo-developer --query id -o tsv) ``` 自分のアカウント(ここでは`tmaki@pivotalazure.vmware.com`)をこのグループに追加します。 ``` az ad group member add --group tap-demo-developer --member-id $(az ad user show --id tmaki@pivotalazure.vmware.com --query id -o tsv) ``` groupに追加されていることを確認します。 ``` $ az ad group member list --group tap-demo-developer [ { "@odata.type": "#microsoft.graph.user", "businessPhones": [], "displayName": "Toshiaki Maki", "givenName": "Toshiaki", "id": "********", "jobTitle": null, "mail": null, "mobilePhone": null, "officeLocation": null, "preferredLanguage": null, "surname": "Maki", "userPrincipalName": "tmaki@pivotalazure.vmware.com" } ] ``` `GROUP_ID`は次のコマンドでも取得できます。 ``` GROUP_ID=$(az ad group list --filter "displayname eq 'tap-demo-developer'" --query '[0].id' -o tsv ) ``` ### Workloadのデプロイ #### Workloadを作成するための事前準備 ここは引き続き、adminとして作業します。 ``` az aks get-credentials --resource-group tap-rg --name tap-sandbox --admin --overwrite-existing ``` https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.2/tap/GUID-set-up-namespaces.html (一部変更しています) `demo` namespaceを作成します。 ``` kubectl create ns demo ``` `demo` namespaceにおいた、先に作成したADグループに対して、[`app-editor`](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.1/tap/GUID-authn-authz-role-descriptions.html#appeditor-0) ClusterRoleをバインドします。 ``` kubectl create rolebinding app-editor -n demo --clusterrole app-editor --group ${GROUP_ID} kubectl create clusterrolebinding app-editor-${GROUP_ID} -n demo --clusterrole app-editor-cluster-access --group ${GROUP_ID} ``` ACRにアクセスするSecretを作成します。ここではadminアカウント使用しますが、[Service Principal](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli#service-principal)の方がいいかもしれません。 ``` tanzu secret registry add registry-credentials --server ${ACR_SERVER} --username ${ACR_USERNAME} --password ${ACR_PASSWORD} --namespace demo ``` Service Accountの設定を行います。 ```yaml cat < `default` namespaceに対するPodのRead権限はないので、`kubectl get pod`はForbiddenになります。 ``` $ kubectl get pod To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AJ9MVQ438 to authenticate. Error from server (Forbidden): pods is forbidden: User "tmaki@pivotalazure.vmware.com" cannot list resource "pods" in API group "" in the namespace "default" ``` `demo` namespaceはPod一覧を取得できます。 ``` $ kubectl get pod -n demo No resources found in demo namespace. ``` #### Javaアプリのデプロイ ``` tanzu apps workload apply spring-music \ --app spring-music \ --git-repo https://github.com/tanzu-japan/spring-music \ --git-branch tanzu \ --type web \ --annotation autoscaling.knative.dev/minScale=1 \ -n demo \ -y tanzu apps workload tail spring-music -n demo ``` 作成されるリソースを確認したければ次のコマンドをwatchしてください。 ``` watch kubectl get workload,pod,gitrepo,imgs,build,podintent,taskrun,imagerepository,deliverable,app,ksvc -n demo -owide ``` ``` $ kubectl get workload,pod,gitrepo,imgs,build,podintent,taskrun,imagerepository,deliverable,app,ksvc -n demo -owide NAME SOURCE SUPPLYCHAIN READY REASON AGE workload.carto.run/spring-music https://github.com/tanzu-japan/spring-music source-to-url True Ready 7m20s NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/spring-music-00001-deployment-6c5775689-hf752 2/2 Running 0 2m8s 10.244.2.22 aks-nodepool1-87250474-vmss000002 pod/spring-music-build-1-build-pod 0/1 Completed 0 7m12s 10.244.2.20 aks-nodepool1-87250474-vmss000002 pod/spring-music-config-writer-wfqf2-pod 0/1 Completed 0 3m45s 10.244.2.21 aks-nodepool1-87250474-vmss000002 NAME URL READY STATUS AGE gitrepository.source.toolkit.fluxcd.io/spring-music https://github.com/tanzu-japan/spring-music True Fetched revision: tanzu/297dad0750cbbb963819ba9bfaafeaf58402b06f 7m17s NAME LATESTIMAGE READY image.kpack.io/spring-music tap28868.azurecr.io/supply-chain/spring-music-demo@sha256:9e39def446c09e1852842b8ec861c11ae8fa8c71ecb5406e8b9ed32158df6163 True NAME IMAGE SUCCEEDED build.kpack.io/spring-music-build-1 tap28868.azurecr.io/supply-chain/spring-music-demo@sha256:9e39def446c09e1852842b8ec861c11ae8fa8c71ecb5406e8b9ed32158df6163 True NAME READY REASON AGE podintent.conventions.apps.tanzu.vmware.com/spring-music True ConventionsApplied 3m51s NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME taskrun.tekton.dev/spring-music-config-writer-wfqf2 True Succeeded 3m45s 3m5s NAME IMAGE URL READY REASON AGE imagerepository.source.apps.tanzu.vmware.com/spring-music-delivery tap28868.azurecr.io/supply-chain/spring-music-demo-bundle:f5a83ac0-a9b0-411f-85f9-e8ba622789f1 http://source-controller-manager-artifact-service.source-system.svc.cluster.local./imagerepository/demo/spring-music-delivery/28aee887f8b0e8d7d09c5f5559aeb155c8eb094db08da9c94844de43576b456d.tar.gz True Ready 7m14s NAME SOURCE DELIVERY READY REASON AGE deliverable.carto.run/spring-music tap28868.azurecr.io/supply-chain/spring-music-demo-bundle:f5a83ac0-a9b0-411f-85f9-e8ba622789f1 delivery-basic True Ready 7m17s NAME DESCRIPTION SINCE-DEPLOY AGE app.kappctrl.k14s.io/spring-music Reconcile succeeded 2m9s 2m9s NAME URL LATESTCREATED LATESTREADY READY REASON service.serving.knative.dev/spring-music https://spring-music-demo.20-89-141-216.sslip.io spring-music-00001 spring-music-00001 True ``` ``` $ tanzu apps workload get -n demo spring-music --- # spring-music: Ready --- Source type: git url: https://github.com/scottfrederick/spring-music branch: tanzu Supply Chain name: source-to-url last update: 95s ready: True RESOURCE READY TIME source-provider True 5m7s deliverable True 5m10s image-builder True 113s config-provider True 110s app-config True 110s config-writer True 95s Issues No issues reported. Pods NAME STATUS RESTARTS AGE spring-music-00001-deployment-6fd554c768-vwlnm Running 0 62s spring-music-build-1-build-pod Succeeded 0 5m6s spring-music-config-writer-4g7cs-pod Succeeded 0 107s Knative Services NAME READY URL spring-music Ready https://spring-music-demo.20-194-146-185.sslip.io To see logs: "tanzu apps workload tail spring-music --namespace demo" ``` [kubectl treeプラグイン](https://github.com/ahmetb/kubectl-tree)を使用すると次のようにリソースを階層的に見れてわかりやすいです。 ``` $ kubectl tree workload -n demo spring-music NAMESPACE NAME READY REASON AGE demo Workload/spring-music True Ready 8m9s demo ├─ConfigMap/spring-music - 4m37s demo ├─Deliverable/spring-music True Ready 8m6s demo │ ├─App/spring-music - 2m58s demo │ └─ImageRepository/spring-music-delivery True Ready 8m3s demo ├─GitRepository/spring-music True GitOperationSucceed 8m6s demo ├─Image/spring-music True 8m2s demo │ ├─Build/spring-music-build-1 - 8m2s demo │ │ └─Pod/spring-music-build-1-build-pod False PodCompleted 8m1s demo │ ├─PersistentVolumeClaim/spring-music-cache - 8m2s demo │ └─SourceResolver/spring-music-source True 8m2s demo ├─PodIntent/spring-music True ConventionsApplied 4m40s demo │ └─PodIntent/spring-music True ConventionsApplied 4m40s demo └─Runnable/spring-music-config-writer True Ready 4m37s demo └─TaskRun/spring-music-config-writer-wfqf2 - 4m34s demo └─Pod/spring-music-config-writer-wfqf2-pod False PodCompleted 4m34s ``` image "THIS IS UNSAFE"を入力 image TAP GUIでSpring Musicの情報を見ることができます。 TAP GUIのCatalogからSpring Musicを選択。 image Podを選択。Live Viewが見られます。 image Spring Boot Actuatorのエンドポイントを選択できます。 image Memoryを選んだ場合、 image > ⚠️ AdBlockをインストールしている場合は、TAP GUIでは無効化してください。 TAP 1.2からはPod Logsも見れるようになりました。 image image ActuatorによるLog Levelの変更もここから行えます。 image 次に、サイドバーから"Workloads"を選択します。 image Spring Musicを選択すると、Supply Chainの状態を確認することができます。 image Image Buildのログが見れるようになる等、TAP 1.2で様々な改善が行われています。詳細は[リリースノート](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.2/tap/GUID-release-notes.html#new-features-1)を確認してください。 image 確認が終わればWorkloadを削除します。 ``` tanzu apps workload delete -n demo spring-music -y ``` ### Azure ADでTAP GUIにログインする TAP GUIの認証にAzure ADを使用するには、[Backstageのドキュメント](https://backstage.io/docs/auth/microsoft/provider)の手順通り、 App Registrationを作成します。次の通りです。 > 1. Log in to the [Azure Portal](https://portal.azure.com/) > 2. Create an [Active Directory Tenant](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview), if one does not yet exist > 3. Navigate to [Azure Active Directory > App Registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) > 4. Register an application > * Name: TAP GUI > * Redirect URI: Web > https://tap-gui.20-194-146-185.sslip.io/api/auth/microsoft/handler/frame > 5. Navigate to Certificates & secrets > New client secret to create a secret clientSecretはSecret生成直後にコピーできます。 image clientId、tenantIdはOverviewから確認できます。 image `tap-values.yml`にclientId、clientSecret、tenantIdを設定します。 ```yaml tap_gui: # ... app_config: # ... auth: environment: development providers: microsoft: development: clientId: ${AUTH_MICROSOFT_CLIENT_ID} clientSecret: ${AUTH_MICROSOFT_CLIENT_SECRET} tenantId: ${AUTH_MICROSOFT_TENANT_ID} ``` adminとして作業します。 ``` az aks get-credentials --resource-group tap-rg --name tap-sandbox --admin --overwrite-existing ``` TAPを更新します。 ``` tanzu package installed update tap -n tap-install -v 1.1.2 -f tap-values.yml ``` TAP GUIが再作成されるまで次のコマンドで確認して待ってください。 ``` watch kubectl get pod -n tap-gui ``` 再起動後、TAP GUIにアクセスすれば、"Sign in with Azure OAuth"と表示されます。 image DeveloperのアカウントでAzureにログインします。 image 承諾します。 image ログインに成功し、サイドバーから"Settings"を確認すると、ログインユーザー名とメールアドレスが表示されることを確認できます。 image ### [Optional] Source Test Scan to URLを試す [次の記事](/entries/709)に書きました。 ### [Optional] ADユーザーの追加 [TAP 1.1版](/entries/704#%5BOptional%5D%20ADユーザーの追加)と同じです。 ### TAPのアンインストール ``` kubectl delete workload -A --all ``` ``` tanzu package installed delete tap -n tap-install -y ``` ### AKSクラスタの削除 ``` az aks delete \ --resource-group tap-rg \ --name tap-sandbox ``` ### ACRインスタンスの削除 ``` az acr delete --resource-group tap-rg --name ${ACR_NAME} ``` ### リソースグループ削除 ``` az group delete --name tap-rg ```