基础概念
Kubernetes集群
Kubernetes将底层的计算资源连接在一起对外体现为一个高可用的计算机集群。允许将容器化的应用程序部署到集群中。是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能
- Master节点:负责集群的管理。Master 协调集群中的所有行为/活动,例如应用的运行、修改、更新等
-
Node Controller第一个是在注册时将CIDR块分配给节点。第二个是使节点控制器的内部列表与云提供商的可用机器列表保持最新。第三是监测节点的健康状况
- Nodes节点:运行应用的工作节点。每个node上都有一个Kubelet,用于管理node节点与Kubernetes Master通信。并且至少还要运行container runtime(比如docker或者 rkt)
Kubernetes Deployments
Deployment负责创建和更新应用。创建Deployment时需要为应用程序指定容器镜像以及要运行的副本数。创建Deployment后,Kubernetes master 会将Deployment创建好的应用实例调度到集群中的各个节点。
应用实例创建完成后,Kubernetes Deployment Controller会持续监视这些实例。如果管理实例的节点被关闭或删除,那么 Deployment Controller将会替换它们,实现自我修复能力。
Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。
Kubernetes Pod
Kubernetes对象模型中可部署的最小对象。一个Pod代表集群上正在运行的一个进程。Pod是Kubernetes中一个抽象化概念,由一个或多个容器组合在一起得共享资源。
这些资源包括:
- 共享存储,如 Volumes 卷
- 网络,唯一的集群IP地址
- 每个容器运行的信息,例如:容器镜像版本
每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)
当在Kubernetes上创建Deployment时,该Deployment将会创建具有容器的Pods(而不会直接创建容器),每个Pod将被绑定调度到Node节点上,并一直保持在那里直到被终止(根据配置策略)或删除。在节点出现故障的情况下,群集中的其他可用节点上将会调度之前相同的Pod。
目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和PetSet。
Kubernetes Nodes
一个Pod总是在一个(Node)节点上运行,Node是Kubernetes中的工作节点,可以是虚拟机或物理机。每个Node由 Master管理,Node上可以有多个pod,Kubernetes Master会自动处理群集中Node的pod调度,同时Master的自动调度会考虑每个Node上的可用资源。
节点不是由Kubernetes 系统创建,它是由云提供商在外部创建的,目前,有三个组件与Kubernetes节点接口进行交互:节点控制器(node controller)、kubelet和kubectl
Node Status
- Addresses:HostName,ExternalIP,InternalIP
- Phase (已弃用)
- Condition:OutOfDisk,Ready,MemoryPressure,DiskPressure
- Capacity:描述节点上可用的资源:CPU、内存和可以调度到节点上的最大pod数
- Info:关于节点的一些基础信息,如内核版本、Kubernetes版本(kubelet和kube-proxy版本)、Docker版本(如果有使用)、OS名称等。信息由Kubelet从节点收集
Kubernetes Services
一个 Pod 的逻辑分组,一种可以访问它们的策略。这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现。
一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。要稳定地提供服务需要服务发现和负载均衡能力。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个
Kubernetes Names
Kubernetes REST API中的所有对象都用Name和UID来明确地标识
-
Name
Name在一个对象中同一时间只能拥有单个Name,如果对象被删除,也可以使用相同Name创建新的对象,Name用于在资源引用URL中的对象,例如/api/v1/pods/some-name
。通常情况,Kubernetes资源的Name能有最长到253个字符(包括数字字符、-
和.
),但某些资源可能有更具体的限制条件,具体情况可以参考:标识符设计文档。
-
UIDs
UIDs是由Kubernetes生成的,在Kubernetes集群的整个生命周期中创建的每个对象都有不同的UID(即它们在空间和时间上是唯一的)。
Kubernetes Namespaces
Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群。Namespace为名称提供了一个范围。资源的Names在Namespace中具有唯一性
注意:
- 删除一个namespace会自动删除所有属于该namespace的资源。
- default和kube-system命名空间不可删除。
- PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。
- Events是否属于namespace取决于产生events的对象
Kubernetes Labels 和 Selectors
Labels其实就一对 key/value ,被关联到对象上,标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的
"labels": { "key1" : "value1", "key2" : "value2" }
Labels Selectors,客户端/用户 能方便辨识出一组对象。API目前支持两种选择器:equality-based(基于平等)和set-based(基于集合)的
Kubernetes Volume
默认情况下容器中的磁盘文件是非持久化的。Kubernetes Volume具有明确的生命周期 - 与pod相同。因此,Volume的生命周期比Pod中运行的任何容器要持久,在容器重新启动时能可以保留数据,当然,当Pod被删除不存在时,Volume也将消失。注意,Kubernetes支持许多类型的Volume,Pod可以同时使用任意类型/数量的Volume。
要使用Volume,pod需要指定Volume的类型和内容(spec.volumes
字段),和映射到容器的位置(spec.containers.volumeMounts
字段)
常见类型:
- emptyDir
使用emptyDir,当Pod分配到Node上时,将会创建emptyDir,并且只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。注:删除容器不影响emptyDir。
示例:
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: gcr.io/google_containers/test-webserver name: test-container volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
- hostPath
hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
示例
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: gcr.io/google_containers/test-webserver name: test-container volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: # directory location on host path: /data
- secret
secret volume用于将敏感信息(如密码)传递给pod。可以将secrets存储在Kubernetes API中,使用的时候以文件的形式挂载到pod中,而不用连接api。 secret volume由tmpfs(RAM支持的文件系统)支持。https://kubernetes.io/docs/concepts/configuration/secret/
- persistentVolumeClaim
persistentVolumeClaim用来挂载持久化磁盘的。PersistentVolumes是用户在不知道特定云环境的细节的情况下,实现持久化存储(如GCE PersistentDisk或iSCSI卷)的一种方式
详情 https://kubernetes.io/docs/concepts/storage/persistent-volumes/