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

启动一个 hello world 应用程序

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

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集群有这个命名空间没

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 将向命名空间名称添加后缀,以使其在远程集群上唯一

liqoctl offload namespace liqo-demo

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

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

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

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 正在本地运行;而另一个由虚拟节点托管

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 地址

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

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从集群内部运行:

kubectl run --image=curlimages/curl curl -n default -it --rm --restart=Never -- \
    curl --silent liqo-demo.liqo-demo.svc.cluster.local | grep 'Server'
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 值发生变化)。

删除资源

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

卸载命名空间

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

liqoctl unoffload namespace liqo-demo

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

撤销对等互连

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

liqoctl unpeer out-of-band milan

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

卸载Liqo

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

liqoctl uninstall
liqoctl uninstall --kubeconfig="$KUBECONFIG_MILAN"

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

liqoctl uninstall --purge
liqoctl uninstall --purge --kubeconfig="$KUBECONFIG_MILAN"

摧毁集群

要拆卸 KindD 集群,您可以:

kind delete cluster --name rome
kind delete cluster --name milan
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐