Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:3663  7  0

Kubernetes Cookbook 编程指南 中文版教程

探索架构的设计 

Kubernetes是一个开源的容器管理工具。它是基于Go语言(https://golang.org)设计的轻量、简便的一个应用。你可以基于Linux系统配置一个Kubernetes集群来部署、管理和扩展多主机的Docker容器应用。

开始

Kubernetes是使用以下几个组件构建的:

  • Kubernetes master(管理节点)

  • Kubernetes nodes(工作节点)

  • etcd(存储数据库)

  • 层叠网络(flannel)

这些组件都是通过网络进行连接的,如下截图所示:

前面这张图像可以总结以下几点:

  • Kubernetes Master是通过HTTP或者是HTTPS与etcd进行连接并存储数据。它也会连接flannel访问容器应用。

  • Kubernetes Nodes通过HTTP或HTTPS与Kubernetes Master进行连接,以获取执行的命令和报告自己的状态信息。

  • Kubernetes Nodes 使用层叠网络(如,flannel)来创建容器应用的网络连接。

如何来做...

在本节,我们将来解读一下Kubernetes Master与Nodes的功能特性;这两个组件实现了Kubernetes系统的主要功能。

Kubernetes master(主管理节点)

Kubernetes Master是Kubernetes集群的主要组件。它提供了以下所示的几个功能:

  • 集群的授权与认证

  • RESTful API入口点

  • 在Kubernetes Nodes上部署调度容器

  • 扩展与副本控制

  • 读取与存储配置

  • 命令行接口

下面一张图显示了master的服务如何协同工作以实现上述这些功能: 

有一些提供Kubernetes master功能的服务进程,如kube-apiserver,kube-scheduler和kube-controller-manager。Hypercube封装器统一运行上述所有服务进程。

此外,Kubernetes 命令行接口kubectl可以控制Kubernetes Master的功能。

API Server(kube-apiserver组件)

API server提供了一个基于HTTP或HTTPS的RESTful API,这是Kubernetes组件的中心。Kubernetes组件如kubectl、scheduler、replication controler、etc datastore和运行在Kubernetes Nodes上的kubelet与kube-prox等。

Scheduler(kube-scheduler组件)

Scheduler帮助选择在哪台节点上运行哪些容器。它使用一个简单的算法来定义节点分发的优先级并将容器与节点绑定,例如:

  • CPU

  • 内存

  • 有多少容器正在运行?

Controller Manager(kube-controller-manager组件)

Controller Manager执行集群的操作,例如:

  • 管理Kubernetes Nodes

  • 创建和更新Kubernetes内部信息

  • 尝试将当前状态改变到期望的状态

命令行接口(kubectl组件)

在你安装了Kubernetes Master之后,你可以使用Kubernetes命令行接口kubectl来控制Kubernetes集群。例如,kubectl get cs返回组件的状态。也可以使用,kubectl get nodes返回的是一组Kubernetes Nodes:

//see the ComponentStatuses
# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok nil
scheduler Healthy ok nil
etcd-0 Healthy {"health": "true"} nil

//see the nodes
# kubectl get nodes
NAME LABELS STATUS AGE
kub-node1 kubernetes.io/hostname=kub-node1 Ready 26d
kub-node2 kubernetes.io/hostname=kub-node2 Ready 26d

Kubernetes Node(Kubernetes工作节点)

Kubernetes Node是Kubernetes集群中的从节点。它是由Kubernetes Master节点控制并运行容器应用。本书中是使用Docker(http://docker.com)或 rkt(http://coreos.com/rkt/docs/latest)创建容器的。我们将使用Docker容器运行时作为黙认的引擎。

Node或Slave? 术语Slave在计算机工业中表示集群中的工作节点(Worker Node),他也会产生歧义。因此Kubernetes项目使用Node来代替Slave表示工作节点,使用Master来表示主管理节点。

下面的图片显示了这些工作节点上的组件服务进程的角色与任务: 

工作节点也有多个服务进程,叫作kubelet和kube-proxy,来支持工作节点的功能。

kubelet(kubelet组件)

kubelet是Kubernetes Node上的主要进程,用来与Kubernetes Master通信来进行以下几个操作:

  • 定时访问API Controller来检查并报告

  • 执行容器操作

  • 运行HTTP服务器来提供简单的APIs

Proxy(kube-proxy组件)

Proxy为每个容器处理网络代理和负载均衡。它执行的是改变Linux iptables 规则(nat table)来跨容器控制TCP与UDP包。

启动kupe-proxy服务后,它将配置iptables 的规则;你可以通过查看iptables -t nat -L 或 iptables -t nat -S来检查nat table规则,如下所示:

//the result will be vary and dynamically changed by kube-proxy
# sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-N FLANNEL
-N KUBE-NODEPORT-CONTAINER
-N KUBE-NODEPORT-HOST
-N KUBE-PORTALS-CONTAINER
-N KUBE-PORTALS-HOST
-A PREROUTING -m comment --comment "handle ClusterIPs; NOTE: this must be
before the NodePort rules" -j KUBE-PORTALS-CONTAINER
-A PREROUTING -m addrtype --dst-type LOCAL -m comment --comment "handle
service NodePorts; NOTE: this must be the last rule in the chain" -j
KUBE-NODEPORT-CONTAINER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -m comment --comment "handle ClusterIPs; NOTE: this must be
before the NodePort rules" -j KUBE-PORTALS-HOST
-A OUTPUT -m addrtype --dst-type LOCAL -m comment --comment "handle
service NodePorts; NOTE: this must be the last rule in the chain" -j
KUBE-NODEPORT-HOST
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 192.168.90.0/24 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/16 -j FLANNEL
-A FLANNEL -d 192.168.0.0/16 -j ACCEPT
-A FLANNEL ! -d 224.0.0.0/4 -j MASQUERADE

它是如何工作的...

至少要有两个以上组件来实现Kubernetes Nodes的功能,datastore etcd和overlay network flannel。你可以在下面的章节中学习它们是如何支持Kubernetes系统的。

etcd(数据库)

etcd(https://coreos.com/etcd)是一个分布式的键值数据存储库。它中以在网络上通过RESTful API的访问来执行CRUD操作。Kubernetes使用etcd作为主要的数据存储库。

你可以使用以下curl命令在etcd(/registry)中浏览一下Kubernetes配置和状态:

//example: etcd server is 10.0.0.1 and default port is 2379
# curl -L "http://10.0.0.1:2379/v2/keys/registry"
{"action":"get","node":{"key":"/registry","dir":true,"nodes":[{"key":"/registry/namespaces","dir":true,"modifiedIndex":15,"createdIndex":15},{"key":"/registry/serviceaccounts","dir":true,"modifiedIndex":16,"createdIndex":16},{"key":"/registry/services","dir":true,"modifiedIndex":17,"createdIndex":17},{"key":"/registry/ranges","dir":true,"modifiedIndex":76,"createdIndex":76},{"key":"/registry/nodes","dir":true,"modifiedIndex":740,"createdIndex":740},{"key":"/registry/pods","dir":true,"modifiedIndex":794,"createdIndex":794},{"key":"/registry/controllers","dir":true,"modifiedIndex":810,"createdIndex":810},{"key":"/registry/events","dir":true,"modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}}

Overlay Network(层叠网络)

容器之间的网络通信是最难的一个部分。因为当你开始运行Docker时,它的IP地址是动态分配的;容器应用需要知道对等的IP地址和端口号。

如果容器的网络通信仅仅是在一个单独的主机中,你可以使用Docker link 生成环境变量来发现对等网络。然而,Kuernetes通常工作在集群中,使用代理模式和层叠网络可以帮助连接每一个节点。Kubernetes使用层叠网络来管理多容器之间的通信。

对于层叠网络,Kubernetes有一些选项,但是使用flannel更容易解决。

Flannel

Flannel也是使用是etcd来配置设置并且存储状态的。你也可以通过执行curl命 令来浏览它的配置(/coreos.com/network)和状态,如下所示:

//overlay network CIDR is 192.168.0.0/16
# curl -L "http://10.0.0.1:2379/v2/keys/coreos.com/network/config"
{"action":"get","node":{"key":"/coreos.com/network/config","value":"{
\"Network\": \"192.168.0.0/16\" }","modifiedIndex":144913,"createdInd
ex":144913}}

//Kubernetes assigns some subnets to containers
# curl -L "http://10.0.0.1:2379/v2/keys/coreos.com/network/subnets"
{"action":"get","node":{"key":"/coreos.com/network/subnets","dir":true,"n
odes":[{"key":"/coreos.com/network/subnets/192.168.90.0-24","value":"{\"
PublicIP\":\"10.97.217.158\"}","expiration":"2015-11-05T08:16:21.9957499
71Z","ttl":38993,"modifiedIndex":388599,"createdIndex":388599},{"key":"/
coreos.com/network/subnets/192.168.76.0-24","value":"{\"PublicIP\":\"10.9
7.217.148\"}","expiration":"2015-11-05T04:32:45.528111606Z","ttl":25576,"
modifiedIndex":385909,"createdIndex":385909},{"key":"/coreos.com/network/
subnets/192.168.40.0-24","value":"{\"PublicIP\":\"10.97.217.51\"}","expir
ation":"2015-11-05T15:18:27.335916533Z","ttl":64318,"modifiedIndex":3936-
75,"createdIndex":393675}],"modifiedIndex":79,"createdIndex":79}}

也可以参见

这个部分描述了Kubernetes的基本架构和方法论与相关的组件。撑握Kubernetes并不容易,但是关于如何设置、配置和管理Kubernetes的step-by-step的课程真是非常的有趣。

下面的步骤描述了如何安装并配置相关的组件:

  • 构建DataStroe

  • 创建层叠网络

  • 配置Master

  • 配置Nodes