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名称
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/83376.html