liqo-k8s,kubernetes多集群互联,在单集群场景中一样在多集群环境中部署标准 Kubernetes 应用程序
介绍了怎么在本地用kind安装了两套集群,以及完成了集群的对等互联,现在我们来部署服务。
上篇介绍了怎么在本地用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 address:</span> <span>10.200.1.26:80</span></p>
<p><span>Server 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 address:</span> <span>10.200.1.26:80</span></p>
<p><span>Server 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 address:</span> <span>10.200.1.21:80</span></p>
<p><span>Server 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
现在您可以使用liqoctl从集群中卸载 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
更多推荐
所有评论(0)