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
- Install CLIs on the Jumpbox
- Pave AWS environment for TKGI
- Download files
- Create ops manager vm
- Configure authentication
- Generate and configure let's encrypt
- Configure director
- Configure TKGI
- Apply changes
- Verify TKGI
- SSH into Ops Manager
- Delete a cluster
- Delete installation
- Delete ops manager vm
- Wipe AWS environment
- Delete the Jumpbox VM
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に対応している後者を使用します。
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 (旧Pivotal Network)から必要なファイルをダウンロードします。
VMware Tanzu Networkにログインして、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 <<EOF >> ${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 <<EOF > auth.yml
username: ${OM_USERNAME}
password: ${OM_PASSWORD}
decryption-passphrase: ${OM_DECRYPTION_PASSPHRASE}
EOF
cat <<EOF > 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 <<EOF > ${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にアクセスできます。

パスワードは~/workspace/config/sandbox/ops-manager/env.ymlに出力されています。

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

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

Plan1(small)とPlan2(medium)だけ設定してあります。

Plan1:
- Master x 1 (
t3.medium) - Worker x 3 (
t3.medium)

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
しばらく待ち時間です。

約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をダウンロードします。
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のドキュメントでは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 <none> 13m v1.17.5+vmware.1 10.0.8.11 <none> 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 <none> <none>
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 <none> 443/TCP 19m <none>
しばらくすると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 <<PEM > /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 <<EOF
cat <<ENV | sudo tee -a /etc/profile.d/bosh.sh > /dev/null
$(om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml bosh-env)
ENV
EOF
)"
cat <<SCRIPT > /tmp/ssh-opsman-${TF_VAR_hosted_zone}.sh
#!/bin/bash
cat <<PEM > /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) "\$@"
SCRIPT
chmod +x /tmp/ssh-opsman-${TF_VAR_hosted_zone}.sh
生成したスクリプトを実行してOps Manager VMにログインします。
/tmp/ssh-opsman-${TF_VAR_hosted_zone}.sh
Ops Manager上でbosh vmsコマンドを実行するとBOSH Directorで管理されているVM一覧を確認できます。
$ bosh vms
Using environment '10.0.16.10' as client 'ops_manager'
Task 41
Task 42
Task 41 done
Task 42 done
Deployment 'pivotal-container-service-ec16b96176af0c7f6fbc'
Instance Process State AZ IPs VM CID VM Type Active Stemcell
pivotal-container-service/6fda37df-1143-44a1-917f-bec0f3d5b124 running ap-northeast-1c 10.0.13.11 i-08d875c929186e74f t3.medium true bosh-aws-xen-hvm-ubuntu-xenial-go_agent/621.76
pks-db/7bf23fee-e83c-40e2-a2e7-9a0afe010bfb running ap-northeast-1c 10.0.13.10 i-068306bf31f7803f2 t3.medium true bosh-aws-xen-hvm-ubuntu-xenial-go_agent/621.76
2 vms
Deployment 'service-instance_e6c9deef-7ce7-42c8-a1e7-4047685c7588'
Instance Process State AZ IPs VM CID VM Type Active Stemcell
master/9a1d813c-0d80-4c21-a631-a0657b8f488b running ap-northeast-1a 10.0.8.10 i-038b98adf62dfa5ae t3.medium true bosh-aws-xen-hvm-ubuntu-xenial-go_agent/621.76
worker/69ac9b5b-1b60-4a52-aa23-412191aac490 running ap-northeast-1a 10.0.8.11 i-02694bbf4bb24c382 t3.medium true bosh-aws-xen-hvm-ubuntu-xenial-go_agent/621.76
2 vms
Succeeded
Delete a cluster
作成したK8sクラスタを削除します。ServiceやPersistentVolumeリソースでKuberntesが作成したAWSリソース(LBやEBSなど)は、tkg delete-clusterコマンドでは削除されないため、でK8sクラスタを削除する前に削除してください。
kubectl delete -f /tmp/deployment.yaml
tkgi-aws delete-tags ${CLUSTER_NAME} ${ENV_NAME}
tkgi-aws delete-lb ${CLUSTER_NAME}
tkgi delete-cluster ${CLUSTER_NAME} --wait --non-interactive
Delete installation
TKGIとBOSH Directorをアンインストールします。
om --env ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/env.yml \
delete-installation \
--force
Delete ops manager vm
Ops Managerを削除します。
p-automator delete-vm \
--config ${HOME}/workspace/config/${TF_VAR_environment_name}/ops-manager/config.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
Wipe AWS environment
Terraformで作成したAWS環境を削除します。
cd ~/workspace/paving/aws
terraform destroy -auto-approve
Delete the Jumpbox VM
Jumpboxからログアウトし、Jumbpbox VMを削除します。
terraform destroy -auto-approve