ℹ️ 2022-08-14 1.2.1版にアップデートしました。
Tanzu Application Platform 1.2 をAKSにインストールします。
本記事ではTAPをInstallし、"Hello World"なアプリケーションをソースコードからデプロイする機能("Source to URL")を試します。
コンテナレジストリにはACRを使用し、RBACをAzure ADと連携します。
また、Self Signedな証明書でHTTPSを有効にします。
目次
- 必要なCLI
- リソースグループ作成
- ACRインスタンスの作成
- AKSクラスタの作成
- Pivnet CLIのインストール
- EULAの承諾
- Tanzu CLIのインストール
- Cluster Essentials for VMware Tanzuのインストール
- Tanzu Application Platformのインストール
- TAP GUIへのアクセス
- ADグループの作成とメンバー追加
- Workloadのデプロイ
- Azure ADでTAP GUIにログインする
- [Optional] Source Test Scan to URLを試す
- [Optional] ADユーザーの追加
- TAPのアンインストール
- AKSクラスタの削除
- ACRインスタンスの削除
- リソースグループ削除
必要なCLI
以下の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
CLIを使用して必要なソフトウェアをダウンロードします。
pivnet
CLIはbrewでインストールできます。
brew install pivotal/tap/pivnet-cli
VMware Tanzu Network のAPI Tokenを取得して、pivnet
CLIでログインします。
pivnet login --api-token=<API Token>
EULAの承諾
初めてインストールする場合は、以下のコンポーネントのEULAをAcceptしてください。
⚠️ 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 をインストールします。
# 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-*'
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は個別にインストールした方良いため(こちらの記事参照)、 これらのパッケージはexcluded_packages
除外します。
また、Cloud Native RuntimesはKnative Servingしか使わないので、それ以外のリソースを削除するoverlayを設定します。
DOMAIN_NAME=$(echo ${ENVOY_IP} | sed 's/\./-/g').sslip.io
cat <<EOF > 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は
contour.envoy.service.annotations
に指定可能です。
ContourのEnvoyに対するLoad BalancerのIPを固定するための次の定義をoverlayで作成します。以下のドキュメントを参考にしました。
cat <<EOF > 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
cat <<EOF > 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を作成します。
cat <<EOF > 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を作成します。
cat <<EOF > 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が再作成されるので、再作成後にアクセスしてください。

自己署名証明書を使用しているので"THIS IS UNSAFE"を入力してください。

TAP GUIの認証設定を行っていないので、Guest Userでログインします。後ほどAzure ADでログインできるようにします。

"YOUR ORGANIZATION"の"All"をクリックします。
インストール時に設定したCatalogが登録されています。

サイドバーの➕アイコンをクリックすると"Accelerators"一覧が表示されます。

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
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の方がいいかもしれません。
tanzu secret registry add registry-credentials --server ${ACR_SERVER} --username ${ACR_USERNAME} --password ${ACR_PASSWORD} --namespace demo
Service Accountの設定を行います。
cat <<EOF | kubectl -n demo apply -f -
apiVersion: v1
kind: Secret
metadata:
name: tap-registry
annotations:
secretgen.carvel.dev/image-pull-secret: ""
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: e30K
---
apiVersion: v1
kind: Secret
metadata:
name: git-ssh
annotations:
tekton.dev/git-0: github.com
type: kubernetes.io/ssh-auth
data:
ssh-privatekey: 8J+UkQ==
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
secrets:
- name: registry-credentials
- name: git-ssh
imagePullSecrets:
- name: registry-credentials
- name: tap-registry
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: default-permit-deliverable
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: deliverable
subjects:
- kind: ServiceAccount
name: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: default-permit-workload
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: workload
subjects:
- kind: ServiceAccount
name: default
EOF
Developerとしてログイン
ここでDeveloperとしてk8sにログインします。
az aks get-credentials --resource-group tap-rg --name tap-sandbox --overwrite-existing
K8sクラスタへ初回アクセスのタイミングでAzureへのログインを求められます。
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 <none> <none>
pod/spring-music-build-1-build-pod 0/1 Completed 0 7m12s 10.244.2.20 aks-nodepool1-87250474-vmss000002 <none> <none>
pod/spring-music-config-writer-wfqf2-pod 0/1 Completed 0 3m45s 10.244.2.21 aks-nodepool1-87250474-vmss000002 <none> <none>
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プラグインを使用すると次のようにリソースを階層的に見れてわかりやすいです。
$ 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

"THIS IS UNSAFE"を入力

TAP GUIでSpring Musicの情報を見ることができます。
TAP GUIのCatalogからSpring Musicを選択。

Podを選択。Live Viewが見られます。

Spring Boot Actuatorのエンドポイントを選択できます。

Memoryを選んだ場合、

⚠️ AdBlockをインストールしている場合は、TAP GUIでは無効化してください。
TAP 1.2からはPod Logsも見れるようになりました。


ActuatorによるLog Levelの変更もここから行えます。

次に、サイドバーから"Workloads"を選択します。

Spring Musicを選択すると、Supply Chainの状態を確認することができます。

Image Buildのログが見れるようになる等、TAP 1.2で様々な改善が行われています。詳細はリリースノートを確認してください。

確認が終わればWorkloadを削除します。
tanzu apps workload delete -n demo spring-music -y
Azure ADでTAP GUIにログインする
TAP GUIの認証にAzure ADを使用するには、Backstageのドキュメントの手順通り、 App Registrationを作成します。次の通りです。
- Log in to the Azure Portal
- Create an Active Directory Tenant, if one does not yet exist
- Navigate to Azure Active Directory > App Registrations
- Register an application
- Name: TAP GUI
- Redirect URI: Web > https://tap-gui.20-194-146-185.sslip.io/api/auth/microsoft/handler/frame
- Navigate to Certificates & secrets > New client secret to create a secret
clientSecretはSecret生成直後にコピーできます。

clientId、tenantIdはOverviewから確認できます。

tap-values.yml
にclientId、clientSecret、tenantIdを設定します。
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"と表示されます。

DeveloperのアカウントでAzureにログインします。

承諾します。

ログインに成功し、サイドバーから"Settings"を確認すると、ログインユーザー名とメールアドレスが表示されることを確認できます。

[Optional] Source Test Scan to URLを試す
次の記事に書きました。
[Optional] ADユーザーの追加
TAP 1.1版と同じです。
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