码蚁

打码改变人生

Kubernetes 基础介绍

Posted at — Mar 8, 2017

公司内部培训 Kubernetes 的文档

宏观的认识下 Docker

Kubernetes 功能

Kubernetes 是 Google 开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用,其主要功能如下:

Kubernetes 架构解析

kubernetes 是由不同的角色(组件)组成,共同支撑整个系统的运行。

kubernetes 架构图

主要包括:kubectl、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kubelet,当然这些并不能组成一个完整的 kubernetes 系统,整个系统中的信息还需要一个存储介质 etcd,网络服务 Flannel(可选)。

kube-apiserver                         REST API服务
kube-controller-manager                多个控制器的合体
kube-scheduler                         任务调度,命令下发
kube-proxy                             网络代理转发
kubelet                                容器的管理
kubectl                                客户端命令行工具
etcd                                   信息存储
flannel                                IP地址的分配

master 组件

kube-apiserver

提供和外部交互的接口和安全机制,大多数接口都是直接读写 etcd中的数据。通过 RESTful 的方式供客户端使用,kubectl 就是最常用到的客户端程序。

Kube-controller-manager

用来执行整个系统中的后台任务,它其实是多个控制进程的合体。大致包括如下

Scheduler

Scheduler 收集和分析当前 Kubernetes 集群中所有 Minion 节点的资源(内存、CPU)负载情况,然后依此分发新建的 Pod 到 Kubernetes 集群中可用的节点。由于一旦 Minion 节点的资源被分配给 Pod,那这些资源就不能再分配给其他 Pod, 除非这些 Pod被删除或者退出, 因此,Kubernetes 需要分析集群中所有 Minion 的资源使用情况,保证分发的工作负载不会超出当前该 Minion 节点的可用资源范围。具体来说,Scheduler 做以下工作:

etcd 集群

etcd 是 kubernetes 存放集群状态和配置的地方,这是集群状态同步的关键,所有节点都是从 etcd 中获取集群中其他机器状态的,集群中所有容器的状态也是放在这里的。

kubernetes 在 etcd 中存储的数据在 /registry 路径下,结构类似下面这样:

  /registry/minions
  /registry/namespaces
  /registry/pods
  /registry/ranges
  /registry/serviceaccounts
  /registry/services
  /registry/controllers
  /registry/events

slave 组件

kubelet

kubelet 是 slave 上核心的工作进程,负责容器和 pod 的实际管理工作(创建、删除等)以及和 master 通信,内容包括:

kube-proxy

正如名字提示的一样,kube-proxy 为 pod 提供代理服务,用来实现 kubernetes 的 service 机制。每个 service 都会被分配一个虚拟 ip,当应用访问到 service ip 和端口的时候,会先发送到 kube-proxy,然后才转发到机器上的容器服务。

kubectl

这是 kubernetes 提供的客户端程序,也是目前常用的和集群交互的方式。创建、查看、管理、删除、更新 pod、service、replication controller 都行,还有更多其他命令,可以查看帮助文档。

kubernetes 的概念

Pods

kubernetes 中,最基本的管理单位是 pod 而不是 container。pod 由一个或者多个容器组成,一般运行着相同的应用。一个 pod 中的所有容器都必须运行在同一台机器上,共享网络空间(network namespace)和存储 (volume)。每个pod首先会启动一个 google_containers/pause 容器,然后再启动应用真正的应用容器,主要作用是来实现共享网络命名空间和存储。

pod 可以近似类比传统模式下的主机:一些相关的应用组合起来,实现一个逻辑上的功能。

记住:pod 不是持久的,也就是说在使用过程中会被删除和创建,只要保证 service (下文会介绍到)保持稳定就行。而持久化的功能可以通过共享的 volume 来实现,这样即使 pod 被不断删除创建也能保证数据的完整。

Replication Controllers

RC 保证在任意时刻都有指定数量的 pod 副本在运行。比如如果我们创建了一个 rc,指定某个 pod 运行 3 份:

刚开始的时候,rc 发现集群中没有这个 pod,它会创建 3 个 pod 当某个 pod 不响应或者被删除了,它会检测到这个变化,然后新建一个正常的 pod(替换错误状态的 pod),保证系统有 3 个 pod 在运行 当错误的 pod 回复正常,或者用户又手动添加了几个 pod,rc 也会检测到,它会通过删除 pod 来保证只有 3 份副本在运行

创建 replication controller 的时候,需要几个参数:

pod 的模板:用来创建应用的 pod 模板,在需要的时候根据这个模板创建 pod replicas 副本数:要达到的目标状态,pod 需要运行几份 label:需要监控的 pod 的标签,通过比较 replicas 变量的值和标签实际发现的 pod 数量确定是否在目标状态

Services

service,也就是服务,是实际环境中对外提供服务的业务抽象。一个服务后端可能有多个容器提供支持,但是对外通过服务这一层只有一个接口,通过转发用户的请求到后端的应用上来实现。这样做的好处是:对外隐藏了后端的细节,使得扩展和维护变得更容易。

在 kubernetes 中,service 后面对应的是 pod,这种对应关系是通过 label 来匹配的。每个 service 会配置 label selector 对后端的 pod 进行选择,因此这种关系是动态的,pod 的添加和删除都会自动被关联进来。

service 是单独存在的,不必和 pod 或者 replication controller 绑定。即使后端没有 pod,service 的存在也是合法的,当对应的 pod 出现时,会动态的绑定到 service 上。

kubectl 常用命令

查看类命令

查看命令使用帮助

kubectl --help

指定 apiserver 地址

kubectl -s 10.78.170.101:9899

查看集群信息

kubectl cluster-info

查看各组件信息

kubectl get componentstatuses

查看命名空间下所有 pods

kubectl get pods --namespace=logstash

查看 pods 所在的运行节点

kubectl get pods(po) -o wide --namespace=logstash

查看 pod 日志

kubectl logs -f nginx-app-zibvs

查看 Replication Controller 信息

kubectl get replicationcontroller(rc) --namespace=logstash

查看 Service 的信息

kubectl get service(svc) --namespace=logstash

查看节点信息

kubectl get nodes(no)

查看 pod 的 endpoint

kubectl get endpoint(ep) --namespace=kube-system

查看 namespaces

kubectl get namespaces

操作类命令

创建

kubectl create -f 文件名

重建

kubectl replace -f 文件名  [--force]

删除

kubectl delete -f 文件名
kubectl delete pod pod名
kubectl delete rc rc名
kubectl delete service service名
kubectl delete pod --all
kubectl delete pod kube-dns-v20-f4npe --namespace=kube-system

动态调整 Replication Controller replicas

kubectl scale rc redis-slave --replicas=3

交互式进入容器

kubectl exec -ti scrmapp-mh0ax --namespace=logstash /bin/bash
comments powered by Disqus