本文同步于个人Github博客:https://github.com/johnnian/Blog/issues/30,欢迎留言。
谈到容器化管理解决方案,Kubernetes 目前应该是比较成熟的,有比较多的落地实施案例。
一、Kubernetes 简介
Kubernetes 是容器自动部署、扩展与管理的开源平台,具体的介绍,可以参考链接: What is Kubernetes?
目前,Kubernetes有比较多的落地实施案例,例如 京东、SAE、网宿科技、时速云、灵雀云、网易蜂巢等等。
参考链接:
二、Kubernetes基本概念
Kubernetes 集群的节点,按照功能,可以划分为 Master Node(控制集群),Worker Node(实际工作)。
Master Node上运行的组件: Master Components + Node components
Worker Node上运行的组件: Node components
2.1 Components(组件)
Master Components
- kube-apiserver:配置API 对象(pods, services, replicationcontrollers等),并且放出REST 接口,供其他组件进行交互
- etcd: Kubernetes用于存储API对象的Key-Value存储中心
- kube-controller-manager/cloud-controller-manager: 处理集群中的运行时任务,正常情况下是通过这些控制器来控制管理集群的
- kube-scheduler:为Pod分配运行节点
- addons(DNS、Dashboard、Monitoring、Logging等)
Node Components
- kubelet: 节点的守护进程,最终工作的执行者
- kube-proxy: Kubernetes集群的网络代理
- docker / rkt: 容器
- supervisord:轻量级的守护进程
- fluentd: 日志收集
Master node 组件结构
![](https://img.haomeiwen.com/i595838/e22998a96e715ae6.png)
Worker node 组件结构
![](https://img.haomeiwen.com/i595838/6a9368b4819ad0de.png)
参考链接:
- Kubernetes Components
- Pod Overview: Pod是Kubernetes上最小操作单元,理解这个挺重要的~
2.2 API Objects(API 对象)
Kubernetes使用 持久化的Objects对象来展现集群的状态,这些对象存储在 Kubernetes的 Etcd KeyValue存储中。
使用 kubectl命令行客户端来操作 API 对象。
API Object的文档说明,请看这里。
通过创建 .yaml
格式的文件,使用kubectl
命令行创建 API对象, .yaml
文件的格式大致是:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
可以分为:
- apiVersion: 需要使用哪个版本的Kubernetes来创建 API对象
- kind: 需要创建那种类型的 API对象
- metadata: API对象的一些标志属性,如,name, UID, namespace等
- spec: API对象的具体属性配置
对于API对象的类型,划分:
- Pod: Pod可以理解为应用实例特定的逻辑主机,表示一个或多个容器组和这些容器的共享资源,包共用卷、唯一的集群IP和容器运行的信息,如端口等;
- Controller:Controller可以根据对应的策略创建或者管理Pod,如,Deployment,DaemonSet,StatefulSet等;
- Service: Service是一组相同逻辑的pods和一个访问它们的策略;
a. ClusterIP(默认): 只有集群内部访问;
b. NodePort: 使用NAT方式,在集群中每个选定的节点的同一端口上暴露服务。可以在集群外部访问服务。
c. LoadBalancer:创建外部负载均衡。
d. ExternalName:使用任意名称显示服务。 - Namespace: 命名空间;
- Node: kubernetes的工作机器(物理机或虚拟机),Node由master管理,可以在一个node上部署多个pod;
2.3 Controller(控制器)
不同类型的控制器,管理Pod的策略是不同的,Controller主要分为下面几种类型:
- Deployment: Deployments控制器是最常用的,可以用来管理和更新Pods 、ReplicaSets
- Replication Controller
- ReplicaSets(Replication Controller的下一个升级版本)
- DaemonSet
- Job
- Cron Job
- StatefulSets[beta]
- Garbage collection[beta]
参考链接:
2.4 Service(服务)
Service 可以说是连接 Pods 与外界的桥梁,Service可以建立起 内部 Pod 容器的端口 <--> 外部端口 的映射关系,通过Visual IP,客户端直接连接Service的IP、端口,而无需关注后端的Pods IP地址的变化,这个概念有点儿像微服务。
Service 有下面几种类型:
- ClusterIP(默认): 仅限于集群内部使用的服务,外部无法访问;
- NodePort: 支持外部访问的服务,可以通过 [NodeIP]:[NodePort] 来访问对应的服务;
- LoadBalancer:需要云服务商支持
- ExternalName:通过域名来访问
每个Node 都会运行 kube-proxy 组件,kube-proxy 组件为Service创建虚拟IP(Visual IP),下面是整个网络代理的拓扑图:
Kubernetes V1.2版本前,网络代理的拓扑图:
![](https://img.haomeiwen.com/i595838/49a7803afb6b7d2c.png)
Kubernetes V1.2版本后,网络代理的拓扑图:
![](https://img.haomeiwen.com/i595838/718d0befd426b598.png)
详细说明,参考:Service
2.5 网络拓扑
Kubernetes 高可用集群拓扑图
![](https://img.haomeiwen.com/i595838/de5bd4fe64afbc33.png)
三、常见的部署方案以及示例
目前市面上有很多部署和实施Kubernete的解决方案,点击这里查看, 总的来说,大致分为下面的几种:
- Hosted Solutions:托管部署方案,例如直接用谷歌的Google Container Engine等
- Local-machine Solutions: 本地部署方案,一般用于开发测试使用,例如,使用 minikube 部署;
- Custom Solutions: 自行定制的方案,例如,使用 kubeadm部署;
3.1、本地部署-minikube
minikube安装倒是挺简单的,就是下载镜像的时候会有问题,可以考虑:使用阿里云镜像,或者用Docker Hub 作为中转。
部署示例
操作说明
网友评论