IK.AM

@making's tech note


Tanzu Application Platform 1.2 (Full Profile) をAKSにインストールしAzure ADと連携するメモ - Self Signed編

🗃 {Dev/CaaS/Kubernetes/TAP}
🏷 Kubernetes 🏷 Cartographer 🏷 AKS 🏷 Tanzu 🏷 TAP 🏷 Knative 🏷 Azure 🏷 Backstage 
🗓 Updated at 2022-08-15T01:59:53+09:00  🗓 Created at 2022-07-20T03:04:53+09:00 {✒️️ Edit  ⏰ History  🗑 Delete}

ℹ️ 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

以下の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に関するannotationscontour.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で作成します。以下のドキュメントを参考にしました。

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が再作成されるので、再作成後にアクセスしてください。

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 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
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で様々な改善が行われています。詳細はリリースノートを確認してください。

image

確認が終わればWorkloadを削除します。

tanzu apps workload delete -n demo spring-music -y

Azure ADでTAP GUIにログインする

TAP GUIの認証にAzure ADを使用するには、Backstageのドキュメントの手順通り、 App Registrationを作成します。次の通りです。

  1. Log in to the Azure Portal
  2. Create an Active Directory Tenant, if one does not yet exist
  3. Navigate to Azure Active Directory > App Registrations
  4. Register an application
  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を設定します。

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を試す

次の記事に書きました。

[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