--- title: Tanzu Kubernetes Grid Integration Edition (TKGI, 旧Enterprise PKS) 1.8をAWSにインストールするメモ tags: ["Kubernetes", "PKS", "AWS", "BOSH", "TGKI", "Tanzu"] categories: ["Dev", "CaaS", "Kubernetes", "PKS", "AWS"] date: 2020-07-07T10:14:48Z updated: 2020-07-07T10:27:08Z --- Pivotal Container Service (PKS)はTanzu Kubernetes Grid Integration Edition (TKGI)にリブランドされました。 https://docs.pivotal.io/tkgi/1-8/index.html TKGIの中身はPKSそのままですが、CLI名が`pks`から`tkgi`に変更されています。 本記事は、名前変更後初のリリースであるTKGI 1.8をAWSにインストールするメモです。 **Table of contents** ## Provision a jumpbox VM まずは作業場として、Jumpbox VMを用意します。 以下ではTerrformでEC2上にJumpbox VMを作成しますが、任意のUbuntuサーバー上でも作業できます。Ubuntu Bionicで動作確認しています。 Terraformは次のバージョンで確認しています。 ``` $ terraform -v Terraform v0.12.26 ``` Jumpbox用のTerraformのテンプレートを取得して、`terraform.tfvars.sample`を参考に`terraform.tfvars`して、`terraform apply`まで実行してください。 ``` git clone https://github.com/making/terraforming-jumpbox cd terraforming-jumpbox cp terraform.tfvars.sample terraform.tfvars terraform plan -out plan terraform apply plan ``` 次のスクリプトでJumpboxにログインできます。 ``` ./ssh-jumpbox.sh ``` ## Install CLIs on the Jumpbox Jumpbox VM上に色々なCLIをインストールします。 ``` chmod +x ./provision.sh ./provision.sh ``` TerraformでJumpboxを作っていない場合は、`provision.sh`を https://raw.githubusercontent.com/making/terraforming-jumpbox/master/provision.sh からダウンロードし、実行してください。 ## Pave AWS environment for TKGI 次にTKGIをインストールするためのAWS環境をTerraformで作成します。 Terraformテンプレートは次の2種類がありますが、ここではTerraform 0.12に対応している後者を使用します。 * https://github.com/pivotal-cf/terraforming-aws * https://github.com/pivotal/paving.git ``` mkdir ~/workspace cd ~/workspace git clone https://github.com/pivotal/paving.git cd paving ``` いくつかパッチを当てるので、`custom`ブランチを作成します。 ``` git checkout -b custom ``` ### Apply patches https://github.com/pivotal/paving.git に次のパッチをあてます。 * K8sクラスタに必要な、SubnetのTagをつける https://github.com/voor/paving/commit/ef6d4965a19c489bfe3dbbb0a9c5faa167f70475 * TASにのみ必要でTKGIには不要なLBを削除する https://github.com/making/paving/commit/472df716651ad3b89ccdc32f3284957bf8e8496e * terraform destoryでS3バケットを強制削除する https://github.com/making/paving/commit/85a8832a797ac2e15fb607d59733c6ed56188887 ``` git remote add voor https://github.com/voor/paving.git git remote add making https://github.com/making/paving.git git fetch voor add-kubernetes-tags git fetch making remove-tas-lbs git fetch making force-destroy-buckets git cherry-pick -x ef6d4965a19c489bfe3dbbb0a9c5faa167f70475 git cherry-pick -x 472df716651ad3b89ccdc32f3284957bf8e8496e git cherry-pick -x 85a8832a797ac2e15fb607d59733c6ed56188887 ``` ### Run terraform Terraformを実行します。 ``` export TF_VAR_region=ap-northeast-1 export TF_VAR_access_key=AKIA********** export TF_VAR_secret_key=****** export TF_VAR_availability_zones='["ap-northeast-1a","ap-northeast-1c","ap-northeast-1d"]' export TF_VAR_environment_name=sandbox export TF_VAR_hosted_zone=tanzu.ik.am cd aws terraform init terraform plan -out plan terraform apply plan ``` ## Download files [VMware Tanzu Network](https://network.pivotal.io/) (旧Pivotal Network)から必要なファイルをダウンロードします。 VMware Tanzu Networkにログインして、[Profileページ](https://network.pivotal.io/users/dashboard/edit-profile) から`UAA API TOKEN`を取得してください。 `pivnet` CLIを使用して、次のプロダクトをダウンロードします。 * OpsManager (2.9.6) https://network.pivotal.io/products/ops-manager * TKGI (1.8.0) https://network.pivotal.io/products/pivotal-container-service * Platform Automation (4.4.3) https://network.pivotal.io/products/platform-automation ``` pivnet login --api-token=**** mkdir ~/workspace/pivnet cd ~/workspace/pivnet pivnet download-product-files --product-slug='ops-manager' --release-version='2.9.6' --product-file-id=726928 pivnet download-product-files --product-slug='pivotal-container-service' --release-version='1.8.0' --product-file-id=720838 pivnet download-product-files --product-slug='pivotal-container-service' --release-version='1.8.0' --product-file-id=696191 sudo install tkgi-linux-amd64-1.8.0-build.72 /usr/local/bin/tkgi pivnet download-product-files --product-slug='platform-automation' --release-version='4.4.3' --product-file-id=709887 tar xvf platform-automation-image-4.4.3.tgz ./rootfs/usr/bin/p-automator sudo install rootfs/usr/bin/p-automator /usr/local/bin/ ``` ## Create ops manager vm 前述のTerraformテンプレートではOpsManager VMは作成されません。 ここではPlatform Automationに含まれる`p-automator` CLIでOpsManager VMを作成します。 必要な設定ファイルテンプレートは https://raw.githubusercontent.com/making/platform-automation/master/config/aws/sandbox/ops-manager/config.yml です。プレースホルダーを`terraform output`の値で埋めます。 ``` mkdir -p ~/workspace/config/${TF_VAR_environment_name}/ops-manager cd ~/workspace/config/${TF_VAR_environment_name}/ops-manager terraform output -state=${HOME}/workspace/paving/aws/terraform.tfstate -json \ | bosh int - --path /stable_config/value \ | bosh int - > ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml cat <> ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml web_lb_security_group_id: dummy ssh_lb_security_group_id: dummy tcp_lb_security_group_id: dummy tas_blobstore_iam_instance_profile_name: dummy EOF wget https://raw.githubusercontent.com/making/platform-automation/master/config/aws/sandbox/ops-manager/config.yml p-automator create-vm \ --config ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/config.yml \ --image-file ${HOME}/workspace/pivnet/ops-manager-aws-2.9.6-build.148.yml \ --state-file ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/state.yml \ --vars-file ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml ``` ## Configure authentication Ops Managerのユーザーを設定します。Ops Managerへの操作には`om` CLIを使用します。 ``` cd ~/workspace/config/${TF_VAR_environment_name}/ops-manager export OM_USERNAME=admin export OM_PASSWORD=$(uuidgen) export OM_DECRYPTION_PASSPHRASE=$(uuidgen) cat < auth.yml username: ${OM_USERNAME} password: ${OM_PASSWORD} decryption-passphrase: ${OM_DECRYPTION_PASSPHRASE} EOF cat < env.yml target: https://opsmanager.${TF_VAR_environment_name}.${TF_VAR_hosted_zone} connect-timeout: 30 request-timeout: 1800 skip-ssl-validation: true username: ${OM_USERNAME} password: ${OM_PASSWORD} decryption-passphrase: ${OM_DECRYPTION_PASSPHRASE} EOF om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ --skip-ssl-validation \ configure-authentication \ --config ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/auth.yml ``` ## Generate and configure let's encrypt Ops Manager及びTKGIのAPIサーバーに設定するためのTLS証明書をLet's Encryptで発行します。 ``` mkdir -p ~/workspace/letsencrypt cd ~/workspace/letsencrypt export AWS_REGION=${TF_VAR_region} export AWS_ACCESS_KEY_ID=${TF_VAR_access_key} export AWS_SECRET_ACCESS_KEY=${TF_VAR_secret_key} export AWS_HOSTED_ZONE_ID=....... (not hosted zone name but ID) export SUBDOMAIN=${TF_VAR_environment_name}.${TF_VAR_hosted_zone} export EMAIL=....... lego --accept-tos \ --key-type=rsa4096 \ --domains="*.${SUBDOMAIN}" \ --domains="*.pks.${SUBDOMAIN}" \ --domains="*.tkgi.${SUBDOMAIN}" \ --email=${EMAIL} \ --dns=route53 \ run cat < ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/ssl-certificate.yml ssl-certificate: certificate: ((ssl_certificate)) private_key: ((ssl_private_key)) EOF om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ --skip-ssl-validation \ configure-opsman \ --config <(bosh int ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/ssl-certificate.yml \ --var-file ssl_certificate=${HOME}/workspace/letsencrypt/.lego/certificates/_.${SUBDOMAIN}.crt \ --var-file ssl_private_key=${HOME}/workspace/letsencrypt/.lego/certificates/_.${SUBDOMAIN}.key) ``` ブラウザで`https://opsmanager.${TF_VAR_environment_name}.${TF_VAR_hosted_zone}`を開けば、Ops Managerにアクセスできます。 ![image](https://user-images.githubusercontent.com/106908/86750746-25719d00-c079-11ea-81fa-0a6c91509e66.png) パスワードは`~/workspace/config/sandbox/ops-manager/env.yml`に出力されています。 ![image](https://user-images.githubusercontent.com/106908/86750922-4508c580-c079-11ea-8141-6474c196dd9b.png) ## Configure director 次にBOSH Directorの設定を`om` CLIで行います。 必要な設定ファイルテンプレートは https://raw.githubusercontent.com/making/platform-automation/master/config/aws/sandbox/director/config.yml です。プレースホルダーを`terraform output`の値で埋めます ``` mkdir -p ~/workspace/config/${TF_VAR_environment_name}/director cd ~/workspace/config/${TF_VAR_environment_name}/director wget https://raw.githubusercontent.com/making/platform-automation/master/config/aws/sandbox/director/config.yml om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ configure-director \ --config ${HOME}/workspace/config/${TF_VAR_environment_name}/director/config.yml \ --vars-file ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml ``` ![image](https://user-images.githubusercontent.com/106908/86751960-fdcf0480-c079-11ea-9ae1-ced96b0637db.png) ## Configure TKGI 次にTKGIのアップロードと設定を行います。 必要な設定ファイルテンプレートは https://raw.githubusercontent.com/making/platform-automation/master/config/aws/sandbox/tkgi/config.yml です。プレースホルダーを`terraform output`の値で埋めます ``` mkdir -p ~/workspace/config/${TF_VAR_environment_name}/tkgi cd ~/workspace/config/${TF_VAR_environment_name}/tkgi wget https://raw.githubusercontent.com/making/platform-automation/master/config/aws/sandbox/tkgi/config.yml om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ upload-product \ --product ${HOME}/workspace/pivnet/pivotal-container-service-1.8.0-build.16.pivotal om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ stage-product \ --product-name pivotal-container-service \ --product-version 1.8.0-build.16 om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ configure-product \ --config <(bosh int ${HOME}/workspace/config/${TF_VAR_environment_name}/tkgi/config.yml \ --var-file ssl_certificate=${HOME}/workspace/letsencrypt/.lego/certificates/_.${SUBDOMAIN}.crt \ --var-file ssl_private_key=${HOME}/workspace/letsencrypt/.lego/certificates/_.${SUBDOMAIN}.key) \ --vars-file ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml ``` ![image](https://user-images.githubusercontent.com/106908/86754595-f6105f80-c07b-11ea-955b-f6172f083c65.png) Plan1(`small`)とPlan2(`medium`)だけ設定してあります。 ![image](https://user-images.githubusercontent.com/106908/86754832-2526d100-c07c-11ea-830a-3c361fdfc8ca.png) Plan1: * Master x 1 (`t3.medium`) * Worker x 3 (`t3.medium`) ![image](https://user-images.githubusercontent.com/106908/86754876-2e17a280-c07c-11ea-8207-cd00c8962392.png) Plan2: * Master x 3 (`t3.medium`) * Worker x 5 (`t3.medium`) Workerのインスタンス数は作成時または作成後に変更できます。 ## Apply changes Apply ChangesでTKGIとBOSH Directorのインストールを開始します。 ``` om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \ apply-changes ``` しばらく待ち時間です。 ![image](https://user-images.githubusercontent.com/106908/86757728-50aabb00-c07e-11ea-9e2a-63006810203b.png) 約50分でインストールが完了します。 ## Verify TKGI `tkgi` CLIでTKGI APIにアクセスします。 ``` TKGI_API_DNS=$(bosh int ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml --path /pks_api_dns) TKGI_ADMIN_SECRET=$(om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml credentials -p pivotal-container-service -c .properties.pks_uaa_management_admin_client -f secret) TKGI_ADMIN_PASSWORD=$(om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml credentials -p pivotal-container-service -c .properties.uaa_admin_password -f secret) tkgi login -a ${TKGI_API_DNS} -k -u admin -p ${TKGI_ADMIN_PASSWORD} ``` ### Create a Kubernetes cluster `tkgi` CLIのAWS用ラッパーである[pks-cli-aws](https://github.com/making/pks-cli-aws)をダウンロードします。 pks-cli-awsはK8sのmasterにアタッチするNLBの作成とアタッチ、Subnetに対する必要なTag設定を行うヘルパースクリプトです。 TKGI 1.8以降は`pks-aws`コマンドを`tkgi-aws`にrenameして使用します。 ``` sudo wget -O /usr/local/bin/tkgi-aws https://raw.githubusercontent.com/making/pks-cli-aws/master/pks-aws sudo chmod +x /usr/local/bin/tkgi-aws ``` `cluster01`という名前のK8sクラスタを`tkgi`及び`tkgi-aws`コマンドで作成します。 ``` # 必要な環境変数を定義 ENV_NAME=${TF_VAR_environment_name} CLUSTER_NAME=cluster01 export AWS_DEFAULT_REGION=${TF_VAR_region} export AWS_ACCESS_KEY_ID=${TF_VAR_access_key} export AWS_SECRET_ACCESS_KEY=${TF_VAR_secret_key} # Master用のNLBを作成 MASTER_HOSTNAME=$(tkgi-aws create-lb ${CLUSTER_NAME} ${ENV_NAME}) # K8sクラスタの作成 tkgi create-cluster ${CLUSTER_NAME} -e ${MASTER_HOSTNAME} -p small -n 1 --wait # NLBをK8sクラスタにアタッチ tkgi-aws attach-lb ${CLUSTER_NAME} # クラスタの情報をSubnetとSecurity Groupのタグに設定 tkgi-aws create-tags ${CLUSTER_NAME} ${ENV_NAME} ``` > [TKGIのドキュメント](https://docs.pivotal.io/tkgi/1-8/aws-cluster-load-balancer.html)ではCLBを作成して、Master VM IDをLBに設定するようにガイドされていますが、
> この方法ではPKSのバージョンアップやOSのアップデートでMaster VMがBOSH DirectorによってRecreateされた場合にLBからDetachされてしまい、
> 再度アタッチし直さないといけません。`tkgi-aws`ではNLBのtargetとしてMaster VMのIPを指定しているため、recreateされても再アタッチする必要はありません。 10-15分くらいでクラスタが作成されます。 ``` $ tkgi clusters TKGI Version Name k8s Version Plan Name UUID Status Action 1.8.0-build.16 cluster01 1.17.5 small e6c9deef-7ce7-42c8-a1e7-4047685c7588 succeeded CREATE ``` 次のコマンドでK8sクラスタにアクセスするための設定ファイル(~/.kube/config)をダウンロードします。 ``` # パスワードは${TKGI_ADMIN_PASSWORD}の値 tkgi get-credentials ${CLUSTER_NAME} ``` `kubectl`でK8sクラスタにアクセス可能になります。 ``` $ kubectl cluster-info Kubernetes master is running at https://pks-cluster01-025a3d1a04d85423.elb.ap-northeast-1.amazonaws.com:8443 CoreDNS is running at https://pks-cluster01-025a3d1a04d85423.elb.ap-northeast-1.amazonaws.com:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. $ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ip-10-0-8-11.ap-northeast-1.compute.internal Ready 13m v1.17.5+vmware.1 10.0.8.11 Ubuntu 16.04.6 LTS 4.15.0-106-generic docker://19.3.5 $ kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-5b6649768f-6snnx 1/1 Running 0 11m kube-system coredns-5b6649768f-ltqmk 1/1 Running 0 11m kube-system coredns-5b6649768f-vrmcq 1/1 Running 0 11m kube-system metrics-server-7f9887fbb5-kwbh9 1/1 Running 0 11m pks-system cert-generator-1311f65a5dfa4bf6774ba070152672eacdb3e6b2-rz2ld 0/1 Completed 0 11m pks-system event-controller-6969f56f88-s475x 2/2 Running 0 11m pks-system metric-controller-5dfd968d6f-z5s7n 1/1 Running 0 11m pks-system observability-manager-6487c9fbf9-vjzjl 1/1 Running 0 11m pks-system sink-controller-7799b4f4d7-pkgpz 1/1 Running 0 11m pks-system telegraf-r9j6h 1/1 Running 0 11m pks-system telemetry-agent-778fc8997d-ftg8p 2/2 Running 0 10m pks-system validator-5787b98d57-h4g57 1/1 Running 0 11m ``` ### Run a sample pod/service on k8s 作成したK8sクラスタにサンプルアプリをデプロイします。 ``` kubectl create deployment demo --image=making/hello-cnb --dry-run -o=yaml > /tmp/deployment.yaml echo --- >> /tmp/deployment.yaml kubectl create service loadbalancer demo --tcp=8080:8080 --dry-run -o=yaml >> /tmp/deployment.yaml kubectl apply -f /tmp/deployment.yaml ``` 作成されたリソースを確認します。 ``` $ kubectl get pod,service -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/demo-755c587cc4-nlvhq 1/1 Running 0 42s 10.200.10.13 ip-10-0-8-11.ap-northeast-1.compute.internal NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/demo LoadBalancer 10.100.200.253 a3aa6b39a6582411f99321ccc00e93a9-1586208277.ap-northeast-1.elb.amazonaws.com 8080:32609/TCP 42s app=demo service/kubernetes ClusterIP 10.100.200.1 443/TCP 19m ``` しばらくするとLBを経由してアプリケーションにアクセスできます。 ``` $ curl http://a3aa6b39a6582411f99321ccc00e93a9-1586208277.ap-northeast-1.elb.amazonaws.com:8080/actuator/health {"status":"UP","groups":["liveness","readiness"]} ``` ## SSH into Ops Manager 次のコマンドでJumpboxからOps Manager VMにアクセスするためのスクリプトを生成します。 ``` # configure BOSH envionment variables on opsmanager cat < /tmp/opsman-${TF_VAR_hosted_zone}.pem $(bosh int ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml --path /ops_manager_ssh_private_key) PEM chmod 600 /tmp/opsman-${TF_VAR_hosted_zone}.pem ssh -o "StrictHostKeyChecking=no" \ -o "ServerAliveInterval=15" \ -i /tmp/opsman-${TF_VAR_hosted_zone}.pem \ ubuntu@$(bosh int ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/vars.yml --path /ops_manager_dns) "$(cat < /dev/null $(om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml bosh-env) ENV EOF )" cat <