Kubernetes 是 Google 团队发起的一个开源项目,它的目标是管理跨多个主机的容器,用于自动部署、扩展和管理容器化的应用程序,主要实现语言为 Go 语言。
集群:是一组节点,这些节点可以是物理服务器或者虚拟机,在他上面安装了Kubernetes环境。
从集群中的拿出某个节点作为Master,该Master 负责管理集群, master 协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。
节点是 Kubernetes 集群中的工作机器,可以是物理机或虚拟机。每个工作节点都有一个 kubelet,它是管理节点并与 Kubernetes Master 节点进行通信的代理。节点上还应具有处理容器操作的容器运行时,例如 Docker 或 rkt。
一个 Kubernetes 工作集群至少有三个节点。 Master 管理集群,而 节点 用于托管正在运行的应用程序。
当您在 Kubernetes 上部署应用程序时,您可以告诉 master 启动应用程序容器。Master 调度容器在集群的节点上运行。节点使用 Master 公开的 Kubernetes API 与 Master 通信。用户也可以直接使用 Kubernetes 的 API 与集群交互。
安装好K8S后,右上角Create创建,有三个选项,选择 Create An App,输入如下:
点击 Deploy,会跳到 Workloads 页面:
其中,Deployments有刚才创建的mynginx,Pods有 mynginx-6867b5b964-vlqh7,进入这个;
显示 Details 信息,有 Name/Namespace/Lables/等等...
Pod
是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace,是Kubernetes 调度的基本单位。
Pod 的设计理念是:支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
白话文:Pods里面是一个或多个容器的集合,其中Pods内是共享文件系统、网络;网络共享说明里面的每个容器都分配相同的ip,他们之间是通过ol来互相调用,用端口区分;
k8s使用yaml或json来创建一个容器
右上角Create创建,有三个选项,选择 Create from text input,输入下面内容:apiVersion: v1
kind: Pod
metadata:
name: nginx
然后点击 Deploy,会跳到 Workloads 页面:
注意,用这种方法创建,Deployments栏并没有,只在 Pods 栏中显示 nginx;说明用 Create from text input 创建 和 Create An App 创建 是不一样的;
Lable
识别 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 和 pod 是什么关系?
进入 deployment 中的mynginx,有New Replica Set 栏:
再进入,发现Replica Sets 有 Pods 栏:
Deployment 通过 Replica Sets 桥接,指定了有多少个 Pods !
Deployment
是否手动创建 Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么,能否将Pods划到逻辑组里?
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 来访问服务,而不需要了解后端容器的运行。
|