您的位置:首页 > 运维架构 > 网站架构

Kubernetes基本术语与架构

2016-02-24 19:54 417 查看
1.node


被master管理的可以是物理机也可以是虚拟机,上面运行kubelet(用来启动和管理Pod)。
node上运行的服务有:kubelet、kube-proxy、docker deamon。
node的状态有running、pending、terminated。
通过kube-controller-manager管理nodes:集群内nodes信息同步和单个node生命周期管理。
配置文件/etc/kubenetes/kubelet,启动kubelet后可以自动向master注册,也可以手动管理node。

获取kubernetes集群中管理的nodes
[root@centos-master kubeguide]# kubectl get nodes

NAME            LABELS                                 STATUS    AGE

centos-master  
kubernetes.io/hostname=centos-master   Ready     4d
centos-minion  
kubernetes.io/hostname=centos-minion   Ready     4d

查看node状态

2.Pod

可以看作是容器的“豌豆荚”或LogicalHost,Pod内的container是紧耦合的,pod中的容器共享同一个主机名,可以互相通信、看到其他进程的PID,能够访问同一个IP和端口范围、共享Volumes。
使用yaml或json对node定义。pod生命周期是Replication Controller来管理的。

3.Label

Label用来给对象分组。Label是通过key-value方式在创建对象的时候附属在对象上的。其他对象可以通过Label Selector选择作用对象。Lebel也可以在对象创建后通过API来管理。
一个Pod可以定义多个Labels,可以把Lebel Selector看作SQL查询语句中的where条件查询。

4.Controller Manager

CM内部包含Replication Controller、Node Controller、ResourceQuota Controller、Namespace Controller、ServiceAccount Controller、Token Controller、Service Controller、Endpoint Controller。
定义Pod副本数量,自动创建、监控和启停pod,实现集群的高可用性。通过修改RC可以实现Rolling Update。
删除RC不会影响通过该RC创建的Pod。为了删除所有pod,可以先将relicas值设置为0然后更新该RC。也可以通过kubectl stop和delete一次性删除RC和RC控制的Pods。

5.Service

Service可以看作一组提供相同服务的Pod的对外访问接口。Service作用于哪些Pod通过Label Selector来定义。
Service定义yaml实例如下:
apiVersion: v1

kind: Service

metadata:

  name: frontend

  labels:

    name: frontend

spec:

  type: NodePort

  ports:

  - port: 80

    nodePort: 30001

  selector:
    name: frontend 
外部访问Service为集群外的客户端服务需要公共IP,可以通过Service中的NodePort和LoadBalancer来实现。
使用kubectl get endpoints命令可以看到frontend service的endpoints。
Endpoints即外部服务端访问service时访问的对应的cluster的后端端口,是cluster需要对外暴露的端口号。在service的定义文件中配置可以对外暴露多个端口。
每一个启动了frontend的pod都会打开80端口。
[root@centos-master kubeguide]# kubectl get endpoints

NAME           ENDPOINTS                                    AGE

frontend       172.17.0.10:80,172.17.0.7:80,172.17.0.8:80   3h

kubernetes     10.10.3.184:6443                             5d

redis-master   172.17.0.3:6379                              23h
redis-slave    172.17.0.3:6379,172.17.0.4:6379              21h

6.Volume

Volume是pod中能够被多个容器共享的目录,与pod的生命周期相同,与容器的生命周期不相关。即使容器停止或重启volume中的数据也不会丢失。
Volume提供的类型有:
EmptyDir:临时空间,目前用户无法控制存储介质(即用户还无法设置存储在硬盘、SSD、还是基于内存的tmpfs上)。
hostPath:在Pod上挂载宿主机的文件或目录。
gcePersistentDisk:使用Google Compute Engine上永久磁盘上的文件。
awsElasticBlockStore:使用AWS的EBS Volume。
nfs:使用NFS提供的共享目录挂在到pod中。
iscsi:使用iSCISI存储设备上的目录挂载到pod中。
glusterfs:使用开源GlusterFS网络文件系统的目录挂载到pod中。
rbd:Linux块设备共享存储(Rados Block Device)
gitRepo:通过挂载一个空目录,并从GIT库clone一个git repository以供pod使用。
secret:secret volume提供加密信息,通过tmfs实现,不会被持久化。
persistentVolumeClaim:从PV(PersistentVolume)中申请所需空间,PV通常是网络存储,如GCE、AWS等。

7.Namespace

用于逻辑上划分不同项目、小组、用户组。Kubernetes集群启动后会有一个default分组。创建pod的时候可以指定属于那个namespace。
[root@centos-master kubeguide]# kubectl get namespaces

NAME      LABELS    STATUS    AGE
default   <none>    Active    5d
kubectl get pods命令如果不加任何参数的话只显示default namespace,可以通过--namespace=spacename方式查询spacename分组的pods。
使用namespace可以管理多租户,资源配额。

8.Annotation

Annotation是用户任意定义的附加信息,便于外部工具查找。

架构图

老版本中node被叫做minion。

API Server:操作资源对象的唯一入口。其他对象必须通过它提供的API操作资源数据。提供restful接口。
Controller Manager:集群内部的管控中心,故障检测,自动化恢复。
Scheduler:调度器,pod在集群node间的调度。
Kubelet:负责本node节点上的pod的增加、删除、监控、修改等全生命周期管理。内嵌Google的另外一个开源项目cAdvisor,实时监控docker上运行的容器的性能指标。实际调用API server的restful接口。
Proxy:Service的代理,kubectl proxy是API server的反向代理,kubernetes集群外部的客户端可以通过kubectl proxy来访问API server。

通过查看etcd中的目录结构也对kubernetes中的组件可见一斑。

[root@centos-master kubeguide]# etcdctl --endpoint
http://10.10.3.184:2379 ls /registry/

/registry/pods

/registry/events

/registry/minions

/registry/namespaces

/registry/ranges

/registry/serviceaccounts

/registry/services
/registry/controllers
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息