K8s-基础概念(容器,镜像,k8s组件)
kubernets
一、容器技术简述
1.1 it技术发展趋势
基础服务系统进化
xen半虚拟化
kvm 以硬件虚拟化为代表
物理机-->以kvm xen 虚拟化,虚拟机时代(vmware的时代)运维的生存工作:资源管理(资源购买), -->2013年 以docker为代表的容器部署初出江湖,
docker容器的出现解决了 底层硬件,操作系统内核不同,软件开发及部署的问题,实现一次打包,多平台运行。)
1.2 docker相关概念
- docker是什么?
docker为容器的一种manager,通过内核域名空间技术namespace(Mount挂载点文件系统、UTS主机名和域名、IPC信号量,消息队列,共享内存、Network网络设备 和 User用户及组 )以及Cgroup来分配内存,cpu等 来在宿主机上隔离容器, docker最大的有点是创造了image!
- docker image 是什么?
docker image:打包构建的一种机制,通过分层构建的机制,overlayfs2技术联合挂载机制的存储驱动。只有最上面的一层才能更改,分层概念。image没有运行之前就是一个文件系统,运行起来之后就被叫做容器。docker image 依靠一个唯一id号的进程docker daemon进行管理。
- docker image and docker image registry
docker host需要启动一个container需要本地存放了有imager,如果没有,则需要有一个 docker registry。
docker registry :
可能包含很多仓库,仓库中可以包含多个仓库
例如 nginx
nginx1.8/nginx imager
nginx1.8.1/nginx imager
- docker对象
docker 客户端可以针对容器对象进行增删改查一系列请求来进行处理,可以通过映射到http协议通过get post 等方法来实现。docker对象:container,imager ,network ,volume(数据卷存储)
- docker network网络类型:
docker安装之后会在宿主机上生成一个网桥,172.17.0.1,当启动一个容器之后会通过网桥生成一个通信ip。
1、none:不使用网络
2、bridge:桥接到宿主机网络
3、host:直接共享宿主机network namespace
4、container模式,新创建的容器与指定的容器共享一个namespace,和指定的这个容器共享ip,port
-
主机间通信
1,暴露网络端口:两个主机通信将网络暴露出来,在宿主机上使用dnat,映射到宿主机上的端口,这样比较复杂。由此出来叠加网络。
2,叠加网络,在docker宿主机之间建立网络通信。由于网络通信问题,造成网络通信弊端。3,宿主机路由模式:在宿主机上维护路由表,通过路由表来选路,容器只需要关心目的地址,将请求发送到宿主机,通过宿主机路由表来选路去目的主机去,这中间利用的路由原理,这种情况必须要所有宿主机都要存放一个路由关系的路由表来记录所有容器之前的关系,以及主机与主机之间的关系,所以需要有一个注册中心来维护宿主机的路由表。比如在新添加了一台宿主机,来进行启动container 进程,新添加的这台宿主机需要将其路由添加到注册中心。
注意:
容器本地不要保存任何数据,动态数据必须放在共享存储或者远程存储之上。
- 容器编排系统
ansible就是传统上的编排工具,可以将一系列的手工工作统一编排到一起。
容器编排比传统意义上要强大的多,不仅是容器创建,镜像存储,还包括要解决网络通信以及数据存储,生命周期等由此,kubernets油然而生~
二、kubernets
三大编排工具:
1、K8S:
诞生:谷歌将自己Brog通过自己的开发语言go重新开发了一版容器编排工具 kubernets 简称K8S。谷歌将其交给CNCF管理。
小故事:谷歌自己成立的Istio服务网格基金会 不再信任CNCF
2、docker swarm
3、mesos(18-19年落幕)+marathon(推特)
2.1、K8S是什么?
把底层物理机的资源集合起来把资源抽象成资源池,通过吧资源池抽象给管理端,客户不需要关心服务运行在哪个资源之上。
运维成长到最后要成为operator
operator:运维工程师代码话(k8s上的最优秀的运维工程师的经验集合代码)
2.2 k8s组件
operator,master node, worker node
-
master node: 控制平面
-
APIServer:kube-apiserver执行程序,就是一个数据库,定义了数据库的存储文档格式以键值的方式存在,将其存储到etcd插件中持久化保存。是k8s总线,所有组件都是通过这个来协调,apiserver主要来存储状态,自己不存储,存储在第三方插件etcd中。etcd采用raft协议,支持数据强移至集群,基于K/V结构,强一致集群容易脑裂,所以需要做成集群,至少三个或多个节点组件的集群,apiserver也需要进行冗余负载,所以apiserver构建集群需要做成具体的几个实例,在apiserve之前需要做负载均衡器,在负载均衡器之前也需要做四层负载均衡机制 冗余,使用nginx采用keeplive做高可用,apiserver健康与否需要前端四层负载均衡进行健康状态监控
-
controller manager:kube-controller-manager ,实现了所有K8S的工作,运维操作代码化实现最终实现就是在这里进行实现,由大量controller组成,controller 。定义运行的对象,比如nginx容器,controller将其告诉给apiserver进行存储,api创建3个容器,scheduler通过查看3个容器没有进行调度,然后将器需求发送给kubelet。
-
scheduler:运行应用,所有组件都是围绕POD更好的运行而实现的,以应用为中心。scheduler时刻关注每个节点的资源量,坐到能够为运行pod挑选一个最合适的运行环境。程序名称为kube-scheduler。多控制平面节点。
-
service对象:每一个资源对象都有标签,同一组的pod一定有一样的标签,service通过标签选择器label selector 去匹配pod,通过apiserver可以查到,service监控apiserver相关的标签pod。apiserver为通信总线。
-
scheduler:调度器,核心目的就是去调度POD,运行应用,监控着当前环境所有资源的运用量,以及所需要运行的pod所需要的资源及环境的量。
-
Etcd:状态存储
-
work node:数据平面。执行控制平面所下发的指令。
kubelet:由控制节点外派到各个worknode上的一个用于执行控制节点所发出的功能控制。基于tcp https协议监听apiserver自己注册的状态,一旦与自己有关,便在自己身上去执行一些操作,以对应最新注册状态。
-
kubelet组件,控制平面派出到每个节点上的agent。
CNI容器网络接口:network plugins 网络插件才能进行网络通信
CSI容器存储接口:storage device内建存储插件来对接外部存储设备,来为容器提供存储卷。
CRI容器运行是接口:使得container不仅支持docker,
-
kube-proxy:在每个节点生成 iptable 或ipvs规则,能够使其运行再本地的pod能被规则所调用实现负载均衡。形成为service,
container engine(docker):容器引擎
- docker 容器管理软件
pod:K8S调度的最小单元,一次只能调度一个pod,一个pod的容器必须运行在一个容器节点之上。
-
-
Add-ons
- kubeDNS:CoreDNS
- Dashboard:WebUI
- 监控系统:prometheus
- 集群日志系统:EFK,Loki Grafana
- Ingress Controller:
运行应用:controller运行,控制器控制定义了一个对象,这个对象生成的有数据项,这个数据项定义了这个对象service
为了避免流量劫持
需要对整体K8S做ca认证,基于ssl的http协议进行通信,所以针对每个客户端都需要做ca,包括 ETCD-CA ,front-proxy-CA, kubernetes-ca,每端都要进行证书验证。
kubernets安装及运行模型
1、二进制安装
2、Pod
static Pod:静态pod
pod:常规pod
2.3、kubeadm能够做哪些事?
kubeadm可以拉起和部署kube-apiserver,kube-scheduler,kube-contoroler,kube-croeDns,kube-proxy。其他包括容器环境,kubelet,kubectl ,kubeadm需要自己手动安装。还有ingress contoroler也需要自己手动安装。
2.4、kubelet
kubelet 组件:
CNI:container netwrk interface容器网络接口
flannel:
calico:
CRI:容器运行接口:docker,podman
CSI:容器存储接口
2.5、kubernets 网络
kubernets一共有三个网络
service网络:作为访问入口,没有配置在接口上,配置在ipvs或者iptables上,为虚拟的网络。
pod网络:配置在pod网络接口之内
node网络:节点实际网络,就是服务器网络环境。
2.6、kubeadm运行一个kube集群过程
运行环境监测-->启动kubelet-->生成证书-->生成kubeconfig配置文件-->生成静态pod清单-->等待模板创建及pod创建成功-->将配置文件上传到集群中-->生成污点到master,指定master避免master成为pod-->生成一个引导令牌,客户端添加到集群中的令牌生成-->基于角色的授权模型-->安装coreDNS和kube-proxy。
2.7、Pod
容器关系:
亲密:同一个pod,采用localhost通讯,共享一组存储卷,共享network,IPC,UTS。
非紧密:比如NMP架构。
非紧密Pod通讯:
同一node上的pod通讯 :通过网桥通讯
pod和service通讯:依赖于iptables,或者ipvs。由kube-proxy维护,kube-proxy运行在每一台服务器上。kube-proxy会吧集群上每一个的service定义转换为本地的ipvs或iptables。
不同节点的pod通讯:网络插件解决,创建叠加网络(创建网络通道)。承载网络(基于路由表)。
kube-proxy与coreDNS至关重要,用于pod间通讯以及服务注册,正向反向解析。
外部流量进入:
经由节点接口,通过service最终走入pod
经由共享宿主机网络。
2.8、Depolyment
depolyment:pod控制器,
depolyment组件:标签选择器关联pod,通过replicas指定多少,pod模板指定这预达成pod效果。
2.9、Service
service基于标签选择器与后端pod建立联系。
2.10 、资源
基于restful协议的定义资源对象
资源类型:Pod,Depolyment,Service
单个资源被称为list
当我们想要建一个pod 资源,需要插入资源一共有三种创建方法:第一种是命令式命令,通过命令及其选项来实现。第二种是命令式配置文件,从配置文件中加载配置数据。第三种叫做声明配置文件,从声明式的配置文件中加载数据。
资源规范,配置清单
apiVersion:指定api群组及版本,资源类型种类繁多,方便管理,把具有相关性资源定义为一个组。核心群组
kind:资源类型
metadata:资源对象的源数据
name:名称
labele:标签
app:mypod
release:预发
spec:所需期望的状态。
containers:
-name:demoapp
image:镜像
使用
kubectl create -f file.ymal创建
这种方式被称为自主式pod
apiserver所接受的配置文件为json。我们可以写给yaml格式,提交给api会自动更改为json格式保存。
2.11、用户类型
访问k8s集群的用户类型包括 :
应用客户,应用使用者
技术管理者:运维开发等主要管理整个k8s集群的状态,用于管理pod。
2.12、资源类型
工作负载型资源(workload):Pod:承载应用类型资源
有状态应用:operator。工作负载型应用。
无状态应用:deployment(声明式配置),daemonset,在每个节点安装一个,Job,cronjob,
服务发现和负载均衡资源:
service,Ingress,负载均衡
配置和存储:
configMap:向应用注入配置信息
secret:向应用注入证书
PVC/PV:存储卷
Downward API:注入环境信息
role
集群级别的资源:
PV
namespace:名称空间自己是集群资源
node:节点
clusterrole:
元数据类型:
limitRange
2.13、apiserver资源目录及常用命令
/apis/GROUP/VERSION/namespace/NAMESPACENAME/pods/PODNAME
查看资源定义格式:
输出重定向资源到文件
kubectl get pods PODNAME -o yaml >>test.yaml
根据资源自己更改为自己需要建立的资源
kubectl create -f test.yaml
资源引用格式
例如删除
kubectl delete pods/mypod
kubectl delete pods/mypod pode/mypod1
例如删除
kubectl delete pods mypod
kubectl detele pods mypod1 mypod2
资源信息查看
kubectl describe 显示详细信息
再pod中执行命令
kubectl exec -it PODNAME -- /bin/sh
-c 指定镜像
名称空间查看
kubectl get namespace
kubectl get --raw /api/v1/namespace/
2.14、node资源
kubectl get nodes
kubectl get nodes/
node lease: kube-node-lease,kubelet定期10秒计算一次node status信息,以租约的信息状态保存在节点之上,当节点发生故障或者每5分钟上报一次状态,保持节点存活状态监测。
查看节点租约
kubectl get leases -n kube-node-lease
kube get leases/nodename -o yaml -n kube-node-lease
查看节点状态
kubectl get nodes/nodesname -o yaml
statsus:
pods:可以运行多少个pod
conditions:近况 能够显示包括节点相关信息,资源,节点存活状态,pid等
kubectl describe nodes/nodename
删除:
kubectl delete nodes nodename