先吹一波:
- 包括多层次的安全防护和准入机制
- 多租户应用支撑能力
- 透明的服务注册和服务发现机制
- 内建智能负载均衡器
- 强大的故障发现和自我修复能力
- 服务滚动升级和在线扩容能力
- 可扩展的资源自动调度机制
- 多粒度的资源管理能力
一、安装
- kubeadm是K8s集群全生命周期的管理工具,可实现集群部署、升级/降级、拆除
- 在线安装,集群
- 在线安装2,集群
- minikube、kubeadm、手动二进制-《容器即服务.从零构建企业级容器集群》
- kubeadm、二进制-《Kubernetes权威指南》
- kubeadm部署阿里源适合国内网络环境
- gcr.io镜像的替代
二、概念
- 干货概念-《容器即服务.从零构建企业级容器集群》
- 干活概念-《Kubernetes权威指南》
- 马哥 kubernetes进阶实践,非常实用
- Node、Pod、Replication Controller、Server、Deploytment、Job、DaemonSet 等都可以看作一种资源对象,几乎所有的资源对象都可以通过 Kubernetes提供的 kubectl 工具执行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。从这个角度来看,Kubernets 其实是一个高度自动化的资源控制系统,它通过跟踪对比 etcd 存储里保存的资源期望状态与当前环境中的实际资源状态的差异来实现自动控制和自动纠错的高级功能。
三、架构
- Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
- 一个全新的基于容器技术的分布式架构领先方案
- 为生产环境而设计的容器调度管理系统,
- 对于负载均衡、服务发现、高可用、滚动升级、自动伸缩等容器云平台的功能要求有原生支持
原由:
- 最基本的一个理由就是:IT 是新技术驱动行业
- 全面拥抱微服务架构
- 超强的横向扩容能力
Kubernetes主要由以下几个核心组件组成:
- etcd 保存了整个集群的状态;
- apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡;-
- Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
除了核心组件,还有一些推荐的Add-ons:
- kube-dns 负责为整个集群提供DNS服务
- Ingress Controller 为服务提供外网入口
- Heapster 提供资源监控
- Dashboard 提供GUI
- Federation 提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集、存储与查询
网络模型:
- Pod内容器通信 <-> Pod间通信 <-> Pod和Service通信 <-> 集群外部流量和Service通信
要求,所有Pod对象都位于同一平面网络中(不经NAT),且可使用Pod自身地址直接通信 - Pod IP:由网络插件负责管理和配置,实际存在于某个网卡,可为虚拟网卡
- Cluster IP:由集群负责配置和管理,即Service的IP,是虚拟IP地址,不存在于任何网络接口上,由kube-proxy借助iptables或ipvs重定向到本地端口,再调度至后端Pod对象
- 节点网络:真实网络,先于集群配置,集群不能管理
Pod网络:虚拟网络,配置于Pod中容器网络接口上,借助插件实现,插件可独立部署于集群外或托管于集群上
Service网络:虚拟网络,在集群创建时予以指定,各Service地址在创建时动态配置 - k8s pod的4种网络模式最佳实战
- Pod:由回环节口lo直接通信
每个Pod都分配了唯一的IP地址,称之为PodIP,一个Pod里的多个容器共享PodIP地址。要求底层网络支持集群内任意两个Pod之间的直接通信,通常采用虚拟二层网络技术来实现(Flannel)。 - VXLAN 全称是 Virtual eXtensible Local Area Network,虚拟可扩展的局域网
它是一种 overlay 技术,通过三层的网络来搭建虚拟的二层网络。
- ingress 七层代理
实际上这个ingress配置文件 会被翻译成nginx.conf
四、资源抽象
1、Pod
- 为最小调度单元,同一Pod中容器共享网络名称空间和存储资源,由回环节口lo直接通信
2、资源标签
- Label是将资源进行分类的标识符,是key/values数据,为指定对象提供辨识性属性
3、标签选择器
- Selector根据Label来过滤符合条件的资源对象,使用标签对资源对象进行分类,使用标签选择器挑选出它们
4、Pod管制器
- 通常不直接部署及管理Pod,而是借助控制器Controller进行管理
包括 ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等
- 长期伺服型(long-running) - 控制器为Deployment
- 批处理型(batch) - 控制器为Job
- 节点后台支撑型(node-daemon) - 控制器为DaemonSet
- 有状态应用型(stateful application) - 控制器为PetSet
Pod管理器:
- 复制控制器(Replication Controller,RC)是K8s集群中最早的保证Pod高可用的API对象
- 副本集(Replica Set,RS)对象一般不单独使用,而是作为Deployment的理想状态参数使用
- 部署(Deployment)表示用户对K8s集群的一次更新操作,我认为目前最常用的
- RC、RS和Deployment只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题
- 客户端需要访问的服务就是Service对象,service(服务)是分布式集群架构的核心,关键特征:
- 拥有一个唯一指定的名字(比如mysql-service)
- 拥有一个虚拟IP(Cluster IP、service IP或VIP)和端口号
- 能够提供某种远程服务能力
- 被映射到了提供这种服务能力的一组容器应用上
5、服务资源Service
- Service是Pod上的资源抽像,将标签选择器选定的一组Pod定义统一固定访问入口(IP及DNS名称),到达Service的请求将负载均衡到后端的各Pod
Service也可将集群外部流量引入到集群中
6、存储卷
- Volume分为临时卷、本地卷和网络卷,临时卷和本地卷位于Node本地,常用于数据缓存
7、Name和Namespace
- 同一Navespace下同一类型资源对象的Name必须唯一,逻辑分组,默认名称空间是default
8、注解Annotation
- 附加在对象上的键值类型数据,拥有更大的数据容量,不能用于标识和选择对象,主要用于方便工具或用户阅读和查找
9、Ingress
- 开放给外部访问
10、声明式思考
-
K8s中所有的配置都是通过API对象的spec去设置的,也就是用户通过配置系统的理想状态来改变系统,
-
Pod是K8s集群中所有业务类型的基础,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。
-
典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支持K8s集群运行的服务
五、kubectl 常用
命令
1、kubectl get po --查看微服务
2、kubectl get ns --查看命名空间
3、kubectl get cm–查看配置文件
4、kubectl get po -n ns名称–查看某一命名空间下的微服务
5、kubectl get pv --查看持久卷
6、kubectl get pvc --查看持久卷申请
7、kubectl logs -f 微服–查看微服日志
8、kubectl get cs–检查k8s集群是否健康
9、kubectl cluster -info --查看集群信息
10、kubectl get po -o wide–查看微服具体运行在哪个从节点node上。
11、kubectk get po -o yaml --查看pod的详细信息
12、kubectl get po -o json --以json的格式输出pod 信息
13、kubectl exec -it pod名 -n /bin/bash --进入pod
14、kubectl create 文件名.yaml --重建资源
15、kubectl apply -f 文件名.yaml --是配置文件资源重新生效
16、kubectl delete po -n --删除pod,让集群自动分配重启
17、删除各种资源
-
kubectl delete -f 文件名
-
kubectl delete pod pod名
-
kubectl delete rc rc名
-
kubectl delete service service名
-
kubectl delete pod --all
18、kubectl -n ns run gaogetest --images=镜像名称 --replicas=1, 部署pod在ns上
六、应用
1、在k8s进行管理应用(生命周期)的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用
2、kube-controler-manager 中的 node controller 模块 通过 apiservice 提供的监听接口,实时监控 node 机的状态信息; 当某个node 机器宕机,controller-manager 就会及时排除故障并自动修复。
3、node节点机上的kubelet进程每隔一段时间周期就会调用一次apiservice接口报告自身状态,apiservice接口接受到这些信息后将节点状态更新到ectd中。
kubelet也通过apiservice的监听接口监听pod信息,如果监控到新的pod副本被调度绑定到本节点,则执行pod对应的容器的创建和启动,如果监听到pod对象被删除,则删除本节点对应的pod容器。
七、卸载清理
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum clean all
yum remove kube*