目次
はじめに
ディーネットのよろず請負の深見です。
前回より、幾分の時間が経ちましたが、残っている調整等の続けていきます。
前回までで、Kubernetes (k8s) 環境としては整い、k8s の利用になれている方なら、そのまま利用できるようになっています。
今回は、更に不足している機能やあればうれしい機能を整えていきます。
予告の通り、
-
TEC の環境調整
-
kubernetes (kubectl) のプラグイン追加
-
LB 機能の追加 (MetalLB のインストール)
と進めていきます。
TEC の環境調整
k8s 環境としては、基本的なものは整いましたが、一旦、導入済みのパッケージを確認します。
現状での Package 環境の確認
・利用可能な Package リストの確認
$ tanzu package available list -A
denet@lab-tce-boot-03 [ ~ ]$ tanzu package available list -A
- Retrieving available packages...
NAME DISPLAY-NAME SHORT-DESCRIPTION LATEST-VERSION NAMESPACE
addons-manager.tanzu.vmware.com tanzu-addons-manager This package provides TKG addons lifecycle management capabilities. 1.4.0+vmware.1-tkg.1 tkg-system
ako-operator.tanzu.vmware.com ako-operator NSX Advanced Load Balancer using ako-operator 1.4.0+vmware.1-tkg.1 tkg-system
antrea.tanzu.vmware.com antrea networking and network security solution for containers 0.13.3+vmware.1-tkg.1 tkg-system
calico.tanzu.vmware.com calico Networking and network security solution for containers. 3.11.3+vmware.1-tkg.1 tkg-system
kapp-controller.tanzu.vmware.com kapp-controller Kubernetes package manager 0.23.0+vmware.1-tkg.1 tkg-system
load-balancer-and-ingress-service.tanzu.vmware.com load-balancer-and-ingress-service Provides L4+L7 load balancing for TKG clusters running on vSphere 1.4.3+vmware.1-tkg.1 tkg-system
metrics-server.tanzu.vmware.com metrics-server Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. 0.4.0+vmware.1-tkg.1 tkg-system
pinniped.tanzu.vmware.com pinniped Pinniped provides identity services to Kubernetes. 0.4.4+vmware.1-tkg.1 tkg-system
vsphere-cpi.tanzu.vmware.com vsphere-cpi The Cluster API brings declarative, Kubernetes-style APIs to cluster creation, configuration and management. Cluster API Provider for vSphere is a concrete implementation of Cluster API for vSphere. 1.21.0+vmware.1-tkg.1 tkg-system
vsphere-csi.tanzu.vmware.com vsphere-csi vSphere CSI provider 2.3.0+vmware.1-tkg.2 tkg-system
※「kubectl get package -A」でも同様にのリストが表示できます。
・インストール済み Package リストの確認
$ tanzu package installed list -A
denet@lab-tce-boot-03 [ ~ ]$ tanzu package installed list -A
- Retrieving installed packages...
NAME PACKAGE-NAME PACKAGE-VERSION STATUS NAMESPACE
antrea antrea.tanzu.vmware.com 0.13.3+vmware.1-tkg.1 Reconcile succeeded tkg-system
metrics-server metrics-server.tanzu.vmware.com 0.4.0+vmware.1-tkg.1 Reconcile succeeded tkg-system
vsphere-cpi vsphere-cpi.tanzu.vmware.com 1.21.0+vmware.1-tkg.1 Reconcile succeeded tkg-system
vsphere-csi vsphere-csi.tanzu.vmware.com 2.3.0+vmware.1-tkg.2 Reconcile succeeded tkg-system
※「kubectl get packageinstall -A」でも同様にのリストが表示できます。
・TCE 用の Package を利用可能とするため、Package Repository を追加します。
$ tanzu package repository add tce-repo --url projects.registry.vmware.com/tce/main:0.9.1 --namespace tanzu-package-repo-global
denet@lab-tce-boot-03 [ ~ ]$ tanzu package repository add tce-repo --url projects.registry.vmware.com/tce/main:0.9.1 --namespace tanzu-package-repo-global
/ Adding package repository 'tce-repo'
| Validating provided settings for the package repository
| Creating package repository resource
- Waiting for 'PackageRepository' reconciliation for 'tce-repo'
| 'PackageRepository' resource install status: Reconciling
Please consider using 'tanzu package repository update' to update the package repository with correct settings
Error: resource reconciliation failed: kapp: Error: Applying create package/velero.community.tanzu.vmware.com.1.6.3 (data.packaging.carvel.dev/v1alpha1) namespace: tanzu-package-repo-global:
Creating resource package/velero.community.tanzu.vmware.com.1.6.3 (data.packaging.carvel.dev/v1alpha1) namespace: tanzu-package-repo-global: the server was unable to return a response in the time allotted, but may still be processing the request (reason: Timeout). Reconcile failed: Deploying: Error (see .status.usefulErrorMessage for details)
Error: exit status 1
? exit status 1
※ここでの最後のエラーは一旦無視しても大丈夫です。
・再度、インストール済み Package リストの確認
$ tanzu package available list -A
denet@lab-tce-boot-03 [ ~ ]$ tanzu package available list -A
- Retrieving available packages...
NAME DISPLAY-NAME SHORT-DESCRIPTION LATEST-VERSION NAMESPACE
cert-manager.community.tanzu.vmware.com cert-manager Certificate management 1.5.3 tanzu-package-repo-global
contour.community.tanzu.vmware.com Contour An ingress controller 1.18.1 tanzu-package-repo-global
external-dns.community.tanzu.vmware.com external-dns This package provides DNS synchronization functionality. 0.8.0 tanzu-package-repo-global
fluent-bit.community.tanzu.vmware.com fluent-bit Fluent Bit is a fast Log Processor and Forwarder 1.7.5 tanzu-package-repo-global
gatekeeper.community.tanzu.vmware.com gatekeeper policy management 1.0.0 tanzu-package-repo-global
grafana.community.tanzu.vmware.com grafana Visualization and analytics software 7.5.7 tanzu-package-repo-global
harbor.community.tanzu.vmware.com Harbor OCI Registry 2.2.3 tanzu-package-repo-global
knative-serving.community.tanzu.vmware.com knative-serving Knative Serving builds on Kubernetes to support deploying and serving of applications and functions as serverless containers 0.22.0 tanzu-package-repo-global
local-path-storage.community.tanzu.vmware.com local-path-storage This package provides local path node storage and primarily supports RWO AccessMode. 0.0.20 tanzu-package-repo-global
multus-cni.community.tanzu.vmware.com multus-cni This package provides the ability for enabling attaching multiple network interfaces to pods in Kubernetes 3.7.1 tanzu-package-repo-global
prometheus.community.tanzu.vmware.com prometheus A time series database for your metrics 2.27.0 tanzu-package-repo-global
velero.community.tanzu.vmware.com velero Disaster recovery capabilities tanzu-package-repo-global
addons-manager.tanzu.vmware.com tanzu-addons-manager This package provides TKG addons lifecycle management capabilities. 1.4.0+vmware.1-tkg.1 tkg-system
ako-operator.tanzu.vmware.com ako-operator NSX Advanced Load Balancer using ako-operator 1.4.0+vmware.1-tkg.1 tkg-system
antrea.tanzu.vmware.com antrea networking and network security solution for containers 0.13.3+vmwar
e.1-tkg.1 tkg-system
calico.tanzu.vmware.com calico Networking and network security solution for containers. 3.11.3+vmware.1-tkg.1 tkg-system
kapp-controller.tanzu.vmware.com kapp-controller Kubernetes package manager 0.23.0+vmware.1-tkg.1 tkg-system
load-balancer-and-ingress-service.tanzu.vmware.com load-balancer-and-ingress-service Provides L4+L7 load balancing for TKG clusters running on vSphere 1.4.3+vmware.1-tkg.1 tkg-system
metrics-server.tanzu.vmware.com metrics-server Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. 0.4.0+vmware.1-tkg.1 tkg-system
pinniped.tanzu.vmware.com pinniped Pinniped provides identity services to Kubernetes. 0.4.4+vmware.1-tkg.1 tkg-system
vsphere-cpi.tanzu.vmware.com vsphere-cpi The Cluster API brings declarative, Kubernetes-style APIs to cluster creation, configuration and management. Cluster API Provider for vSphere is a concrete implementation of Cluster API for vSphere. 1.21.0+vmware.1-tkg.1 tkg-system
vsphere-csi.tanzu.vmware.com vsphere-csi vSphere CSI provider 2.3.0+vmware.1-tkg.2 tkg-system
※利用可能な Package リスト中に TCE 用の Package が追加されていることが確認できます。
ストレージ関連の調整
・ストレージクラス (StorageClass) の確認と追加
$ kubectl get storageclass
denet@lab-tce-boot-03 [ ~ ]$ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
default (default) csi.vsphere.vmware.com Delete Immediate true 15h
※ここに永続ストレージとして、Local Path Storage を追加します。
・追加可能な local-path-storage の確認
$ tanzu package available list local-path-storage.community.tanzu.vmware.com --namespace tanzu-package-repo-global
denet@lab-tce-boot-03 [ ~ ]$ tanzu package available list local-path-storage.community.tanzu.vmware.com --namespace tanzu-package-repo-global
- Retrieving package versions for local-path-storage.community.tanzu.vmware.com...
NAME VERSION RELEASED-AT
local-path-storage.community.tanzu.vmware.com 0.0.19 2021-09-15 09:00:00 +0900 JST
local-path-storage.community.tanzu.vmware.com 0.0.20 2021-09-15 09:00:00 +0900 JST
・ local-path-storage のインストール
$ kubectl create ns tce-package-install
$ tanzu package install local-path-storage --package-name local-path-storage.community.tanzu.vmware.com -v 0.0.20 -n tce-package-install
denet@lab-tce-boot-03 [ ~ ]$ kubectl create ns tce-package-install
namespace/tce-package-install created
denet@lab-tce-boot-03 [ ~ ]$
denet@lab-tce-boot-03 [ ~ ]$ tanzu package install local-path-storage --package-name local-path-storage.community.tanzu.vmware.com -v 0.0.20 -n tce-package-install
/ Installing package 'local-path-storage.community.tanzu.vmware.com'
/ Getting package metadata for 'local-path-storage.community.tanzu.vmware.com'
| Creating service account 'local-path-storage-tce-package-install-sa'
| Creating cluster admin role 'local-path-storage-tce-package-install-cluster-role'
| Creating cluster role binding 'local-path-storage-tce-package-install-cluster-rolebinding'
| Creating package resource
- Waiting for 'PackageInstall' reconciliation for 'local-path-storage'
- 'PackageInstall' resource install status: Reconciling
Added installed package 'local-path-storage'
※Package リソースを管理する namespace として、「tce-package-install」を作成し、Local Path Storage パッケージをインストールします。
・Local Path Storage パッケージのインストール確認
$ tanzu package installed list -A
denet@lab-tce-boot-03 [ ~ ]$ tanzu package installed list -A
/ Retrieving installed packages...
NAME PACKAGE-NAME PACKAGE-VERSION STATUS NAMESPACE
local-path-storage local-path-storage.community.tanzu.vmware.com 0.0.20 Reconcile succeeded tce-package-install
antrea antrea.tanzu.vmware.com 0.13.3+vmware.1-tkg.1 Reconcile succeeded tkg-system
metrics-server metrics-server.tanzu.vmware.com 0.4.0+vmware.1-tkg.1 Reconcile succeeded tkg-system
vsphere-cpi vsphere-cpi.tanzu.vmware.com 1.21.0+vmware.1-tkg.1 Reconcile succeeded tkg-system
vsphere-csi vsphere-csi.tanzu.vmware.com 2.3.0+vmware.1-tkg.2 Reconcile succeeded tkg-system
※ Package でインストールされるソフトウェアは Appリソース によってReconcileされます。 次のコマンドでAppリソースのリストを確認できます。
$ kubectl get app -A
denet@lab-tce-boot-03 [ ~ ]$ kubectl get app -A
NAMESPACE NAME DESCRIPTION SINCE-DEPLOY AGE
tce-package-install local-path-storage Reconcile succeeded 8s 3m22s
tkg-system antrea Reconcile succeeded 110s 16h
tkg-system metrics-server Reconcile succeeded 5m11s 16h
tkg-system vsphere-cpi Reconcile succeeded 21s 16h
tkg-system vsphere-csi Reconcile succeeded 52s 16h
・local-path-provisioner の起動確認
$ kubectl get -n tanzu-local-path-storage pod
denet@lab-tce-boot-03 [ ~ ]$ kubectl get -n tanzu-local-path-storage pod
NAME READY STATUS RESTARTS AGE
local-path-provisioner-56f867fbf5-t295n 1/1 Running 0 9m
・StorageClass の設定確認
$ kubectl get storageclass
denet@lab-tce-boot-03 [ ~ ]$ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
default (default) csi.vsphere.vmware.com Delete Immediate true 16h
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 9m7s
※追加した「Local Path Storage」を確認できます。
vsphere 上に構築していますので、vsphere 時の標準 StorageClass も確認できます。
Kubernetes (kubectl) のプラグインのインストール
k8s 環境を利用するに便利はプラグインを導入します。
プラグインマネージャー Krew のインストール
① git のインストールを確認
$ sudo tdnf list git
git がインストールされていなければ、ここでインストールします。
$ sudo tdnf install git
② 以下を実行して、Krew をインストールします。
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
③ krew のパスを PATH に追加します。
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
※上記を.bashrc に追記
and restart your shell.
④ krew の確認
$ kubectl krew
$ kubectl krew
krew is the kubectl plugin manager.
You can invoke krew through kubectl: "kubectl krew [command]..."
Usage:
kubectl krew [command]
Available Commands:
completion generate the autocompletion script for the specified shell
help Help about any command
index Manage custom plugin indexes
info Show information about an available plugin
install Install kubectl plugins
list List installed kubectl plugins
search Discover kubectl plugins
uninstall Uninstall plugins
update Update the local copy of the plugin index
upgrade Upgrade installed plugins to newer versions
version Show krew version and diagnostics
Flags:
-h, --help help for krew
-v, --v Level number for the log level verbosity
Use "kubectl krew [command] --help" for more information about a command.
⑤ プラグインのインストール
オススメ度:大(これらのプラグインで日々の運用を楽に)
・kubectl ctx(コンテキストを簡単に切り替え、定番プラグイン)
$ kubectl krew install ctx
・kubectl ns(Namespace を簡単に切り替え、定番プラグイン)
$ kubectl krew install ns
・kubectl iexec(インタラクティブな kubectl exec、Pod 名や Pod 内のコンテナ名を把握する必要がなくなる)
$ kubectl krew install iexec
・kubectl status(リソースのステータスをわかりやすく表示)
$ kubectl krew install status
・kubectl neat(マニフェストから冗長な情報を削除して表示、マニフェストが読みやすくなる)
$ kubectl krew install neat
・kubectl view-secret(SecretをBase64デコードして表示)
kubectl krew install view-secret
・kubectl images(Podが使用しているコンテナイメージの一覧表示)
$ kubectl krew install images
・kubectl rolesum(指定したSubjectのRBACロールをサマリー表示)
$ kubectl krew install rolesum
・kubectl open-svc(ClusterIPなServiceにクラスタ外から簡単にアクセス)
$ kubectl krew install open-svc
オススメ度:中(万人向けではないかもしれませんが、意外と役立つ場面が多いかも)
・kubectl tree(ownerReferenceベースでリソースをツリー表示、Operatorの開発や検証で役立つ)
$ kubectl krew install tree
・kubectl exec-as(ユーザーを指定して kubectl exec)
$ kubectl krew install exec-as
・kubectl modify-secret(Base64エンコード/デコードを気にせずにSecretの直接編集)
$ kubectl krew install modify-secret
・kubectl view-serviceaccount-kubeconfig(指定されたSAベースのKubeconfig生成、CI/CD用のKubeconfig生成で役立つ)
$ kubectl krew install view-serviceaccount-kubeconfig
・kubectl get-all(kubectl get allで表示できないものも含んだリソース一覧を表示)
$ kubectl krew install get-all
・kubectl node-shell(KubernetesクラスタのNodeにログイン)
$ kubectl krew install node-shell
・kubectl ca-cert(KubernetesクラスタのCA証明書を表示)
$ kubectl krew install ca-cert
・kubectl who-can(指定したVerbとResourceを実行可能なSubjectを表示)
$ kubectl krew install who-can
オススメ度:小(出番は少ないかもしれませんが、インストールしておくといざというときに役に立つかと)
・kubectl outdated(Kubernetesクラスタ内の古いイメージを表示)
$ kubectl krew install outdated
・kubectl df-pv(Persistent Volumeの空き容量を表示)
$ kubectl krew install df-pv
・kubectl resource-capacity(NodeやPodごとにResource Request/Limitを一覧表示)
$ kubectl krew install resource-capacity
・kubectl fleet(Kubeconfig内のクラスタに関する情報を一覧表示、マルチクラウド環境で役立ちそう)
$ kubectl krew install fleet
・kubectl prompt(特定のクラスタやNamespaceに対する操作で警告を促してくれる、事故防止に良い)
$ kubectl krew install prompt
MetalLB の導入
kubernetesでサービスを外部に公開するときにtype: LoadBalancerを使います。
ただし、本環境ではパブリッククラウドのように標準的に利用できるものはありませんので、本環境でも利用できる MetalLB を導入します。
MetalLBはオンプレミスでもtype: LoadBalancerを扱えるようにする、kubernetes上で動作するOSSのアプリケーションです。
MetalLB には、L2 モードと BGP モードの 2 種類のモードがありますが、今回は L2 モードで設定をしていきます。
MetalLB のインストール
以下のコマンドを実行します。
mkdir metallb ; cd metallb
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.3/manifests/metallb.yaml
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
きちんと起動しているか確認しましょう。RunningであればOKです。
$ kubectl get pods -n metallb-system
$ kubectl get daemonsets -n metallb-system
つづいて設定を入れていきます。以下の設定をmetallb-config.yamlとして保存してください。
IP アドレス空間は個々にネットワーク環境にあわせて調整します。
$ vi metallb-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.16.20.200-172.16.20.209
そして、適用をします。
$ kubectl apply -f metallb-config.yaml
次のコマンドでMetalLBが起動していることを確認
$ kubectl get pod -n metallb-system -owide
MetalLB の動作確認(Nginxの起動)
実際にMetalLBを利用してNginxを起動してみます。
以下のの yaml を nginx.yaml という名前で保存。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-metallb
name: nginx-metallb
spec:
selector:
matchLabels:
app: nginx-metallb
template:
metadata:
labels:
app: nginx-metallb
spec:
containers:
- image: nginx
name: nginx-metallb
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-metallb
spec:
type: LoadBalancer
selector:
app: nginx-metallb
ports:
- name: http
port: 80
targetPort: 80
そして、適用します。
$ kubectl apply -f nginx.yaml
このように LoadBalancer が表示されていれば成功です。今回は 172.16.20.200 というIPで起動していますね。
curl コマンドを叩いてアクセスしてみましょう。きちんとアクセスできることが確認できています。
以上で MetalLB によるロードバランサーの設定は完了となります。
MetalLB の挙動などの詳細については、とりあえず省略しますが、お知りになりたい方は以下にて詳しく解説をされていますので、ご参照ください。
最後に
これで、VMware Tanzu Communit Edition による Kubernetes (k8s) 環境の構築が完了しました。
ここからは、k8s の学習環境として利用するもよし、アプリケーションの開発環境として利用するもよしの便利環境としてご利用いただける思います。
今後、TCE はバージョンアップにより、より便利なコンテナオーケストレーション環境となると思いますので、機会があれば引き続き紹介しようと思います。
それでは、この辺で失礼します。