背景

接上一篇 Windows 应用容器 后,想要快速且便利的部署与管理它们,可以借助容器编排工具。对于 Windows 容器,在今天 Service Fabric 会是个更为成熟的选择,在业界有更多的实践案例。笔者未来可能会写几篇关于如何使用 Service Fabric 来实现 Windows 平台下的微服务实践。此次我们接着上篇的内容往下去快速搭建 Windows Kubernetes 环境。

ACS-Engine

Azure 团队为容器编排引擎提供了一个开源的部署工具 acs-engine , 它可以支持在 Azure 上快速部署 Swarm、DC\OS、 Kubernetes 集群,同时具备扩缩 Worker 节点、升级等等。这套工具的大体思路是,利用 Azure Infrastructure 服务的可描述性,声明计算 、存储、网络等服务,同时实现 Kubernetes 与 Azure 整合,从而达到利用一个工具快速部署管理 Kubernetes。和我们使用 Terraform 类似,只是 acs-engine 是一个和 Azure 集成更为紧密的一个工具,使得这个 Kubernetes 可以利用 Azure CNI 、LoadBalancer 以及云磁盘存储以及云文件存储。下图来源于 ACS-engine 官方说明:再提一提 Azure CNI,它是由 Azure 团队针基于 CNI 实现的容器网络技术,利用 Azure SDN 的能力,使得容器网络可以连接 Azure VNET。因此使用 Azure CNI 可以:

  • Kubernetes 的容器网络和 Azure VNet 在一个平面之上,不需要有 Overlay。
  • 同一 Azure VNet 下的虚机也可以直接与 Kubernetes 容器互通,不需要经过负载经衡器。这个可以解决我们在微服务场景下, K8S 里的容器要与 此K8S 集群之外的服务实例之间的通讯,例如我们有 dubbo 或 spring cloud 混合部署的场景。
  • 在网络传输效率和资源消耗上会比自己在 Azure 上搭一套使用 Flannel 的 Kubernetes 要好,按照笔者的测试能提升 20%~30%。

对于 acs-engine 除了能支持原生 Kubernetes 具备的特性,更多特性可以参考 [6] , 当然能也能支持 GPU 的机器

前提

步骤

  • 通过 Azure CLI 登录 Azure 中国,并且生成一个 Contributor 的操作身份给后续部署 K8S 时建立相关资源使用
  1. az cloud set --name AzureChinaCloud
  2. az login
  3. az account set --subscription="${SUBSCRIPTION_ID}"
  4. #下一行命令会生成一个 service principal, 需要记录 appId 以及 password 留做后续使用
  5. az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"
  • 准备 acs-engine 的集群部署描述文件, 由于 json 文件不包含注释的语法,为了能更好的理解下面的某些字段信息,我还是用 # 作为注释符用于解释。当实际操作时请删除相关 # 行目。
  1. {
  2. "apiVersion": "vlabs",
  3. # 部署区域
  4. "location": "chinanorth2",
  5. "properties": {
  6. "orchestratorProfile": {
  7. #指定编排引擎类型为 kubernetes
  8. "orchestratorType": "Kubernetes",
  9. # 指定版本
  10. "orchestratorRelease": "1.11",
  11. "kubernetesConfig": {
  12. # 该 kubernetes 集群将激活 rbac
  13. "enableRbac": true,
  14. # 该 kubernetes 集群将使用 Azure CNI 作为容器网络实现
  15. "networkPolicy": "azure"
  16. }
  17. },
  18. #指定 master 节点信息
  19. "masterProfile": {
  20. # 此处为 1 个 master 节点,也可以声明为 3, 或者其奇数
  21. "count": 1,
  22. # 给定一个 DNS 前缀,用于声明此 K8S 服务在 azure 中国北二区的子域名。例如此处为: burn-k8s-11.chinanorth2.cloudapp.chinacloudapi.cn
  23. "dnsPrefix": "burn-k8s-11",
  24. # master 节点的型号
  25. "vmSize": "Standard_D3_v2"
  26. },
  27. # 指定 Node 节点列表,可以声明多个, 不同机型分别是多少台,分别用什么操作系统。包括使用可用性集来做高可用性保证,也能使用虚机扩展集
  28. "agentPoolProfiles": [
  29. {
  30. "name": "windowspool2",
  31. "count": 3,
  32. "vmSize": "Standard_D3_v2",
  33. "availabilityProfile": "AvailabilitySet",
  34. "osType": "Windows"
  35. }
  36. ],
  37. # 在 Windows Kubernetes 的环境里需要 master 仍为 Linux, 在 masterProfile 中未声明使用什么 OS, 默认是 Linux
  38. "linuxProfile": {
  39. #虚机登录用户名
  40. "adminUsername": "zhaw",
  41. "ssh": {
  42. "publicKeys": [
  43. {
  44. # 虚机登录使用的公钥
  45. "keyData": "ssh-rsa XXX"
  46. }
  47. ]
  48. }
  49. },
  50. # node 节点使用的 windows 登陆信息
  51. "windowsProfile": {
  52. "adminUsername": "azureuser",
  53. "adminPassword": "XXX",
  54. "windowsPublisher": "MicrosoftWindowsServer",
  55. "windowsOffer": "WindowsServerSemiAnnual",
  56. "windowsSku": "Datacenter-Core-1803-with-Containers-smalldisk"
  57. },
  58. "servicePrincipalProfile": {
  59. #前面生成 service principal 的 appID
  60. "clientId": "XXX",
  61. #前面生成 service principal 的 password
  62. "secret": "XXX"
  63. }
  64. }
  65. }
  • 使用 acs-engine 根据上述描述文件生成 ARM 的部署文件
  1. # 下面的命令将生成文件目录: _output/<dns_prefix>
  2. acs-engine generate kubernetes.json
  • output/<dnsprefix>/kubeconfig 目录下会生成连接到此 k8s 的 kubeconfig 文件,我们只需要在本地安装 kubectl 就可以操作此集群,不需要连到 Master 节点上操作
  • 通过 azure CLI 创建一个资源管理库并在其中部署出 k8s
  1. # 进入到生成的文件目录
  2. cd _output/<dns_prefix>
  3. # 创建资源管理库
  4. az group create --name <GROUP_NAME> --location chinanorth2
  5. # 部署 k8s
  6. az group deployment create -g <GROUP_NAME> --template-file azuredeploy.json --parameters azuredeploy.parameters.json --verbose
  • 部署完毕以后可以查看节点信息
  1. $ kubectl --kubeconfig=kubeconfig.chinanorth2.json get node --show-labels
  2. NAME STATUS ROLES AGE VERSION LABELS
  3. 35598k8s9000 Ready <none> 1h v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D3_v2,beta.kubernetes.io/os=windows,failure-domain.beta.kubernetes.io/region=chinanorth2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=35598k8s9000
  4. 35598k8s9001 Ready <none> 1h v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D3_v2,beta.kubernetes.io/os=windows,failure-domain.beta.kubernetes.io/region=chinanorth2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=35598k8s9001
  5. 35598k8s9002 Ready <none> 1h v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D3_v2,beta.kubernetes.io/os=windows,failure-domain.beta.kubernetes.io/region=chinanorth2,failure-domain.beta.kubernetes.io/zone=1,kubernetes.io/hostname=35598k8s9002
  6. k8s-master-35598902-0 Ready master 1h v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D3_v2,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=chinanorth2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.azure.com/cluster=wink8s,kubernetes.io/hostname=k8s-master-35598902-0,kubernetes.io/role=master
  • 因为这个环境是一个 Linux 混合 windows 的集群,所以在部署 container 的时候需要指定节点类型,好在 acs-engine 部署出来的集群节点上携带操作系统相关的 label beta.kubernetes.io/os=windows ,我们可以通过 yaml 文件中使用 nodeSelector来指定节点信息
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: stdlogclientwin
  5. labels:
  6. app: stdlogclientwin
  7. spec:
  8. ports:
  9. - port: 80
  10. name: http
  11. selector:
  12. app: stdlogclientwin
  13. type: LoadBalancer
  14. ---
  15. apiVersion: extensions/v1beta1
  16. kind: Deployment
  17. metadata:
  18. name: stdlogclientwin
  19. spec:
  20. replicas: 1
  21. template:
  22. metadata:
  23. labels:
  24. app: stdlogclientwin
  25. version: v1
  26. spec:
  27. containers:
  28. - name: stdlogclientwin
  29. image: burning1docker/stdlogclientwin:1803
  30. imagePullPolicy: IfNotPresent
  31. ports:
  32. - containerPort: 80
  33. volumeMounts:
  34. - name: hostsdir
  35. mountPath: "C:/Windows/System32/drivers/etc"
  36. nodeSelector:
  37. beta.kubernetes.io/os: windows
  38. initContainers:
  39. - name: init
  40. image: microsoft/windowsservercore:1803
  41. command:
  42. - powershell
  43. - "Add-Content"
  44. - "-Path"
  45. - "C:/Windows/System32/drivers/etc/hosts"
  46. - "-Value"
  47. - "\"127.0.0.1 foo.local\""
  48. volumeMounts:
  49. - name: hostsdir
  50. mountPath: "C:/Windows/System32/drivers/etc"
  51. volumes:
  52. - name: hostsdir
  53. emptyDir: {}
  • 从上面的示例文件中,我们发现有一个通过 init container + emptyDir 来替换 hosts 的一个做法,在 Linux 下可以用 HostAliases来实现,目前 Kubernetes Windows 上还不支持。所以可以通过这种方式来实现。
  • 另外我们还发现节点还携带了关于可用性集相关的信息,所以我们还可以使用 pod anti-affinity 来把同一容器应用 Pod 平均部署到不同容错域,以防 Azure 物理故障时导致容器在某一时刻不可用,可参考如下示例:
  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: cpuloadv1
  5. spec:
  6. replicas: 3
  7. template:
  8. metadata:
  9. labels:
  10. app: cpuload
  11. version: v1
  12. spec:
  13. affinity:
  14. podAntiAffinity:
  15. preferredDuringSchedulingIgnoredDuringExecution:
  16. - weight: 100
  17. podAffinityTerm:
  18. labelSelector:
  19. matchExpressions:
  20. - key: app
  21. operator: In
  22. values:
  23. - cpuload
  24. topologyKey: failure-domain.beta.kubernetes.io/zone
  25. containers:
  26. - name: cpuload
  27. image: burning1docker/cpuload:V1
  28. imagePullPolicy: IfNotPresent
  29. ports:
  30. - containerPort: 8080
  31. resources:
  32. limits:
  33. cpu: "1"
  34. requests:
  35. cpu: 500m

提问

快速搭建 Windows Kubernetes的更多相关文章

  1. 快速搭建windows服务器的可视化运维环境

    开发好的程序部署在服务器上,如何对服务器的基本指标进行监控呢?最近对一套工具进行了研究,可以快速搭建服务器监管环境,很是强大,最重要的是它还很酷炫. 原理:数据采集+时序数据库+可视化,下面记录一下搭 ...

  2. centos7使用Minikube“快速搭建“出Kubernetes本地实验环境(踩坑集锦及解决方案)

    先决条件(先假设你做完这两步骤) 检查Linux是否支持虚拟化,验证输出是否为非空如何开启虚拟化 grep -E --color 'vmx|svm' /proc/cpuinfo 安装 kubectl ...

  3. 使用Topshelf快速搭建Windows服务

    1.创建控制台程序 2.安装Topshelf组件  Install-Package Topshelf using System; using System.Timers; using Topshelf ...

  4. 快速搭建多线程Windows服务解决方案

    一.引言 在软件开发过程中windows服务有的时候非常有用,用于同步数据,发送邮件,宿主WF引擎服务等,但是快速搭建一个好用多线程进行多任务处理的程序往往是一个项目必须考虑的问题.自己在项目中也经常 ...

  5. 使用 kind 快速搭建 kubernetes 环境

    使用 kind 快速搭建 Kubernetes 环境 Intro kind(Kubernetes IN Docker) 是一个基于 docker 构建 Kubernetes 集群的工具,非常适合用来在 ...

  6. WAMP Server助你在Windows上快速搭建PHP集成环境

    WAMP Server助你在Windows上快速搭建PHP集成环境 原文地址 我想只要爬过几天网的同学都会知道PHP吧,异次元的新版本就是基于PHP的WordPress程序制造出来的,还有国内绝大部分 ...

  7. windows 7 下快速搭建php环境(windows7+IIS7+php+mysql)

    原文:windows 7 下快速搭建php环境(windows7+IIS7+php+mysql) 1).采用理由: 优点:最大化的桌面图形化操作系统,可维护性优秀.基于IIS v6.0/v7.0(20 ...

  8. [Windows Azure] 使用 Windows Azure 快速搭建 Redis 服务器

    [Windows Azure] 使用 Windows Azure 快速搭建 Redis 服务器   Redis相信玩开源,大数据的朋友们并不陌生,大家最熟悉的使用者就是新浪微博,微博的整体数据缓存都是 ...

  9. windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)

    推荐几款一键快速搭建PHP本地运行环境的好工具(含php7.0及apache,nigix,mysql) 首推phpstudy2016和wampServer3.0.6     理由支持php7.0 目前 ...

随机推荐

  1. MVVM讲解

    一,MVVM理论知识 从上一篇文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通 ...

  2. js 动态操作元素

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  3. 数据绑定(九)Binding的数据校验

    原文:数据绑定(九)Binding的数据校验 Binding用ValidationRules属性来校验数据的有效性,ValidationRules属性类型是Collection<Validati ...

  4. 通过 vuex 实现 vue-echarts 图表的手动 resize

    背景:项目有用到 vue-echarts, 百度推出的 vue 版本的 Echarts,图表自带响应式属性 auto-resize, 来实现窗口尺寸变化时,图表的尺寸自适应,但是发现它是靠监听 win ...

  5. SDP开发平台试用版上线!提供源码!!!!

    SDP开发平台提供试用版!! SDP软件快速开发平台是一套面向对象的应用软件快速开发平台. 1.SDP 设计端--页面设计 通过简单的拖拉控件,或者快速生成控件,可以在几分钟快速制作一个页面:如图 通 ...

  6. Win8Metro(C#)数字图像处理--2.24二值图像闭运算

    原文:Win8Metro(C#)数字图像处理--2.24二值图像闭运算  [函数名称] 二值图像闭运算函数CloseOperateProcess(WriteableBitmap src) [算法说 ...

  7. C#基础加强篇----委托、Lamada表达式和事件(上)

    1.委托 C#的委托相当于C/C++中的函数指针.函数指针用指针获取一个函数的入口地址,实现对函数的操作. 委托与C/C++中的函数指针不同在于,委托是面向对象的,是引用类型,对委托的使用要先定义后实 ...

  8. .NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现

    原文:.NET环境下有关打印页面设置.打印机设置.打印预览对话框的实现 我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid.MSHFlexGrid的控件.其次,是 ...

  9. win32 htmlayout dom操作demo

    之前两篇关于win32 htmlayout博文,记载了一个实现了简单的点击按钮弹出新窗口的demo,之后实践中发现,图形界面开发,最重要的还是要实现响应用户操作,改变原有界面的功能.比如说,界面上有一 ...

  10. mysql三种修改密码的方式

    [root@MySQL ~]# mysqladmin -uroot -proot -S /data/3307/mysql.sock password '123'; 其中-p是现在的密码,passwor ...