Docker容器与虚拟化技术——kubernetes详解之概念与命令

                                       Kubernetes详解——概念与命令

一、简介
        Kubernetes是Google公司于2014年基于内部集群管理系统Borg开源的容器集群管理项目。该项目基于Go语言实现。它的前身Borg在Google内部已经应用十几年,积累了大量来自生产环境的宝贵实践经验。官网:https://kubernetes.io,维护:https://github.com/kubernetes/kubernetes

1、优势:
    (1)优秀的API设计,以及简洁高效的架构设计,主要组件个数很少,彼此之间通过接口调用
    (2)基于微服务模式的多层资源抽象模型,兼顾灵活性与兼容性,Pod模型被许多平台借鉴
    (3)可拓展性好,模块容易替换,伸缩性极佳,1.2.0版本但集群支持1000个节点,同时运行30000个Pods
    (4)自动化程度高,真正实现所得及所需,用户通过模板声明服务后,生命周期是自动化管理
    (5)部署支持多种环境,包括虚拟机、裸机,还很好的支持常见云平台,包括AWS、GCE等
    (6)支持丰富的运维工具,方便用户对集群进行性能测试,问题检查和状态监控
    (7)自带控制台,客户端命令等工具,允许用户通过多种方式与Kebernetes集群进行交互

二、核心概念
        首先是集群组件,从架构上看,kubernetes集群(cluster)采用了典型的主从架构。一个集群主要由管理组件(master)和工作节点(node)组件组成。
另外,kubernetes集群的主要任务始终围绕着应用的生命周期。通过将不同资源进行不同层次的抽象,kubernetes提供了灵活可靠的生命周期管理。
1、资源的核心抽象主要包括:
    (1)容器组(Pod):由位于同一几点上若干容器组成,彼此共享网络命名空间和存储卷。Pod是Kubernetes中进行管理的最小资源单位,是最基础的概念。跟容器类似,Pod是短暂的,随时可变的
    (2)服务(Service):若干(往往是同类型的)Pod形成的对外提供某个功能的抽象,不随Pod改变而变化,带有唯一固定的访问路径,如IP地址或域名
    (3)复制控制器(Replication Controller):负责启动Pod,并维护其健康运行的状态。是用户管理Pod的句柄
    (4)部署(Deployment):创建Pod,并根据参数自动创建管理Pod的复制控制器,并支持升级
    (5)横向Pod扩展器(Horizontal Pod Autoscaler,HPA):类似云里面的自动扩展组,根据Pod的使用率(典型如CPU)自动调整一个部署里面Pod的个数,保障服务可用性

2、辅助概念
    (1)注解(Annotation):键值对,可以存放大量任意数据,一般用来添加对资源对象的详细说明
    (2)标签(Label):键值对,可以标记到资源对象上,用来对资源进行分类和筛选
    (3)名字(Name):用户提供给资源的别名,同类资源不能重名
    (4)命名空间(Namespace):指资源的空间,避免不同租户的资源发生命名冲突,另外可以进行资源限额
    (5)持久卷(PersistentVolume):类似于Docker中数据卷的概念,就是一个数据目录,Pod对其有访问权限
    (6)秘密数据(Secret):存放敏感数据,例如用户认证口令等
    (7)选择器(Selector):基于标签概念的一个正则表达式,可通过标签来筛选出一组资源
    (8)Daemon集(DaemonSet):确保环节上肯定运行某个Pod,一般用来采集日志和监控节点
    (9)任务(Job):确保给定数目的Pod正常推出(完成了任务)
    (10)入口资源(Ingress Resource):用来提供七层代理服务
    (11)资源限额(Resource Quotas):用来限制某个命名空间下对资源的使用
    (12)安全上下文(Security Context):应用到容器上的系统安全配置,包括uid、gid、capabilities、SELinux角色等
    (13)服务账号(Service Accounts):操作资源的用户账号

三、集群组件
1、Master组件
        提供所有与管理相关的操作,例如调度、监控、支持对资源的操作等
        Master会通过Node Controller来定期检查所管理的Node资源的健康状况,完成Node的声明周期管理

2、Node组件
        实际工作的计算实例。可以是虚拟机或物理机,在创建Kubernetes集群过程中,都要预装一些必要的软件来相应Master的管理。
       Node节点有几个重要的属性:
    (1)地址信息
        ①主机名(HostName):节点所在系统的主机别名,基本不会用到
        ②外部地址(ExternalIP):集群外部客户端可以通过该地址访问到节点
        ③内部地址(InternalIP):集群内可访问的地址
    (2)阶段状态
        ①待定(Pending):创建新节点,还未就绪状态,需要进一步配置
        ②运行中(Running):正常运行中的节点,可被分配Pod,会定期汇报运行状态消息
        ③终止(Terminated):节点已经停止,处于不可用窗台,判断条件为5分钟内未收到运行状态信息
    (3)资源容量:常见操作系统资源,如CPU、内存、最多存放的Pod个数等
    (4)节点信息:包括操作系统内核信息、Kubernetes版本信息、Docker版本信息等,会由kubelet定期汇报

四、资源抽象
        Kubernetes对集群中的资源进行了不同级别的抽象,每个资源都是一个REST对象,通过API进行操作,通过JSON/UAML格式的模板文件进行定义。在使用Kubernetes的过程中,要注意积累这些模板文件。在Kubernetes代码包的example目录下自带了十分详实的实例模板文件。
1、容器组(Pod
        Kubernetes中,并不直接操作容器,最小的管理单位是Pod。它由一个或多个容器组成,Kubernetes围绕容器组进行创建、调度、停止等生命周期管理
        同一个容器组,各个容器共享命名空间(包括网络、IPC、文件系统等)、cgroups限制和存储卷。可以简单将一个Pod当做是一个抽象的虚拟机,里面运行若干个不同的进程
        现实上,是先创建一个google_containers/pause容器,创建相关命名空间,然后创建Pod中的其他容器,共享pause容器的命名空间
容器组的经典应用场景:
    (1)内容管理、文件和数据加载,缓存管理等
    (2)日志处理,状态快照等
    (3)监控代理,消息发布
    (4)代理机制,网桥、网卡
    (5)控制器,管理器,配置以及更新
容器组声明周期:
    待定:Pending,已经被系统接收,但容器镜像还未就绪
    运行:Running,分配到节点,所有容器都被创建,至少一个容器在运行中
    成功:Succeeded,所有容器都正常退出,任务完成
    失败:Failed,所有容器都退出,至少一个容器非正常退出
    未知:Unknown,未知状态,例如所在节点无法汇报状态
    
2、服务(Service
        kubernetes主要面向的对象是持续运行,且无状态的,服务的提出主要是解决pod地址可变的问题。可以用一个服务来代表提供某一类功能的一些pod,并分配不随pod位置变化而改变的虚拟访问地址ClusterIP。
现实上通过kube-proxy进行,将到某个service的访问代理或者均衡到具体的pod上,同时会为每一个服务创建环境变量,指向集群地址。


五、辅助概念
1、标签(Label)
    用来标记所绑定的对象(如Pod)的识别属性,进而可以分类。

2、注解(Annotation)
    用于给对象增加更加丰富的描述信息,常见的如时间戳、发行信息、开发者信息等

3、选择器(Selecter)
    通过指定标签键值来过路特定资源对象

4、持久卷(PersistentVolume)
    即容器挂载的数据卷,常见类型有:
        emptyDir:当pod创建的时候,在节点上创建一个空的挂载目录,挂载到容器内,Pod退出后,数据会被自动删除
        hostPath:将节点上某已经存在的目录挂载到Pod中,Pod退出后,数据会堡垒
        gcePersistentDisk:使用GCE的EBS Volume服务
        awsElasticBlockStore:使用AWS的EBS Volume服务
        nfs:使用nfs协议的网络存储
        gitRepo:挂载空目录到pod,然后clone指定的git仓库代码到里面,适用于直接从仓库中给定版本的代码来部署应用
        secret:用来传递明爱信息,基于内存的tmpfs,挂载临时的秘密文件

5、秘密数据(Secrt)
    用来保存一些敏感数据,pod使用该数据时直接调用secret的别名即可

6、UID和Name
    kubernetes用UID和Name来标识对象。UID是全局唯一,并且不能复用;Name在同一个命名空间内是唯一的,且当资源移除后,其名字可以被新资源复用

7、命名空间(Namespace)
    用来隔离不同用户的资源,同一个命名空间内资源不能重名。kubernetes集群启动后会保留两个特殊命名空间:
        default:资源未指定命名空间的情况下,默认属于该空间
        kube-system:由kubernetes系统自身创建的资源
    另外,大部分资源都属于某个命名空间,但部分特殊资源如节点、持久存储等不属于任何命名空间


六、重要组件
1、Master节点
    (1)Etcd:最为数据库,存放所有集群相关数据
    (2)kube-apiserver:kubernetes系统的对外接口,提供RESTful API供客户端和其他组件调用,支持水平扩展
    (3)kube-scheduler:负责对资源进行调度,具体负责分配某个请求的Pod到某个节点上
    (4)kube-controller-manager:对不同资源的管理器,包括节点管理器、复制管理器、服务管理器、权限管理器等
    (5)kube-ui:自带的一套用来查看集群状态的web界面
    (6)DNS:记录启动的容器组和服务地址

2、Node节点
    (1)kubelet:节点上最主要的工作代理,汇报节点状态并实现容器组的声明周期管理
    (2)kube-proxy:代理对抽象的应用地址的访问,负责配置正确的转发规则
    (3)容器引擎:支持Docker、rkt
    (4)辅助组件:supervisord用来保持kubelet和docker进程运行,fluentd用来转发日志等


七、kubectl命令详解
1、命令格式:kubectl [global-flags] [subcommand] [RESOURCE_TYPE] [NAME] [subcommand-flages]
    (1)subcommand:要执行的动作,如get、describe、create、delete等
    (2)NAME:某个资源类型下面的若干对象名称
    (3)RESOUCE_TYPE:要操作的资源类型
        ①cs|componentstatuses:组件状态
        ②ds|daemonsets:daemon集
        ③deployments:部署
        ④events|ev:事件
        ⑤endpoints|ep:服务端点
        ⑥horizontalpodautoscalers|hpa:pod自动扩展器
        ⑦ingresses|ing:7层服务访问入口
        ⑧jobs:任务,确保成功完成的pod达到某个数目
        ⑨limitranges|limits:限制的范围
        ⑩nodes|no:node节点
        ⑪namespaces|ns:命名空间
        ⑫pods|po:pod资源
        ⑬persistentvolumes|pv:持久化存储卷
        ⑭persistentvolumeclaims|pvc:持久化存储卷申明
        ⑮replicationcontroller|rc:复制控制器
        ⑯resourcequotas|quota:资源的配额
        ⑰secrets:秘密数据
        ⑱serviceaccounts:服务的账户
        ⑲services|svc:服务

2、全局参数
        这些参数主要是配置命令执行的环境信息,可以在执行具体子命令时使用
    (1)日志相关
        --alsologtostderr=false:日志信息同时输出到表春做出输出和文件
        --log-backtrace-at=:0:每输出若干航日志就打印一条backtrace信息用来追踪调用栈
        --log-dir=:存储日志文件到指定目录
        --log-flush-frequency=5s:执行日志消息刷新的间隔
        --logtostderr=true:日志信息输出到标准错误输出,不输出到文件
        --stderrthreshold=2:超过等级的日志信息输出到标准错误输出
        --v=0:日志输出等级
        --vmodule=:对日志进行过滤时的模式设置
    (2)认证相关
        --certificate-autority=””:CA认证的cert文件路径
        --client-certificate=””:TLS认证时需要的客户端证书文件
        --client-key=“”:TLS认证时需要的哭护短秘钥文件
        --insecure-skip-tls-verify=false:不检查服务端的TLS认证信息
        --password=“”:API服务端采用基本认证时的密码
        --username=“”:API服务端基本认证时的用户
        --token=“”:API服务端的token认证信息
    (3)其他配置
        --api-version=“”:指定API版本
        --cluster=“”:配置集群名称
        --context=“”:当前操作的集群名称
        --kubeconfig=“”:kubeconfig文件路径
        --match-server-version=false:要求服务端版本跟本客户端版本一致
        --namespace=“”:请求的命名空间
        -s,--server=“”:kubernetes API服务端的地址和端口
        --user=“”:kubeconfig user使用的用户名
        --validate=false:发送请求前是否先在客户端进行效验

3、子命令
    (1)get:显示给定资源的信息
        格式:kubectl get
        --all-namespaces:是否列出所有命名空间中的资源
        -L,--label-columns=[]:通过标签来过滤显示的资源
        -o,--output=“”:输出信息的格式,包括json|yaml|template|templatefile|wide
        -l,--selector=“”:通过selector来过滤输出
        -t,--template=“”:模板字符串或golang模板文件路径
        -w,--watch=false:持续监测输出对象的变化
    (2)describe:显示给定资源的详细信息
        -l,--selector=“”:通过selector来过滤输出,如-l name=mysql
    (3)create:创建一个资源
        -f,--filename=[]:模板文件路径或URL
    (4)replace|update:替代/跟新一个资源
        -f:模板文件路径
        --grace-period=-1:资源平缓终止的等待时间
        --force=false:删除并重建指定资源
    (5)patch:更新一个资源的域信息,即给资源打补丁
        -p,--patch=“”:补丁内容,如
        kubectl patch node node1 -p ‘{“spec”:{“unschedulable”:true}}’
    (6)delete:删除一个资源
        --all=false:选取所有指定资源
        -f:资源模板文件路径或URL
        --grace-period=-1:资源平缓终止的等待时间
        --ignore-not-found=false:忽略没找到资源情况下的报警信息
        -l:通过selector过滤资源
        --timeout=0:等待超时,0表示从删除对象大小来计算超时时间
    (7)edit:调用本地编辑器,直接编辑API资源
        -f:模板文件路径
        -o:输出资源格式,json|yaml
        --output-version=“”:输出指定版本的API
        --record[=false]:记录kubectl命令到资源的注解中
        --save-config[=false]:保存配置信息到资源注解中
        --windows-line-endings[=false]:使用windows格式的换行符
    (8)apply:应用配置到给定资源,有则更新无则创建
        -f:模板文件路径
        -o:输出模式
        -record:记录kubectl命令到资源的注解中
        --schema-cache-dir=“~/.kube/schema”:API的scheme文件路径
        --validate[=true]:执行命令前是否使用scheme对输入进行效验
    (9)logs:打印某个pod中容器的logs信息
        -c,--container=””:容器名
        -f,--follow=false:是否持续跟踪
        --interactive=true:是否支持交互
        -p,--previous=false:输出此前(已停止)容器实例信息
    (10)exec:在给定pod中执行命令,类似docker的exec命令
        -c:指定容器名
        -p:pod名称
        -i:将标准输入接通到容器
        -t:标准输入是tty类型
    (11)port-forward:映射本地端口到pod
        格式:kubectl port-forward POD [local_port:]remote_port ……
        -p:pod名称

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值