Dev > CaaS > Kubernetes > PKS > AWS
Jul 7, 2020
Jul 7, 2020
N/A Views
MD
warning
この記事は2年以上前に更新されたものです。情報が古くなっている可能性があります。

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に対応している後者を使用します。

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

に次のパッチをあてます。

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を使用して、次のプロダクトをダウンロードします。

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にアクセスできます。

image

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

image

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

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

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

image

Plan1:

  • Master x 1 (t3.medium)
  • Worker x 3 (t3.medium)

image

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

約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クラスタを削除します。ServicePersistentVolumeリソースで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
Found a mistake? Update the entry.
Share this article: