在Verrazzano上实现多个Kubernetes集群的管理
首先
这篇文章是作为2021 Oracle Cloud Infrastructure Advent Calendar 第二部分第6天的一篇文章撰写的。
请问大家是否了解Verazzano这个产品?
实际上,大约一年前,在Cloud Native Days Tokyo 2020的活动中,我们作为赞助商,介绍了Verazzano。
当时,它还是Alpha版,但现在已经在今年夏季正式发布了。
我想在本文中创建一个可以在这个Verrazzano上构建多集群环境的选项。
Verrazzano到底是什么?
首先,我只介绍一下Verrazzano的概要。

Verrazzano是一个由开源产品组成的集合体,旨在将这些产品集成管理,以便用户能够更方便地使用。通过查看每个产品,可以一目了然地看出,它包括一个可进行多集群管理和应用程序生命周期管理的服务堆栈。
这次我们将使用Verrazzano来构建一个多集群环境。
在Oracle Cloud Infrastructure的“Oracle Cloud Infrastructure Advent Calendar”活动中,我们当然会在Oracle Cloud Infrastructure(以下简称OCI)的托管Kubernetes服务上构建Oracle Container Engine for Kubernetes(以下简称OKE)。
由于Verrazzano本身是一个混合架构(将来还计划支持多云),因此我们还可以在kind或一般的Kubernetes环境中进行部署。
有关每个环境的安装步骤,请参阅此处的说明。
OKE群集的准备。
我们将准备使用的OKE集群。
由于这次是多集群环境,所以我们准备了两个集群。
请按照此教程参考进行 OKE 构建步骤。
由于这是多集群管理,因此我们将构建两个 OKE 集群。
-
- Adminクラスタ
VM.Standard2.4 × 3 Node
管理対象クラスタ
VM.Standard.E3.Flex 1oCPU/8GB RAM × 3 Node
為了引用ネイティブ的中文,只需要一個選項:
Verrazzano的安裝
从这里开始,我们将继续构建OKE集群。
首先,在 OKE 集群上安装 Verrazzano。
首先安装Verrazzano Operator。
kubectl apply -f https://github.com/verrazzano/verrazzano/releases/download/v1.0.3/operator.yaml
等待直到安装完成。
kubectl -n verrazzano-install get pods -w
NAME READY STATUS RESTARTS AGE
verrazzano-platform-operator-54cf56884f-kvdfk 0/1 Init:0/1 0 12s
verrazzano-platform-operator-54cf56884f-kvdfk 0/1 PodInitializing 0 18s
verrazzano-platform-operator-54cf56884f-kvdfk 0/1 Running 0 19s
verrazzano-platform-operator-54cf56884f-kvdfk 0/1 Running 0 24s
verrazzano-platform-operator-54cf56884f-kvdfk 1/1 Running 0 85s
接下来,我们将创建自定义资源。
目前,Verrazzano可以设置三个配置文件:prod、dev和managed-cluster。
有关每个配置文件的区别,请查看此处链接。
在本文中,我们将使用dev进行创建。
kubectl apply -f - <<EOF
apiVersion: install.verrazzano.io/v1alpha1
kind: Verrazzano
metadata:
name: my-verrazzano
spec:
profile: ${VZ_PROFILE:-dev}
EOF
可以使用以下命令来查看安装过程中的日志。
kubectl logs -n verrazzano-install \
-f $(kubectl get pod \
-n verrazzano-install \
-l job-name=verrazzano-install-my-verrazzano \
-o jsonpath="{.items[0].metadata.name}")
---
[2021-12-06 04:24:53 UTC]
[2021-12-06 04:24:53 UTC] Installation Complete.
[2021-12-06 04:24:53 UTC]
[2021-12-06 04:24:53 UTC] Verrazzano provides various user interfaces.
[2021-12-06 04:24:53 UTC]
[2021-12-06 04:24:53 UTC] Grafana - https://grafana.vmi.system.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC] Prometheus - https://prometheus.vmi.system.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC] Kibana - https://kibana.vmi.system.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC] Elasticsearch - https://elasticsearch.vmi.system.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC] Verrazzano Console - https://verrazzano.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC]
[2021-12-06 04:24:53 UTC] You will need the credentials to access the preceding user interfaces. They are all accessed by the same username/password.
[2021-12-06 04:24:53 UTC] User: verrazzano
[2021-12-06 04:24:53 UTC] Password: kubectl get secret --namespace verrazzano-system verrazzano -o jsonpath={.data.password} | base64 --decode; echo
[2021-12-06 04:24:53 UTC]
[2021-12-06 04:24:53 UTC] Rancher - https://rancher.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC] User: admin
[2021-12-06 04:24:53 UTC] Password: kubectl get secret --namespace cattle-system rancher-admin-secret -o jsonpath={.data.password} | base64 --decode; echo
[2021-12-06 04:24:53 UTC]
[2021-12-06 04:24:53 UTC] Keycloak - https://keycloak.default.xxx.xxx.xxx.xxx.nip.io
[2021-12-06 04:24:53 UTC] User: keycloakadmin
[2021-12-06 04:24:53 UTC] Password: kubectl get secret --namespace keycloak keycloak-http -o jsonpath={.data.password} | base64 --decode; echo
如果显示了”Installation Complete”,则表示安装已完成。
此外,请记下包含在Verrazzano中的每个组件的URL和密码(输出的命令是Secret),请注意保存。
为了安全起见,我们也会确认Verrazzano的资源状态。
kubectl get pods -n verrazzano-system
如果处于这种状态,那么就说明Verrazzano的安装已经完成了。只需要几个命令,所以很简单!
NAME READY STATUS RESTARTS AGE
coherence-operator-5cb8cd9f76-47bnt 1/1 Running 1 18m
fluentd-8ckfm 2/2 Running 1 13m
fluentd-wsfrz 2/2 Running 1 15m
fluentd-wtg4c 2/2 Running 2 14m
oam-kubernetes-runtime-56cdb56c98-7kzc8 1/1 Running 0 16m
verrazzano-api-5d9c776954-4jjnd 2/2 Running 0 18m
verrazzano-application-operator-d57bd4f59-lrgbh 1/1 Running 0 15m
verrazzano-console-6bcb597dbb-xqtdw 2/2 Running 0 18m
verrazzano-monitoring-operator-69cc594b9b-mbhzp 1/1 Running 0 18m
verrazzano-operator-5b96664f9-lrpxs 1/1 Running 0 18m
vmi-system-es-master-0 3/3 Running 0 18m
vmi-system-grafana-88dd99bb6-l8t7x 3/3 Running 0 18m
vmi-system-kibana-6cd469b9b7-2xqrm 3/3 Running 0 18m
vmi-system-prometheus-0-5f7fd8cd9c-7f7k5 4/4 Running 0 13m
weblogic-operator-f46cb6fd4-thhp4 2/2 Running 0 17m
登記所管理的Kubernetes集群
在这里,我们将注册要管理的Kubernetes集群(本次是OKE集群)。
在Verrazzano中,多Kubernetes集群配置的示意如下。
(本次,托管集群只有一个)

事前准备
为了方便操作多个Kubernetes集群,我们会做一些小小的改进。
首先,确认已在kubeconfig中注册的集群。
kubectl config get-contexts -o=name
比如,它可以输出如下所示的结果。
context-c2xd2htprdq
context-c4477dr5lca
我希望在这次我的环境中,进行以下的设定。
-
- context-c2xd2htprdq:Adminクラスタ
- context-c4477dr5lca:管理対象クラスタ
为了使后续步骤更加清晰易懂,我们会添加环境变量。
export KUBECONTEXT_ADMIN=context-c2xd2htprdq
export KUBECONTEXT_MANAGED=context-c4477dr5lca
通过这样,您可以访问如下所示。
- Adminクラスタ
kubectl --context $KUBECONTEXT_ADMIN get pods
- 管理対象クラスタ
kubectl --context $KUBECONTEXT_MANAGED get pods
现在,准备工作已经完成了。
安装 Verrazzano 到管理对象集群
在这里,我们将使用managed-cluster配置文件在受管理的集群中安装Verrazzano。
除了指定配置文件外,安装步骤与Admin集群相同。
kubectl --context $KUBECONTEXT_MANAGED apply -f https://github.com/verrazzano/verrazzano/releases/download/v1.0.3/operator.yaml
kubectl --context $KUBECONTEXT_MANAGED apply -f - <<EOF
apiVersion: install.verrazzano.io/v1alpha1
kind: Verrazzano
metadata:
name: my-verrazzano
spec:
profile: managed-cluster
EOF
等待部署Verrazzano自定义资源。
kubectl --context $KUBECONTEXT_MANAGED get pods -n verrazzano-system -w
只要达到这个样子就没有问题。
与Admin集群相比,安装的组件稍有不同。
NAME READY STATUS RESTARTS AGE
coherence-operator-5cb8cd9f76-bdfkn 1/1 Running 1 4m35s
fluentd-ftfmm 2/2 Running 1 68s
fluentd-lrdnl 2/2 Running 1 115s
fluentd-tzf97 2/2 Running 1 32s
oam-kubernetes-runtime-56cdb56c98-c6nt4 1/1 Running 0 3m8s
verrazzano-api-646d446cc6-2p28d 2/2 Running 0 4m47s
verrazzano-application-operator-d57bd4f59-6jvs8 1/1 Running 0 2m47s
verrazzano-monitoring-operator-69cc594b9b-nk4lc 1/1 Running 0 4m47s
verrazzano-operator-585cdbcbcd-rhlqs 1/1 Running 0 4m47s
vmi-system-prometheus-0-c468974b5-gsdst 4/4 Running 0 2m55s
weblogic-operator-f46cb6fd4-4n9j9 2/2 Running 0 3m58s
这样一来,我们的准备工作就完成了。
准备管理目标Kubernetes集群的注册
在这里,我们将进行预先准备工作,将管理对象Kubernetes集群注册到Admin集群中。
首先,输出安装在受管制的Kubernetes集群中所需的注册证书。
kubectl --context $KUBECONTEXT_MANAGED \
-n verrazzano-system get secret system-tls -o jsonpath='{.data.ca\.crt}'
出于安全考虑,将显示以下结果(已屏蔽)。
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lRWjRMekFpMnJzODllL245RnFsbm~~~~~~~~~~~~~~~~
使用该证书,创建用于注册受管理服务器的清单。
MGD_CA_CERT=$(kubectl --context $KUBECONTEXT_MANAGED \
> get secret system-tls \
> -n verrazzano-system \
> -o jsonpath="{.data.ca\.crt}" | base64 --decode)
kubectl --context $KUBECONTEXT_MANAGED \
kubectl --context $KUBECONTEXT_MANAGED \
create secret generic "ca-secret-managed1" \
-n verrazzano-mc \
--from-literal=cacrt="$MGD_CA_CERT" \
--dry-run=client \
-o yaml > managed1.yaml
如果没有问题的话,将会输出一个名为”managed1.yaml”的Manifest文件。
将生成的Manifest文件注册到Admin集群中。
kubectl --context $KUBECONTEXT_ADMIN \
apply -f managed1.yaml
接下来,将获取Admin集群的API服务器的IP地址。
kubectl --context $KUBECONTEXT_ADMIN config view --minify
将按以下方式输出。
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://xxx.xxx.xxx.xxx:6443
name: cluster-c2xd2htprdq
contexts:
-------
https://xxx.xxx.xxx.xxx:6443的部分是Admin集群API服务器的IP地址。
将其设为环境变量。
export ADMIN_K8S_SERVER_ADDRESS=https://xxx.xxx.xxx.xxx:6443
最后,在Admin集群中创建包含上述IP地址的ConfigMap。
kubectl --context $KUBECONTEXT_ADMIN \
apply -f <<EOF -
apiVersion: v1
kind: ConfigMap
metadata:
name: verrazzano-admin-cluster
namespace: verrazzano-mc
data:
server: "${ADMIN_K8S_SERVER_ADDRESS}"
EOF
现在,管理Kubernetes集群的注册预备工作已经完成。
注册受管理的Kubernetes集群
在这里,我们终于要进行管理目标Kubernetes集群的注册。
注册步骤分为管理员集群和管理目标集群分别进行。
在Admin集群中的步骤
在Admin集群中创建VerrazzanoManagedCluster资源。
kubectl --context $KUBECONTEXT_ADMIN \
apply -f <<EOF -
apiVersion: clusters.verrazzano.io/v1alpha1
kind: VerrazzanoManagedCluster
metadata:
name: managed1
namespace: verrazzano-mc
spec:
description: "Test VerrazzanoManagedCluster object"
caSecret: ca-secret-managed1
EOF
等待VerrazzanoManagedCluster资源的部署完成。
kubectl --context $KUBECONTEXT_ADMIN \
wait --for=condition=Ready \
vmc managed1 -n verrazzano-mc
最后,我们将导出已创建的Manifest文件,用于注册管理的集群。
kubectl --context $KUBECONTEXT_ADMIN \
get secret verrazzano-cluster-managed1-manifest \
-n verrazzano-mc \
-o jsonpath={.data.yaml} | base64 --decode > register.yaml
在管理目标集群中的步骤。
在管理的集群中,只需要应用刚刚输出的Manifest文件。
kubectl --context $KUBECONTEXT_MANAGED apply -f register.yaml
现在,管理对象集群的注册已经完成了!
确认已注册管理目标集群
最后,我们会确认管理目标群集已成功注册。
由于Verrazzano配备了名为Verrazzano UI的控制台界面,我们将使用它来进行确认。
在安装Verrazzano之后,请访问安装完成后确认的Verrazzano控制台的URL。
当您登录控制台时,会要求您提供用户名和密码,具体如下所示:
-
- ユーザ名:verrazzano
- パスワード:kubectl get secret –namespace verrazzano-system verrazzano -o jsonpath={.data.password} | base64 –decode; echoの出力結果
当您登录后,将显示如下的界面。
点击左侧菜单中的”Cluster”。

如果名为managed1的管理集群处于Running状态,则表示成功注册。

顺便说一下,我也会检查一下Rancher。
在Verrazzano安装完成后,访问您确认的Rancher URL。
在登录控制台时,将要求输入用户名和密码,具体如下。
ユーザ名:admin
パスワード:kubectl get secret –namespace cattle-system rancher-admin-secret -o jsonpath={.data.password} | base64 –decode; echoの出力結果
登入后会显示以下屏幕。

本地是Admin集群,managed1是受管理的集群。
通过使用Rancher,您也可以对Admin集群/受管理的集群进行操作。
总结
这次,我们尝试在Verrazzano上构建多个Kubernetes群集管理的环境。
因为仅仅有这个可能有些无聊,所以下一篇文章中我打算展示一些在这次多集群环境中部署的样例应用程序。
参考文章