liqo-k8s,kubernetes多集群互联,在单集群场景中一样在多集群环境中部署标准 Kubernetes 应用程序

上篇介绍了怎么在本地用kind安装了两套集群,以及完成了集群的对等互联,现在我们来部署服务。

启动一个 hello world 应用程序

如果您想要部署调度到 Liqo 虚拟节点上的应用程序,您应该首先创建一个将启动 pod 的命名空间。然后告诉 Liqo 使该命名空间符合 pod 卸载的条件

bash 复制代码
root@liqo:~/liqo# kubectl create namespace liqo-demo
namespace/liqo-demo created
root@liqo:~/liqo# kubectl get namespace
NAME                       STATUS   AGE
default                    Active   151m
kube-node-lease            Active   151m
kube-public                Active   151m
kube-system                Active   151m
liqo                       Active   61m
liqo-demo                  Active   75s
liqo-storage               Active   61m
liqo-tenant-milan-c31b24   Active   18m
local-path-storage         Active   151m

看下milan集群有这个命名空间没

bash 复制代码
oot@liqo:~/liqo# kubectl get namespace --kubeconfig "$KUBECONFIG_MILAN"
NAME                      STATUS   AGE
default                   Active   151m
kube-node-lease           Active   151m
kube-public               Active   151m
kube-system               Active   151m
liqo                      Active   26m
liqo-storage              Active   25m
liqo-tenant-rome-d114d7   Active   19m
local-path-storage        Active   151m

没有,用这个命令将命名空间卸载到远程集群,由于没有提供进一步的配置,Liqo 将向命名空间名称添加后缀,以使其在远程集群上唯一

bash 复制代码
liqoctl offload namespace liqo-demo

再看看,有了liqo-demo-rome-d114d7

bash 复制代码
root@liqo:~/liqo# kubectl get namespace --kubeconfig "$KUBECONFIG_MILAN"
NAME                      STATUS   AGE
default                   Active   151m
kube-node-lease           Active   151m
kube-public               Active   151m
kube-system               Active   151m
liqo                      Active   26m
liqo-demo-rome-d114d7     Active   2s
liqo-storage              Active   26m
liqo-tenant-rome-d114d7   Active   19m
local-path-storage        Active   151m

然后,您可以在本地集群的命名空间中部署演示应用程序:

bash 复制代码
root@liqo:~/liqo/examples/quick-start# kubectl apply -f ./manifests/hello-world.yaml -n liqo-demo
pod/nginx-local created
pod/nginx-remote created
service/liqo-demo created

该hello-world.yaml文件代表一个简单的nginx服务。它包含两个运行nginx镜像的 Pod和一个将 Pod 暴露给集群的服务。一个 pod 运行在本地集群中,而另一个 pod 则被迫调度到远程集群上

现在您可以检查 Pod 的状态。输出应类似于以下内容,确认有一个nginxpod 正在本地运行;而另一个由虚拟节点托管

bash 复制代码
root@liqo:~/liqo/examples/quick-start# kubectl get pod -n liqo-demo -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
nginx-local    1/1     Running   0          27s   10.200.1.26   rome-worker   <none>           <none>
nginx-remote   1/1     Running   0          27s   10.202.1.21   liqo-milan    <none>           <none>

与传统示例不同,上述部署引入了亲和性约束。这迫使 Kubernetes 将第一个 pod调度nginx-local到物理节点上,将第二个

pod(即nginx-remote)调度到虚拟节点上。虚拟节点与传统的 Kubernetes

节点类似,但它们代表远程集群并具有标签。liqo.io/type: virtual-node

当未指定亲和力约束时,Kubernetes 调度程序会根据可用资源选择最佳托管节点。因此,每个 Pod

都可以在本地集群或远程集群中进行调度。

检查 Pod 连接性

一旦两个 pod 都正确运行,就可以检查 Liqo 引入的抽象之一。事实上,Liqo 使每个 Pod 能够与其他所有 Pod 和物理节点(根据 Kubernetes 模型)透明地联系,无论它是由本地集群还是远程集群托管。

首先,让我们检索 pod 的 IP 地址

bash 复制代码
LOCAL_POD_IP=$(kubectl get pod nginx-local -n liqo-demo --template={{.status.podIP}})
REMOTE_POD_IP=$(kubectl get pod nginx-remote -n liqo-demo --template={{.status.podIP}})
echo "Local Pod IP: ${LOCAL_POD_IP} - Remote Pod IP: ${REMOTE_POD_IP}"

无论每个 Pod 是在本地还是远程执行,这两个命令都应该产生成功的结果(即返回演示网页)。

通过 Service 公开 pod

上面的hello-world.yaml清单还创建了一个服务,旨在为之前部署的 Pod 提供流量。这是传统的Kubernetes 服务,无需修改即可与 Liqo 配合使用。

事实上,通过检查服务,可以观察到两个nginxpod 都被正确指定为端点。尽管如此,值得注意的是,第一个端点(即本例中)指的是本地10.200.1.26:80集群中运行的 Pod ,而第二个端点(即)指向远程集群托管的 Pod。10.202.1.21:80

bash 复制代码
root@liqo:~/liqo/examples/quick-start# kubectl describe service liqo-demo -n liqo-demo
Name:              liqo-demo
Namespace:         liqo-demo
Labels:            <none>
Annotations:       <none>
Selector:          app=liqo-demo
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.94.39.254
IPs:               10.94.39.254
Port:              web  80/TCP
TargetPort:        web/TCP
Endpoints:         10.200.1.26:80,10.202.1.21:80
Session Affinity:  None
Events:
  Type    Reason                Age                From                     Message
  ----    ------                ----               ----                     -------
  Normal  SuccessfulReflection  35m (x2 over 35m)  liqo-service-reflection  Successfully reflected object to cluster "milan"

检查服务连接性

现在可以联系服务了:像往常一样,Kubernetes 会将 HTTP 请求转发到可用的后端 Pod 之一。此外,即使其中一个 Pod 实际上在远程集群中运行,所有传统机制仍然可以无缝运行(例如 DNS 发现)。

您可以启动 pod 并curl从集群内部运行:

bash 复制代码
kubectl run --image=curlimages/curl curl -n default -it --rm --restart=Never -- \
    curl --silent liqo-demo.liqo-demo.svc.cluster.local | grep 'Server'
bash 复制代码
root@liqo:~/liqo/examples/quick-start# kubectl run --image=curlimages/curl curl -n default -it --rm --restart=Never -- \
>     curl --silent liqo-demo.liqo-demo.svc.cluster.local | grep 'Server'
<p><span>Server&nbsp;address:</span> <span>10.200.1.26:80</span></p>
<p><span>Server&nbsp;name:</span> <span>nginx-local</span></p>
root@liqo:~/liqo/examples/quick-start# kubectl run --image=curlimages/curl curl -n default -it --rm --restart=Never --     curl --silent liqo-demo.liqo-demo.svc.cluster.local | grep 'Server'
<p><span>Server&nbsp;address:</span> <span>10.200.1.26:80</span></p>
<p><span>Server&nbsp;name:</span> <span>nginx-local</span></p>
root@liqo:~/liqo/examples/quick-start# kubectl run --image=curlimages/curl curl -n default -it --rm --restart=Never --     curl --silent liqo-demo.liqo-demo.svc.cluster.local | grep 'Server'
<p><span>Server&nbsp;address:</span> <span>10.200.1.21:80</span></p>
<p><span>Server&nbsp;name:</span> <span>nginx-remote</span></p>
root@liqo:~/liqo/examples/quick-start# 

多次执行前面的命令,您会发现部分请求由本地集群中运行的 pod 响应,部分请求由远程集群中的 pod 响应(即 Server 值发生变化)。

删除资源

我们的例子已经完成了;现在我们可以删除所有创建的资源

卸载命名空间

在开始卸载过程之前,请确保所有命名空间均已卸载:

bash 复制代码
liqoctl unoffload namespace liqo-demo

卸载到远程集群的每个 Pod 都将被重新调度到本地集群。

撤销对等互连

同样,确保所有对等互连均已撤销:

bash 复制代码
liqoctl unpeer out-of-band milan

在该过程结束时,虚拟节点将从本地集群中删除。

卸载Liqo

现在您可以使用liqoc​​tl从集群中卸载 Liqo :

bash 复制代码
liqoctl uninstall
liqoctl uninstall --kubeconfig="$KUBECONFIG_MILAN"

默认情况下,Liqo CRD 将保留在集群中,但可以使用以下标志将其删除--purge:

bash 复制代码
liqoctl uninstall --purge
liqoctl uninstall --purge --kubeconfig="$KUBECONFIG_MILAN"

摧毁集群

要拆卸 KindD 集群,您可以:

bash 复制代码
kind delete cluster --name rome
kind delete cluster --name milan
相关推荐
木风小助理5 小时前
PostgreSQL 的范式跃迁:从关系型数据库到统一数据平台
服务器·云原生·kubernetes
阿里云云原生5 小时前
ECS 端口不通,丢包诊断看这里!阿里云 SysOM 智能诊断实战!
云原生
阿里云云原生7 小时前
从这张年度技术力量榜单里,看见阿里云从云原生到 AI 原生的进化能力和决心
云原生
阿里云云原生7 小时前
2025 智能体工程现状
云原生·llm
是一个Bug8 小时前
云原生架构
云原生·架构
BUTCHER512 小时前
【漏洞扫描】ZooKeeper 未授权访问
分布式·zookeeper·云原生
企鹅侠客12 小时前
探索Kubernetes的ServiceAccounts
云原生·容器·kubernetes
虫小宝13 小时前
淘客app容器化部署方案:Docker与Kubernetes在返利系统中的实践
docker·容器·kubernetes
bs_10113 小时前
k8s工作运维中常用命令
运维·容器·kubernetes
虫小宝13 小时前
电商返利APP容器编排实践:K8s在多环境部署中的资源调度优化
云原生·容器·kubernetes