KubeFedのクイックスタート

このAWSソリューション実装を理解するために、先ずそもそもKubeFedのクイックスタートを試してみたメモ。

クイックスタート

リポジトリをクローンする。

git clone https://github.com/kubernetes-sigs/kubefed.git
cd kubefed/

Kindでクラスターを起動する。

$ kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.20.2) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

ノードを確認する。

$ k get node
NAME                 STATUS   ROLES                  AGE     VERSION
kind-control-plane   Ready    control-plane,master   3m47s   v1.20.2

kubefedをデプロイする。

make deploy.kind

なかなかコマンドが通らない。

  • Goが必要
  • gsedが必要
  • 先に./scripts/download-binaries.shの実行が必要
  • 上記スクリプトでバイナリをダウンロードしたディレクトリにパスを通す
$ make deploy.kind

(省略)

Release "kubefed" does not exist. Installing it now.
NAME: kubefed
LAST DEPLOYED: Fri Mar 12 18:10:49 2021
NAMESPACE: kube-federation-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
I0312 18:11:13.086691   35295 join.go:148] Defaulting cluster context to joining cluster name kind-kind
I0312 18:11:13.086823   35295 join.go:160] Args and flags: name kind-kind, host: kind-kind, host-system-namespace: kube-federation-system, kubeconfig: , cluster-context: kind-kind, secret-name: , dry-run: false
I0312 18:11:13.177397   35295 join.go:241] Performing preflight checks.
I0312 18:11:13.182509   35295 join.go:247] Creating kube-federation-system namespace in joining cluster
I0312 18:11:13.188251   35295 join.go:390] Already existing kube-federation-system namespace
I0312 18:11:13.188296   35295 join.go:254] Created kube-federation-system namespace in joining cluster
I0312 18:11:13.188313   35295 join.go:412] Creating service account in joining cluster: kind-kind
I0312 18:11:13.200502   35295 join.go:422] Created service account: kind-kind-kind-kind in joining cluster: kind-kind
I0312 18:11:13.200522   35295 join.go:449] Creating cluster role and binding for service account: kind-kind-kind-kind in joining cluster: kind-kind
I0312 18:11:13.253592   35295 join.go:458] Created cluster role and binding for service account: kind-kind-kind-kind in joining cluster: kind-kind
I0312 18:11:13.253633   35295 join.go:818] Creating cluster credentials secret in host cluster
I0312 18:11:13.272069   35295 join.go:846] Using secret named: kind-kind-kind-kind-token-c6zft
I0312 18:11:13.293713   35295 join.go:891] Created secret in host cluster named: kind-kind-p9zzx
I0312 18:11:13.384075   35295 join.go:286] Created federated cluster resource

Helmチャートでkube-federation-systemに何かがインストールされている。

$ helm ls -A
NAME    NAMESPACE               REVISION        UPDATED                                 STATUS          CHART           APP VERSION
kubefed kube-federation-system  1               2021-03-12 18:10:49.627911 +0900 JST    deployed        kubefed-0.0.3            
$ k get pod -A
NAMESPACE                NAME                                          READY   STATUS    RESTARTS   AGE
kube-federation-system   kubefed-admission-webhook-b559b6d8-vjhgb      1/1     Running   0          4m45s
kube-federation-system   kubefed-controller-manager-79768548bf-9nnxl   1/1     Running   0          4m25s
kube-federation-system   kubefed-controller-manager-79768548bf-vbjgx   1/1     Running   0          4m22s
kube-system              coredns-74ff55c5b-5pzbn                       1/1     Running   2          63m
kube-system              coredns-74ff55c5b-6mc2g                       1/1     Running   2          63m
kube-system              etcd-kind-control-plane                       1/1     Running   2          63m
kube-system              kindnet-69p92                                 1/1     Running   2          63m
kube-system              kube-apiserver-kind-control-plane             1/1     Running   2          63m
kube-system              kube-controller-manager-kind-control-plane    1/1     Running   2          63m
kube-system              kube-proxy-5sss8                              1/1     Running   2          63m
kube-system              kube-scheduler-kind-control-plane             1/1     Running   2          63m
local-path-storage       local-path-provisioner-78776bfc44-h25s8       1/1     Running   4          63m

この状態で、クラスター自身がフェデレーションに登録されているがREADYになっていない。

$ kubectl -n kube-federation-system get kubefedcluster
NAME        AGE   READY
kind-kind   18m   

macOSで、APIエンドポイントの修正スクリプトが上手く機能しなかったので手動で修正する。IPを確認する。

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED       STATUS             PORTS                       NAMES
ba641073044b   kindest/node:v1.20.2   "/usr/local/bin/entr…"   2 hours ago   Up About an hour   127.0.0.1:61763->6443/tcp   kind-control-plane
$ docker inspect ba641073044b | jq -r '.[].NetworkSettings.Networks[].IPAddress'
172.18.0.2

Editする。

kubectl -n kube-federation-system edit kubefedcluster kind-kind

以下の部分を、

spec:
  apiEndpoint: https://127.0.0.1:61763

以下に直す。

spec:
  apiEndpoint: https://172.18.0.2:6443

これでREADYになった。

$ kubectl -n kube-federation-system get kubefedcluster
NAME        AGE   READY
kind-kind   36m   True

フェデレートされるネームスペースを作成する。

$ kubectl create ns federate-me
namespace/federate-me created

ネームスーペースとそのリソースをフェデレートするようにkubefedに伝える。

$ ./bin/kubefedctl federate ns federate-me
I0312 18:35:03.302374   38883 federate.go:472] Resource to federate is a namespace. Given namespace will itself be the container for the federated namespace
I0312 18:35:03.308846   38883 federate.go:501] Successfully created FederatedNamespace "federate-me/federate-me" from Namespace

フェデレートされるConfigMapを作成する。

$ kubectl -n federate-me create cm my-cm
configmap/my-cm created

ConfigMapをフェデレートするようにkubefedに伝える。

$ ./bin/kubefedctl -n federate-me federate configmap my-cm
I0312 18:37:13.120185   39381 federate.go:501] Successfully created FederatedConfigMap "federate-me/my-cm" from ConfigMap

リソースを確認する。

$ kubectl -n federate-me get federatedconfigmap
NAME    AGE
my-cm   12m
$ kubectl -n federate-me get federatednamespace
NAME          AGE
federate-me   15m

クイックスタートを通したものの、まだよく意味がわからない。