TCE で 手軽に k8s 環境を手に入れよう ~その3~

はじめに

ディーネットのよろず請負の深見です。

前回より、幾分の時間が経ちましたが、残っている調整等の続けていきます。

前回までで、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)"

lab-tce-boot-03-001

きちんと起動しているか確認しましょう。RunningであればOKです。

$ kubectl get pods -n metallb-system
$ kubectl get daemonsets -n metallb-system

lab-tce-boot-003-002

つづいて設定を入れていきます。以下の設定を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

lab-tce-boot-003-003

そして、適用をします。

$ kubectl apply -f metallb-config.yaml

次のコマンドでMetalLBが起動していることを確認

$ kubectl get pod -n metallb-system -owide

lab-tce-boot-003-004

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

lab-tce-boot-003-005

このように LoadBalancer が表示されていれば成功です。今回は 172.16.20.200 というIPで起動していますね。

lab-tce-boot-003-006

curl コマンドを叩いてアクセスしてみましょう。きちんとアクセスできることが確認できています。

lab-tce-boot-003-007

以上で MetalLB によるロードバランサーの設定は完了となります。

MetalLB の挙動などの詳細については、とりあえず省略しますが、お知りになりたい方は以下にて詳しく解説をされていますので、ご参照ください。

【手順あり】MetalLBの使い方から動きまで解説します

最後に

これで、VMware Tanzu Communit Edition による Kubernetes (k8s) 環境の構築が完了しました。

ここからは、k8s の学習環境として利用するもよし、アプリケーションの開発環境として利用するもよしの便利環境としてご利用いただける思います。

今後、TCE はバージョンアップにより、より便利なコンテナオーケストレーション環境となると思いますので、機会があれば引き続き紹介しようと思います。

それでは、この辺で失礼します。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA