简介
Kubernetes 是 Google 团队发起的一个开源项目,它的目标
是管理跨多个主机的容器,用于自动部署、扩展和管理容器
化的应用程序,主要实现语言为 Go 语言。
我们先搭建一套集群让我们来感受下,去体验下里面的一些
概念和用法,等你对这些基本概念熟悉以后,再来讲解
Kubernetes的组件和架构应该就更加容易了。
- katacoda:katacoda,可以在网站上帮我们启动一个
minikube的环境(学习)
2.Docker for MAC/Windows(推荐)/minikube(本地)
Docker for MAC/Windows 和 minikube 安装之前需要安
装kubectl工具
3.kubeadm(测试)
4.二进制纯手动搭建(生产)
集群
集群是一组节点,这些节点可以是物理服务器或者虚拟机,
在他上面安装了Kubernetes环境。
Master 负责管理集群, master 协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。节点是 Kubernetes 集群中的工作机器,可以是物理机或虚拟机。每个工作节点都有一个 kubelet,它是管理节点并与Kubernetes Master 节点进行通信的代理。节点上还应具有处理容器操作的容器运行时,例如 Docker 或 rkt。一个Kubernetes 工作集群至少有三个节点。Master 管理集群,而 节点 用于托管正在运行的应用程序。在 Kubernetes 上部署应用程序时,Master 调度容器在集群的节点上运行。 节点使用 Master 公开的 Kubernetes API 与Master 通信。用户也可以直接使用 Kubernetes 的 API 与集群交互。
Pod
Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、
Network 和 UTS namespace,是Kubernetes 调度的基本单位。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高
效的方式组合完成服务。
namespace 是 linux 内核提供的特性,为虚拟化而生。随着 docker 的诞生引爆了容器技术,也把长期在后台默默奉献的 namespace 技术推到了大家的面前
。
ll /proc/$$/ns
简称 | 全称 | 说明 |
---|---|---|
ust | 用来隔离nodename和domainname两个系统标识 | |
ipc | Inter-ProcessCommunication | 用来隔离进程间通信 |
mnt | Mount | 用来隔离各个进程看到的挂载点视图 |
user | User | 用来隔离用户的用户组ID |
net | Network | 用来隔离网络,IP地址端口等网络栈 |
pid | process ID | 用来隔离进程ID |
在 Kubernetes 中,所有对象都使用 manifest(yaml或json)来定义,比如一个简单的 nginx 服务可以定义为nginx.yaml,它包含一个镜像为 nginx 的容器:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Label
Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上(key最长不能超过63字节,value 可以为空,也可以是不超过253字节的字符串)。
Label 不提供唯一性,并且实际上经常是很多对象(如
Pods)都使用相同的 label 来标志具体的应用。Label 定义好后其他对象可以使用 Label Selector 来择一组
相同 label 的对象(比如Service 用 label 来选择一组Pod)。
Label Selector支持以下几种方式:
-
等式,如app=nginx和env!=production
-
集合,如env in (production, qa)
-
多个label(它们之间是AND关系),如 app=nginx,env=test
Namespace
Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services,deployments 等都是属于某一个 namespace的(默认是default),而Node, PersistentVolumes 等则不属于任何 namespace。
Deployment
Deployment 确保任意时间都有指定数量的 Pod“副本”在运行。如果为某个 Pod 创建了Deployment 并且指定3个副本,它会创建3个 Pod,并且持续监控它们。如果某个 Pod 不响应,那么 Deployment 会替换它,保持总数为3.如果之前不响应的 Pod 恢复了,现在就有4个 Pod 了,那么Deployment 会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Deployment 会立刻启动2个新 Pod,保证总数为5。Deployment 还支持回滚和滚动升级。当创建 Deployment 时,需要指定两个东西:
- Pod模板:用来创建 Pod 副本的模板
- Label标签:Deployment 需要监控的 Pod 的标签。
如果已经创建了 Pod 的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是 Service。
Service
Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的Pod IP 和端口列表组成endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些endpoints 上。
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或DNS 来访问服务,而不需要了解后端容器的运行。