部署到 Linux/Windows Kubernetes 的混合集群

如何在 Kubernetes 上运行带有 Windows 节点的 Dapr 应用

Dapr 支持在带有 windows 节点的 kubernetes 集群上运行。 您可以只在 Windows 上运行您的 Dapr 微服务,或只在 Linux 上运行,或者两者兼而有之。 这对那些可能会将遗留应用零散迁移到 Dapr Kubernetes 集群的用户很有帮助。

Kubernetes 使用了一个叫做节点亲和性的概念,这样你就可以表示你的应用是想在 Linux 节点还是 Windows 节点上启动。 当部署到一个同时拥有 Windows 和 Linux 节点的集群时,你必须为你的应用提供亲和性规则,否则 Kubernetes 调度器可能会在错误的节点类型上启动你的应用。

前提

您需要一个带有Windows节点的 Kubernetes 集群。 许多 Kubernetes 提供商支持自动配置启用 Windows 的 Kubernetes 集群。

  1. 按照您的首选提供商的说明来设置一个带有Windows功能的集群。
  1. 一旦你设置了集群,你应该看到它同时有 Windows 和 Linux 节点可用

    1. kubectl get nodes -o wide
    2. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
    3. aks-nodepool1-11819434-vmss000000 Ready agent 6d v1.17.9 10.240.0.4 <none> Ubuntu 16.04.6 LTS 4.15.0-1092-azure docker://3.0.10+azure
    4. aks-nodepool1-11819434-vmss000001 Ready agent 6d v1.17.9 10.240.0.35 <none> Ubuntu 16.04.6 LTS 4.15.0-1092-azure docker://3.0.10+azure
    5. aks-nodepool1-11819434-vmss000002 Ready agent 5d10h v1.17.9 10.240.0.129 <none> Ubuntu 16.04.6 LTS 4.15.0-1092-azure docker://3.0.10+azure
    6. akswin000000 Ready agent 6d v1.17.9 10.240.0.66 <none> Windows Server 2019 Datacenter 10.0.17763.1339 docker://19.3.5
    7. akswin000001 Ready agent 6d v1.17.9 10.240.0.97 <none> Windows Server 2019 Datacenter 10.0.17763.1339 docker://19.3.5

安装 Dapr 控制面板

如果您正在使用 Dapr CLI 或通过 Helm Chart 安装, 只需遵循正常的部署程序: 在 Kubernetes 集群上安装 Dapr

关联性将被自动设置为 kubernetes.io/os=linux。 这对于大多数用户来说是足够的,因为Kubernetes至少需要一个Linux节点池。

注意: Dapr 控制面板容器是为windows和linux构建和测试的,但是,我们一般建议使用linux 控制面板容器。 它们往往较小,用户基础也大得多。

如果您理解以上内容,但想要将 Dapr 控制面板部署到Windows,您可以通过设置这样做:

  1. helm install dapr dapr/dapr --set global.daprControlPlaneOs=windows

安装 Dapr 应用程序

Windows 应用程序

为了在 Windows 上启动 Dapr 应用程序,您需要首先创建一个安装应用程序的 Docker 容器。 指南见 开始:为容器准备 Windows。 一旦你拥有一个带有应用程序的Docker container,创建一个 deployment YAML 文件,节点亲和性设置为 kubernetes.io/os: windows。

  1. 创建一个 deployment YAML

    这里是一个示例 deployment ,节点关联性设置为“windows”。 根据您的应用程序的需要修改。

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: yourwinapp
    5. labels:
    6. app: applabel
    7. spec:
    8. replicas: 1
    9. selector:
    10. matchLabels:
    11. app: applablel
    12. template:
    13. metadata:
    14. labels:
    15. app: applabel
    16. annotations:
    17. dapr.io/enabled: "true"
    18. dapr.io/id: "addapp"
    19. dapr.io/port: "6000"
    20. dapr.io/config: "appconfig"
    21. spec:
    22. containers:
    23. - name: add
    24. image: yourreponsitory/your-windows-dapr-container:your-tag
    25. ports:
    26. - containerPort: 6000
    27. imagePullPolicy: Always
    28. affinity:
    29. nodeAffinity:
    30. requiredDuringSchedulingIgnoredDuringExecution:
    31. nodeSelectorTerms:
    32. - matchExpressions:
    33. - key: kubernetes.io/os
    34. operator: In
    35. values:
    36. - windows

    这个 deployment yaml 将与任何其它的 dapr 应用程序相同,还有一个额外的 spec.template.spec.affinity 部分如上文所示。

  2. 部署到您的 Kubernetes 集群

    1. kubectl apply -f deploy_windows.yaml

Linux 应用程序

如果您已经在 Linux 上有运行的 dapr 应用程序, 您仍然需要像以上添加亲和性规则,只不过要选择 linux 亲和性。

  1. 创建一个 deployment YAML

    这里是一个示例 deployment,节点亲和性设置为“linux”。 根据您的应用程序的需要修改。

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: yourlinuxapp
    5. labels:
    6. app: yourlabel
    7. spec:
    8. replicas: 1
    9. selector:
    10. matchLabels:
    11. app: yourlabel
    12. template:
    13. metadata:
    14. labels:
    15. app: yourlabel
    16. annotations:
    17. dapr.io/enabled: "true"
    18. dapr.io/id: "addapp"
    19. dapr.io/port: "6000"
    20. dapr.io/config: "appconfig"
    21. spec:
    22. containers:
    23. - name: add
    24. image: yourreponsitory/your-application:your-tag
    25. ports:
    26. - containerPort: 6000
    27. imagePullPolicy: Always
    28. affinity:
    29. nodeAffinity:
    30. requiredDuringSchedulingIgnoredDuringExecution:
    31. nodeSelectorTerms:
    32. - matchExpressions:
    33. - key: kubernetes.io/os
    34. operator: In
    35. values:
    36. - linux
  2. 部署到您的 Kubernetes 集群

    1. kubectl apply -f deploy_linux.yaml

清理

  1. kubectl delete -f deploy_linux.yaml
  2. kubectl delete -f deploy_windows.yaml
  3. helm uninstall dapr

相关链接