什么是 Kubernetes ? Kubernetes在希腊语中是”舵手”的意思,应该是学习过的都听过的故事,以及K8S的由来这就不多讲了。K8S重要技术内容主要涵盖:集群架构、容器化应用部署、ScaleUp/Down、滚动更新、监控检查、集群网络、数据管理、监控与日志
Kubernetes 是一个用于管理基于容器的应用关联网络和存储组件的快速发展的平台。 主要关注应用负载,而不是底层基础设施组件。提供应用部署一个声明式方法,依赖于一组强大的管理维护API支撑。
可以构建并运行基于微服务的现代的、可移植的应用,使用K8S编排和管理应用组件。k8s支持无状态和有状态的应用,因为团队在微服务应用上取的进展。作为一个开发的平台,它可以支持根据你喜欢的编程语言、系统、组件库、消息体系来构建你的应用,包含有持续集成、持续交付的工具,可以通过K8S来计划和部署版本。 AKS 提供一个托管的K8S服务,可以降低应用部署和核心管理任务(升级协调)的复杂性,Azure平台管理AKS控制面板,你可以单独支付ASK 节点的费用来运行你的应用。
基础名词
-
Cluster
Cluster是计算、存储、网络资源的集合,利用资源运行各种基于容器的应用
-
Master
Master是Cluster的核心,负责调度、控制。 高可用版本,一般至少两个Master
-
Node
Node负责运行容器应用 由Master管理,Node负责监控和汇报容器状态 根据Master的要求管理容器的生命周期
-
Pod
Pod是K8S最小的工作单元,一个Pod会包含一个或多个容器Container Pod中的1个或多个容器会被Master调度到一个Node上面运行
Pod的特点: 1)可管理性 K8S中,Pod以最小的单元进行调度、扩展、共享资源、管理生命周期 2)通信和资源共享 同一个Pod中的容器,网络共享(拥有相同的IP和Port)、网络互通(等同于本地访问)、存储共享(等同于本地访问)
K8S通过Pod运行应用的实例, 一个Pod通常代表应用的一个实例,Pod和Container通常一个Container一个Pod,在高阶的场景中, 一个Pod也可以包含多个Container, 多container的容器将在一个Node上一起调度,共享资源。
当你创建Pod的时候,你可以定义指定明确的CPU和内存资源,Scheduler会尝试根据需求来寻找合适的Node来调度这些Pod,此外你也可以定义最大资源量,避免Pod将底层Node大量计算资源耗尽。最佳的方式就是针对所有Pod都定义资源上限,便于Scheduler可以确定必要和限制量的资源。
Pod的两种使用方式 1)运行单一容器 one container per pod 模式,是K8S最常见的模式,k8s通过管理Pod来管理容器
2)运行多个容器
联系十分紧密的两个容器,可以编排于同一个Pod中,他们资源和通信共享,两个容器的服务一起启动、一起停止
-
Controller 运行容器
K8S通过Controller管理Pod,Controller中定义Pod的部署特性
1)Deployment 最为常见的Pod的部署方式,可以管理多Pod副本 Deployments and YAML manifests 一个Deployment代表运行在K8S Deployment Controller的相同Pod,定义了Pod的副本,Scheduler会确保如果Pod所在的Node出现问题,能尽快将Pod调度到另外健康的Node上 可以更新Deployment的配置,来修改Pod的配置,使用的镜像,额外的存储。 Deployment Controller主要负责:
- 削减或终止副本
- 从部署定义文件创建副本
- 持续处理直到所有副本均被更新
2)ReplicaSet 实现Pod的多副本管理,通常使用Deployment创建Pod的时候会自动创建ReplicaSet,通过ReplicaSet来管理Pod,通常不直接创建ReplicaSet
3)DaemonSet 用在一个Node只运行一个Pod副本的情况,守护进程,通常处理一些指定的监控和日志的服务,需要在多个Node或指定Node上,在集群启动之后正常应用部署之前,会启动DaemonSet。 通过在YAML文件中定义
kind: DaemonSet
4)StatefulSet 能够保证Pod的每个副本在整个生命周期中的名称是不变的,不因重启而变化,其他Controller不具备这样的特点。 通过在YAML文件中定义
kind: StatefulSet
5)Job 用于运行结束就删除的应用,其他Controller会长期运行
-
Service 访问容器
Pod间通过IP通信,但是Pod的重启都会导致IP变化,为了能够正常通信,就要依靠Service
Service定义了一组外部访问Pod的方式,Service有自己的Ip和端口,为Pod提供负载均衡
-
Namespace
Namespace可以将一个物理Cluster划分为多个虚拟Cluster,资源完全隔离
K8S默认的Namespace为
- kube-system 存放默认集群所需资源,比如DNS和代理、K8S仪表盘,一般不会将业务应用放到这个空间下
- default 默认创建资源被分配的空间,不主动指定Pod或者Deployment的所属空间会默认归为default, 如果资源查询不指定空间名也默认default
- kube-public 通常不会使用,但是如果需要将资源暴露给整个集群、被所有用户可查看,那么可以定义
RBAC
如果对于K8S中各项资源想要做更细粒度的权限控制,例如认证、授权、安全校验、访问控制,可以使用K8S 的基于角色的访问控制RBAC,可以给用户、组、服务账户做特定的授权
- Roles/ClusterRoles: 在授权之前,首先需要定义角色。Role主要针对某个命名空间内的权限,ClusterRole可以针对整个集群内的权限,或一个指定的空间内。注意只能授权,并不能限制
- RoleBindings/ClusterRoleBindings: Role定义好之后,只需要定义RoleBinding 就可以将角色的授权在某一个命名空间上生效。对应ClusterRole使用ClusterRoleBinding来定义。ClusterRoleBinding由于是用于整个集群的,所以一般用于授权超级管理员或者支撑工程师
- ServiceAccounts: 在K8S中 service accounts 是一种主要的用户类型,service account的授权凭证以secret的形式在K8S中存储,授权的Pod可以允许与API Server交互。
如何搭建一个K8S集群
所有节点安装Docker环境
安装kubelet kubeadm kubectl
在Cluster节点上,安装kubelet,负责启动Pod和容器 在Cluster节点上,安装Kubeadm,负责初始化Cluster 在所有节点上,安装kubectl,负责部署和管理应用,查看各种资源,创建、删除、更新组件
kubeadm 初始化Cluster
-
初始化Master
kubeadm init --apiserver-adverties-address= --pod-network-cidr=
1) kubeadm 执行初始化前检查 2) 生成token和证书 3) 生成kubeConfig配置文件,kubelet使用这个文件和Master通信 4) 安装Master组件,下载Docker镜像 5) 安装kube-proxy和kube-dns组件 6) 安装kubectl 7) 安装Pod网络环境,尝试使用Flannel作为基础网络架构 8) 向Cluster注册节点,单独Master和Node节点,将Node注册到Master
kubectl join --token ip:port
token可以通过 kubeadm token list 进行查看
kubectl get nodes 确认 Node节点加入成功
-
查看Pod具体状态
kubectl get pod --all-namespace
Pod状态:
- Pending 未就绪
- ContainerCreating 未就绪
- ImagePullBackOff 未就绪
- Running 就绪
查看Pod启动具体日志
kubectl describe pod [podname]