容器编排技术 -- Windows Server 容器

  • 1 前提条件
  • 2 网络
    • 2.1 Linux
    • 2.2 Windows
  • 3 在Kubernetes上搭建Windows server 容器
    • 3.1 主机配置
  • 4 组件配置
    • 4.1 路由配置
  • 5 启动集群
  • 6 启动基于Linux的Kubernetes控制面板
  • 7 启动Windows节点组件
  • 8 在Windows上调度pod
  • 9 已知限制:

Kubernetes v1.5引入了对Windows Server容器的支持。在版本1.5中,Kubernetes控制面板(API服务器,调度器,控制管理器等)仍然运行在Linux上,但是kubelet和kube-proxy可以运行在Windows Server上。

注意: 在Kubernetes 1.5中,Kubernetes中的Windows Server容器还属于Alpha功能。

前提条件

在Kubernetes v1.5中,Windows Server容器对Kubernetes的支持使用如下方法:

  1. Kubernetes控制面板还是运行在已有的Linux基础设施(v1.5及以后的版本)上
  2. 在Linux节点上搭建Kubenet网络插件
  3. Windows Server 2016 (RTM版本10.0.14393或之后的)
  4. 对Windows Server节点而言,需要Docker 版本 v1.12.2-cs2-ws-beta或之后的(Linux节点和Kubernetes控制面板可以运行在任何支持Docker版本的Kubernetes上)

网络

网络是通过L3路由实现的。由于第三方的网络插件(比如 flannel,calico等)本身在Windows Server上无法工作,它只能依赖于内嵌在Windows和Linux操作系统中的已有技术。在这个L3网络方法中,集群中的节点都选择使用/16的子网,每个工作节点选择/24的子网。在给定工作节点上的所有pod都会连接到/24的子网。这样,在同一个节点上的所有pod就能相互通信。为了激活运行在不同节点上的pod之间的网络,它使用了内嵌在Window server 2016 和Linux内的路由功能。

Linux

以上网络方法在Linux上已经使用网桥接口实现,网桥接口本质上是在节点上创建了一个本地私有网络。与Windows方面一样,为了使用“公开”NIC发送数据包,必须创建到所有其他节点CIDR的路由。

Windows

每个Windows server节点都必须做如下配置:

  1. 每个Windows Server节点都都必须要有两块NIC(虚拟网络适配器) - 这两种Windows容器网络模式(传输层和L2网桥)使用一个外部Hyper-V虚拟交换机。这意味着其中有一个NIC完全分配给该网桥,这也是为什么还需要创建一个NIC。
  2. 创建传输层容器网络 - 这是一个手工配置步骤,会在下面的Route Setup章节中介绍
  3. 启用RRAS(路由)Windows功能 - 允许同一台机器上两个NIC之间的路由,并能“截获”目标地址是运行在该节点上的POD的数据包。要启用该功能,打开“服务器管理”,点击“角色”,“添加角色”,点击“下一步”,选择“网络策略和访问服务”,点击“路由和远程访问服务”,并选择底下的复选框。
  4. 通过“公开”NIC将 - 这些路由添加到内嵌的路由表中,请参考下面的Route Setup章节

以下图表显示了在Windows Server上搭建Kubernetes的网络配置

在Kubernetes上搭建Windows server 容器

要在Kubernetes上运行Windows Server容器,你需要配置你的主机机器和Windows上的Kubernetes节点组件,并为在不同的节点上Pod之间的通信搭建路由。

主机配置

Windows主机配置

  1. Windows Server容器要运行Windows Server 2016 和 Docker v1.12。参考这个博客发表的搭建方法:https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_server
  2. 对Windows DNS的支持最近刚并到docker master中,目前在稳定的docker发布版中还不支持。要使用DNS,你可以从master中构建docker,或从【docker master】(https://master.dockerproject.org/)中下载二进制。
  3. 从https://hub.docker.com/r/apprenda/pause中拖拽apprenda/pause镜像
  4. 启用RRAS(路由) Windows功能
  5. 在PowerShell窗口下运行New-VMSwitch -Name KubeProxySwitch -SwitchType Internal命令来安装类型为‘Internal’的VMSwitch。这会创建一个新的名为vEthernet (KubeProxySwitch)的网络接口。kube-proxy会使用这个接口来添加Service IP。

Linux 主机配置

  1. Linux主机必须根据他们各自发行版的文档和你准备使用的Kubernetes的版本需求来配置。
  2. 安装CNI网络插件。

组件配置

要求

  • Git
  • Go 1.7.1+
  • make (如果使用的是Linux 或 MacOS)
  • 关键注解和其他依赖关系都列在【这里】(https://git.k8s.io/community/contributors/devel/development.md#building-kubernetes-on-a-local-osshell-environment)

kubelet

要构建kubelet,运行:

  1. cd $GOPATH/src/k8s.io/kubernetes
  2. 构建 kubelet
    1. Linux/MacOS: KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kubelet
    2. Windows: go build cmd/kubelet/kubelet.go

kube-proxy

要投建kube-proxy,运行:

  1. cd $GOPATH/src/k8s.io/kubernetes
  2. 构建 kube-proxy
    1. Linux/MacOS: KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kube-proxy
    2. Windows: go build cmd/kube-proxy/proxy.go

路由配置

如下实例配置是假设你有一个Linux和两个Windows Server 2016 节点,以及集群CIDR 192.168.0.0/16。

Hostname Routable IP address Pod CIDR
Lin01 <IP of Lin01 host> 192.168.0.0/24
Win01 <IP of Win01 host> 192.168.1.0/24
Win02 <IP of Win02 host> 192.168.2.0/24

Lin01

ip route add 192.168.1.0/24 via <IP of Win01 host>
ip route add 192.168.2.0/24 via <IP of Win02 host>

Win01

docker network create -d transparent --gateway 192.168.1.1 --subnet 192.168.1.0/24 <network name># 创建了一个适配器名为"vEthernet (HNSTransparent)"的网桥。将它的IP地址设置为传输层网络网关
netsh interface ipv4 set address "vEthernet (HNSTransparent)" addr=192.168.1.1
route add 192.168.0.0 mask 255.255.255.0 192.168.0.1 if <Interface Id of the Routable Ethernet Adapter> -p
route add 192.168.2.0 mask 255.255.255.0 192.168.2.1 if <Interface Id of the Routable Ethernet Adapter> -p

Win02

docker network create -d transparent --gateway 192.168.2.1 --subnet 192.168.2.0/24 <network name># 创建了一个适配器名为"vEthernet (HNSTransparent)"的网桥。将它的IP地址设置为传输层网络网关
netsh interface ipv4 set address "vEthernet (HNSTransparent)" addr=192.168.2.1
route add 192.168.0.0 mask 255.255.255.0 192.168.0.1 if <Interface Id of the Routable Ethernet Adapter> -p
route add 192.168.1.0 mask 255.255.255.0 192.168.1.1 if <Interface Id of the Routable Ethernet Adapter> -p

启动集群

要启动你的集群,你需要将基于Linux的Kubernetes控制面板和基于Windows Server的Kubernetes节点组件都启动。

启动基于Linux的Kubernetes控制面板

你可以使用喜欢的方式在Linux上启动Kubernetes集群。请注意,该集群的CIDR可能需要更新。

启动Windows节点组件

要在你的Windows节点上启动kubelet: 在PowerShell窗口下运行以下命令。需要注意的是,如果节点重启或进程退出了,你需要重新运行以下命令来重启kubelet

  1. 将环境变量CONTAINER_NETWORK的值设置为docker容器网络 $env:CONTAINER_NETWORK = "<docker network>"
  2. 使用如下命令运行可执行文件 kubelet kubelet.exe --hostname-override=<ip address/hostname of the windows node> --pod-infra-container-image="apprenda/pause" --resolv-conf="" --api_servers=<api server location>

要在你的Windows节点上启动kube-proxy: 使用管理员权限在PowerShell窗口里运行以下命令。需要注意的是,如果节点重启或进程退出了,你需要重新运行以下命令来重启kube-proxy。 .\proxy.exe --v=3 --proxy-mode=userspace --hostname-override=<ip address/hostname of the windows node> --master=<api server location> --bind-address=<ip address of the windows node>

在Windows上调度pod

由于你的集群中既有Linux也有Windows节点,为了能将pod调度到Windows节点上,你必须显示地设置nodeSelector限制条件。你必须把nodeSelector的标签beta.kubernetes.io/os的值设置为windows;请看下面的例子:

{"apiVersion": "v1","kind": "Pod","metadata": {"name": "iis","labels": {"name": "iis"}},"spec": {"containers": [{"name": "iis","image": "microsoft/iis","ports": [{"containerPort": 80}]}],"nodeSelector": {"beta.kubernetes.io/os": "windows"}}
}

已知限制:

  1. Windows系统没有网络命名空间,因此目前只支持一个pod上只有一个容器。
  2. 由于Windows Server容器的一个问题,Secrets目前不可用。该问题在【这里】描述(https://github.com/docker/docker/issues/28401)。
  3. ConfigMaps目前还没有实现。
  4. kube-proxy的实现使用了netsh portproxy,由于netsh portproxy`只支持TCP,因此只有在客户端使用TCP来重试DNS查询的时候,DNS才会有用。

译者:yybuxiu04 / 原文链接

容器编排技术 -- Windows Server 容器相关推荐

  1. 容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源

    容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源 1 Before you begin 2 创建一个命名空间 3 声明一个CPU申请和限制 4 CPU 单位 5 请求的CPU超出 ...

  2. 容器编排技术 -- Kubernetes 给容器和Pod分配内存资源

    容器编排技术 -- Kubernetes 给容器和Pod分配内存资源 1 Before you begin 2 创建一个命名空间 3 配置内存申请和限制 4 超出容器的内存限制 5 配置超出节点能力范 ...

  3. 容器编排中的容器编排技术博客

    文章目录 <容器编排中的容器编排技术博客> <容器编排中的容器编排技术博客> 引言 1.1. 背景介绍 随着云计算和 DevOps 的兴起,容器化技术逐渐成为构建可扩展.灵活. ...

  4. 容器编排技术 -- Kubernetes kubectl edit 命令详解

    容器编排技术 -- Kubernetes kubectl edit 命令详解 1 kubectl edit 2 语法 3 示例 4 Flags kubectl edit 使用默认编辑器 编辑服务器上定 ...

  5. 容器编排技术 -- Kubernetes kubectl create 命令详解

    容器编排技术 -- Kubernetes kubectl create 命令详解 1 kubectl create 2 语法 3 示例 4 Flags kubectl create 通过配置文件名或s ...

  6. 容器编排技术 -- 安装和设置kubectl

    容器编排技术 -- 安装和设置kubectl 使用Kubernetes命令行工具kubectl在Kubernetes上部署和管理应用程序.使用kubectl,可以检查集群资源; 创建,删除和更新组件. ...

  7. 容器编排技术 -- kubeadm 实现细节

    容器编排技术 -- kubeadm 实现细节 1 核心设计原则 2 常量和众所周知的值和路径 3 kubeadm init 工作流程内部设计 3.1 预检检查 3.2 生成必要的证书 3.3 为控制平 ...

  8. 容器编排技术 -- Kubernetes StatefulSet基本使用

    容器编排技术 -- Kubernetes StatefulSet基本使用 1 Objectives 2 Before you begin 2.1 顺序创建 Pod 3 Pods in a Statef ...

  9. 容器编排技术 -- Kubernetes Nodes

    容器编排技术 -- Kubernetes Nodes 1 Node是什么? 2 Node Status 2.1 Addresses 2.2 Phase 2.3 Condition 2.4 Capaci ...

最新文章

  1. [CES 2018] TPCast发布升级版本,将支持微软MR设备
  2. mysql索引查2遍_mysql索引优化查询
  3. 【机器学习】为什么GBDT可以超越深度学习
  4. VTK:网格用法实战
  5. 如何编写第一个 ngrx Effect 类
  6. leetcode617. 合并二叉树(dfs)
  7. 从dig命令理解DNS
  8. Fama-French五因子模型实用攻略
  9. Uniapp引入和使用阿里矢量图
  10. 软件测试肖sir__008项目管理工具之禅道
  11. 机械类和计算机类哪个累哪个难,这几个大学专业累死人还难学,但是毕业却很好就业...
  12. js 判断系统类型和手机型号(厂商)
  13. linux引导程序下载,SysLinux 4.05 下载 功能强大的引导加载程序
  14. 构建WindowsPhone生态:梁念坚博士答记者问windowsphone
  15. 解压zip,z01,z02
  16. Python版剑指Offer题解
  17. 学习笔记——利用串口通信控制LED指示灯开关
  18. 牛客小白月赛65个人题解A-E
  19. linux设置全局代理
  20. 声音检索引擎- midomi.com

热门文章

  1. session和cookie的最深刻理解
  2. UITableView 系列三 :分类显示和改变外观 (实例)
  3. php 创建短地址 (var_export)
  4. C++ 封装DLL遇到的一些坑爹问题与解决方案
  5. urllib2的Post和Get请求
  6. mac下常用数据库及nginx笔记
  7. mysql学习笔记 查找技术 1207 0311
  8. 对象 对象 java 1615134277
  9. 需求说明 用户登陆功能的实现 c#
  10. 前端开发 认识css 体验变色的效果 0228