Kubernetes简介
在Docker作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用;Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训;Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户
Kubernetes的好处:隐藏资源管理和错误处理,用户仅需要关注应用的开发;服务高可用、高可靠;可将负载运行在由成千上万的机器联合而成的集群中
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etcd),一切都基于分布式的存储系统
Kubernetes主要由以下几个核心组件构成:
etcd:保存了整个集群的状态
apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的集群节点上
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
除了以上核心组件,还有一些推荐的Add-ons:
kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外网入口
Heapster:提供资源监控
Dashboard:提供GUI
Federation:提供跨可用区的集群
Fluentd-elasticsearch:提供集群日志采集、存储与查询
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为以下两个范畴
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等 Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
Kubernetes集群搭建
环境:
server131主机配置docker的私有仓库 IP=172.25.100.131
server132主机作为集群的master端 IP=172.25.100.132
server133主机作为集群节点 IP=172.25.100.133
server134主机作为集群节点 IP=172.25.100.134
部署:
关闭所有主机的selinux和iptables防火墙
所有集群主机部署docker引擎:yum install -y docker-ce
所有集群主机禁用swap分区:swapoff -a && 注释掉/etc/fstab文件中的swap定义
配置集群所有节点的私有仓库指向并重启docker使之生效
复制证书文件至节点的docker配置目录下,重启节点的docker服务
集群所有节点登陆私有镜像仓库,以便后续实验需要
所有节点安装部署软件kubeadm、kubectl、kubelet
##kubelet运行在集群所有节点上,负责启动POD和容器;kubeadm是一个能快速部署kubernetes集群的工具,用于初始化集群;kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件
##查看默认kubernetes集群配置信息
##列出配置kubernetes集群所需镜像,默认从k8s.gcr.io上下载组件镜像,此镜像源在外网,需要翻墙,但可以通过修改镜像源为国内aliyun的镜像源
##从国内aliyun镜像源拉取集群所需镜像
##在集群master端初始化集群
##指定kube配置文件启动集群,此条命令出现在初始化集群时的输出中;也可在文件中配置此环境变量,以免重启主机时每次手动声明
##对于普通用户可通过以上方式进行配置文件的声明
##配置kubectl命令补齐功能
##集群节点扩容,此时所有节点均未就绪;此条命令也出现在初始化集群的输出中
##下载flannel网络组件的资源文件,更改其中的镜像指向;此文件也在外网:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
##在镜像仓库主机拉取flannel组件需要的镜像并上传至仓库(需在浏览器页面中新建项目)
##在集群master端应用flannel网络组件的资源文件,此时集群中的所有节点均为就绪状态,集群的核心dns服务也正常启动
至此我们的一主两节点的kubernetes集群就搭建完成了
Pod管理
kubectl命令指南:
Kubectl Reference Docshttps://kubernetes.io/docs/reference/generated/kubectl/kubectl-commandsPod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip
一个pod类似一个豌豆荚(如上图),包含一个或多个容器(通常是docker容器),多个容器间共享IPC、Network和UTC namespace
##创建pod,查看其被分配至哪个集群节点,也可使用kubectl describe pod nginx查看此pod的详细信息
##由上图知道此pod指派给了server134主机,即在此主机上拉取了nginx镜像(确保自己搭建的仓库中有镜像)
##集群内部任意节点可以访问Pod,但集群外部无法直接访问(server131主机为仓库主机,不属于集群)
##删除pod,查看所有namespace
##同一namespace下的不同pod可以直接访问,--restart=Never表示pod退出后不让其此自动重启,默认的pod重启策略为always
初识控制器:
##创建副本数始终为2的控制器controller1,会生成两个pod;controller1-6f8ddbdb7c-nc9nw分别可以理解为:控制器名称,控制器的标识,pod副本的标识
##删除控制器下的pod副本,控制器会自动启动一个新的pod顶上来,并且会重新获取新的IP,因为之前设置其的副本数始终为2
##删除控制器,其下pod被彻底删除
##pod的扩容与缩容
##更新pod镜像
##查看pod镜像的历史版本(基于--record参数才可看到历史版本),回滚镜像版本
初识service:
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务
##创建service,此时pod客户端可以通过service的名称访问后端的三个Pod;ClusterIP: 默认的service类型,会自动分配到一个仅集群内部可以访问的虚拟IP
##通过此虚拟IP访问时可以实现负载均衡效果
##将服务类型更改为NodePort形式,此时集群外部即可访问pod;也可通过参数--type=NodePort在创建service时指定类型
##NodePort类型是在在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:NodePort来访问该服务
资源清单
在kubernetes中,一般使用yaml格式的文件来创建符合我们预期的pod,这样的yaml文件一般称为资源清单;什么叫资源?kubernetes中所有的内容都抽象为资源,资源实例化之后叫做对象
在kubernetes中有哪些资源?
工作负载型资源(workload):Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、CronJob(ReplicationController在v1.11版本被废弃)
服务发现及负载均衡型资源(ServiceDiscovery LoadBalance):Service、Ingress、...
配置与存储型资源:Volume(存储卷)、CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器)
以上这些资源都是配置在命名空间级别
集群级资源:Namespace、Node、Role、ClusterRole、RoleBinding(角色绑定)、ClusterRoleBinding(集群角色绑定)
元数据型资源:HPA(Pod水平扩展)、PodTemplate(Pod模板,用于让控制器创建Pod时使用的模板)、LimitRange(用来定义硬件资源限制的)
资源清单的格式:
apiserver:group/version
##指明api资源属于哪个群组和版本,同一个组可以有多个版本,如果没有给定group名称,那么默认为core;可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind:标记创建的资源类型,k8s主要支持以下资源类别:Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjob
metadata:元数据
name:实例化的对象名称
namespace: