云边协同下的统一应用管理: 基于OpenYurt和KubeVela的解决方案
背景
Cloud Native
OpenYurt 与 KubeVela 结合
能解决什么问题?
Cloud Native
NodeSelector
可以指示 Kubernetes 调度器将工作负载调度到不同的节点池。将应用部署到边缘
Cloud Native
Demo 的基础环境
节点 1:master 节点,云端节点 节点 2:worker 节点,边缘节点,在节点池 beijing
中节点 3:worker 节点,边缘节点,在节点池 shanghai
中
准备工作
YurtAppManager 是 OpenYurt 的核心组件。它提供节点池 CRD 和控制器。OpenYurt 中还有其他组件,但在本教程中我们只需要 YurtAppManager.
git clone https://github.com/openyurtio/yurt-app-managercd yurt-app-manager && helm install yurt-app-manager -n kube-system ./charts/yurt-app-manager/
curl -fsSl https://kubevela.net/script/install.sh | bash
vela install
vela addon enable fluxcd
kubectl apply -f - <<EOF
apiVersion: apps.openyurt.io/v1beta1
kind: NodePool
metadata:
name: beijing
spec:
type: Edge
annotations:
test-beijing :
taints:
key: apps.openyurt.io/example
value: beijing
effect: NoSchedule
---
apiVersion: apps.openyurt.io/v1beta1
kind: NodePool
metadata:
name: shanghai
spec:
type: Edge
annotations:
test-shanghai :
taints:
key: apps.openyurt.io/example
value: shanghai
effect: NoSchedule
EOF
kubectl label node <node1> apps.openyurt.io/desired-nodepool=beijing
kubectl label node <node2> apps.openyurt.io/desired-nodepool=shanghai
kubectl get nodepool
NAME TYPE READYNODES NOTREADYNODES AGE
beijing Edge 1 0 6m2s
shanghai Edge 1 0 6m1s
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: edge-ingress
spec:
components:
name: ingress-nginx
type: helm
properties:
chart: ingress-nginx
url: https://kubernetes.github.io/ingress-nginx
repoType: helm
version: 4.3.0
values:
controller:
service:
type: NodePort
admissionWebhooks:
enabled: false
traits:
type: edge-nginx
policies:
name: replication
type: replication
properties:
selector: [ "ingress-nginx" ]
keys: [ "beijing","shanghai" ]
workflow:
steps:
name: deploy
type: deploy
properties:
policies: ["replication"]
helm
类型组件。它描述了我们想要安装到集群的 Helm 包版本。此外,我们给这个组件附加了一个运维特征(trait) edge-nginx
。我们稍后将展示这个运维特征的具体情况,现在你可以将其视为一个包含不同节点池的属性的补丁。replication
(组件分裂)策略。它描述了如何将组件复制到不同的节点池。该 selector
字段用于选择需要复制的组件。它的 keys
字段将把一个组件转换为具有不同 key 的两个组件。(“beijing”和“shanghai”)deploy
工作流步骤。它描述了如何部署应用程序。它指定 replication
策略执行复制工作的策略。注意:
如果你希望此应用程序正常工作,请先在集群下发在下文介绍的 edge-ingress
特性。deploy
是一个 KubeVela 内置的工作流程步骤。它还可以在多集群场景[2]中与override
、topology
策略一起使用 。
vela up -f app.yaml
vela status edge-ingress --tree --detail
CLUSTER NAMESPACE RESOURCE STATUS APPLY_TIME DETAIL
local ─── default─┬─ HelmRelease/ingress-nginx-beijing updated 2022-11-02 12:00:24 Ready: True Status: Release reconciliation succeeded Age: 153m
├─ HelmRelease/ingress-nginx-shanghai updated 2022-11-02 12:00:24 Ready: True Status: Release reconciliation succeeded Age: 153m
└─ HelmRepository/ingress-nginx updated 2022-11-02 12:00:24 URL: https://kubernetes.github.io/ingress-nginx Age: 153m
Ready: True
Status: stored artifact for revision '7bce426c58aee962d479ca84e5c
fc6931c19c8995e31638668cb958d4a3486c2'
vela logs
把打印应用的日志;可以通过 vela port-forward
把部署应用的端口转发到本地;可以通过 vela exec
命令,深入到边缘的容器中执行 Shell 命令排查问题。vela addon enable velaux
HelmRelease
资源,把 Nginx Ingress Controller 的 Helm Chart 交付到两个节点池。 HelmRelease
资源被上述 FluxCD 插件处理并在集群两个节点池中分别安装了 Nginx Ingress。通过以下命令,检查是否在北京节点池中创建了 Ingress Controller 的 Pod,上海节点池同理。kubectl get node -l apps.openyurt.io/nodepool=beijing
NAME STATUS ROLES AGE VERSION
iz0xi0r2pe51he3z8pz1ekz Ready <none> 23h v1.24.7+k3s1
kubectl get pod ingress-nginx-beijing-controller-c4c7cbf64-xthlp -oyaml|grep iz0xi0r2pe51he3z8pz1ekz
nodeName: iz0xi0r2pe51he3z8pz1ekz
edge-nginx Trait
。组件分裂 Policy 将组件拆为两个组件,带有不同的 context.replicaKey
。
edge-nginx
Trait 使用不同的context.replicaKey
,将带有不同配置值的 Helm Chart 交付到集群中。让两个 Nginx Ingress Controller 运行在不同的节点池,监听具有不同 ingressClass 的 Ingress 资源。具体的方式是 Patch 了 Helm Chart 的 Values 配置,修改了和节点选择、亲和性以及 ingressClass 相关的字段。
在 Patch 不同字段时,使用了不同的 Patch 策略[4](PatchStrategy),例如使用 retainKeys
策略能够覆盖原本的值,使用jsonMergePatch
策略则会和原本的值合并。
{ :
type: "trait"
annotations: {}
attributes: {
podDisruptive: true
appliesToWorkloads: ["helm"]
}
}
template: {
patch: {
+patchStrategy=retainKeys
metadata: {
name: "\(context.name)-\(context.replicaKey)"
}
+patchStrategy=jsonMergePatch
spec: values: {
ingressClassByName: true
controller: {
ingressClassResource: {
name: "nginx-" + context.replicaKey
controllerValue: "openyurt.io/" + context.replicaKey
}
_selector
}
defaultBackend: {
_selector
}
}
}
_selector: {
tolerations: [
{
key: "apps.openyurt.io/example"
operator: "Equal"
value: context.replicaKey
},
]
nodeSelector: {
context.replicaKey :
}
}
parameter: null
}
{ :
type: "trait"
annotations: {}
attributes: {
podDisruptive: true
appliesToWorkloads: ["helm"]
}
}
template: {
patch: {
+patchStrategy=retainKeys
metadata: {
name: "\(context.name)-\(context.replicaKey)"
}
+patchStrategy=jsonMergePatch
spec: values: {
_selector
fullnameOverride: "nginx-gateway-nginx-" + context.replicaKey
gatewayClass: {
name: "nginx" + context.replicaKey
controllerName: "k8s-gateway-nginx.nginx.org/nginx-gateway-nginx-controller-" + context.replicaKey
}
}
}
_selector: {
tolerations: [
{
key: "apps.openyurt.io/example"
operator: "Equal"
value: context.replicaKey
},
]
nodeSelector: {
context.replicaKey :
}
}
parameter: null
}
KubeVela 如何解决了边缘部署难题
Cloud Native
项目代码库:https://github.com/kubevela/kubevela 欢迎 Star/Watch/Fork! 项目官方主页与文档:kubevela.io ,从 1.1 版本开始,已提供中文、英文文档,更多语言文档欢迎开发者进行翻译。
扫描下方二维码
抽开源中国周边啦~
往期推荐
整活大师ChatGPT:实现编程语言、构建虚拟机……
ChatGPT 5天用户破百万,却突遭Stack Overflow禁用
AWS:.NET开源资金严重不足,但我会出手
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦~
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章