16个核心概念带你入门 Kubernetes
开源Linux
共 9096字,需浏览 19分钟
·
2022-03-03 09:33
基于容器的应用部署、维护和滚动升级 负载均衡和服务发现 跨机器和跨地区的集群调度 自动伸缩 无状态服务和有状态服务 广泛的Volume支持 插件机制保证扩展性
1、Pod
包含多个共享IPC、Network和UTC namespace的容器,可直接通过localhost通信 所有Pod内容器都可以访问共享的Volume,可以访问共享数据 优雅终止:Pod删除的时候先给其内的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然还在运行的进程 特权容器(通过SecurityContext配置)具有改变系统配置的权限(在网络插件中大量应用) 支持三种重启策略(restartPolicy),分别是:Always、OnFailure、Never 支持三种镜像拉取策略(imagePullPolicy),分别是:Always、Never、IfNotPresent 资源限制,Kubernetes通过CGroup限制容器的CPU以及内存等资源,可以设置request以及limit值 健康检查,提供两种健康检查探针,分别是livenessProbe和readinessProbe,前者用于探测容器是否存活,如果探测失败,则根据重启策略进行重启操作,后者用于检查容器状态是否正常,如果检查容器状态不正常,则请求不会到达该Pod Init container在所有容器运行之前执行,常用来初始化配置 容器生命周期钩子函数,用于监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数,支持两种钩子函数:postStart和preStop,前者是在容器启动后执行,后者是在容器停止前执行
2、Namespace
kubectlgetnamespace, 查询所有namespace kubectl createnamespacens-name,创建namespace kubectldeletenamespacens-name, 删除namespace
删除一个namespace会自动删除所有属于该namespace的资源。 default 和 kube-system 命名空间不可删除。 PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。 Events是否属于namespace取决于产生events的对象。
3、Node
kubectlgetnodes,查询所有node kubectl cordon $nodename, 将node标志为不可调度 kubectl uncordon $nodename, 将node标志为可调度
NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上 PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上 NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去
kubectl taint node node0 key1=value1:NoShedule,为node0设置不可调度污点 kubectl taint node node0 key-,将node0上key值为key1的污点移除 kubectl taint node node1 node-role.kubernetes.io/master=:NoSchedule,为kube-master节点设置不可调度污点 kubectl taint node node1 node-role.kubernetes.io/master=PreferNoSchedule,为kube-master节点设置尽量不可调度污点
4、Service
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务 LoadBalancer: 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort ExternalName: 将服务通过DNS CNAME记录方式转发到指定的域名
5、Volume 存储卷
容器挂掉后Kubelet再次重启容器时,Volume的数据依然还在 Pod删除时,Volume才会清理。数据是否丢失取决于具体的Volume类型,比如emptyDir的数据会丢失,而PV的数据则不会丢
emptyDir:Pod存在,emptyDir就会存在,容器挂掉不会引起emptyDir目录下的数据丢失,但是pod被删除或者迁移,emptyDir也会被删除 hostPath:hostPath允许挂载Node上的文件系统到Pod里面去 NFS(Network File System):网络文件系统,Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。 glusterfs:同NFS一样是一种网络文件系统,Kubernetes可以将glusterfs挂载到Pod中,并进行永久保存 cephfs:一种分布式网络文件系统,可以挂载到Pod中,并进行永久保存 subpath:Pod的多个容器使用同一个Volume时,会经常用到 secret:密钥管理,可以将敏感信息进行加密之后保存并挂载到Pod中 persistentVolumeClaim:用于将持久化存储(PersistentVolume)挂载到Pod中 ...
6、PersistentVolume(PV) 持久化存储卷
ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个Pod挂载。 ReadOnlyMany(ROX):可以以只读的方式被多个Pod挂载。 ReadWriteMany(RWX):这种存储可以以读写的方式被多个Pod共享。
Retain,不清理保留Volume(需要手动清理) Recycle,删除数据,即 rm -rf /thevolume/* (只有NFS和HostPath支持) Delete,删除存储资源
7、Deployment 无状态应用
定义Deployment来创建Pod和ReplicaSet 滚动升级和回滚应用 扩容和缩容 暂停和继续Deployment
kubectl run www--image=10.0.0.183:5000/hanker/www:0.0.1--port=8080 生成一个Deployment对象 kubectlgetdeployment--all-namespaces 查找Deployment kubectl describe deployment www 查看某个Deployment kubectl edit deployment www 编辑Deployment定义 kubectldeletedeployment www 删除某Deployment kubectl scale deployment/www--replicas=2 扩缩容操作,即修改Deployment下的Pod实例个数 kubectlsetimage deployment/nginx-deployment nginx=nginx:1.9.1更新镜像 kubectl rollout undo deployment/nginx-deployment 回滚操作 kubectl rollout status deployment/nginx-deployment 查看回滚进度 kubectl autoscale deployment nginx-deployment--min=10--max=15--cpu-percent=80 启用水平伸缩(HPA - horizontal pod autoscaling),设置最小、最大实例数量以及目标cpu使用率 kubectl rollout pause deployment/nginx-deployment 暂停更新Deployment kubectl rollout resume deploy nginx 恢复更新Deployment
RollingUpdate 滚动升级,可以保证应用在升级期间,对外正常提供服务。 Recreate 重建策略,在创建出新的Pod之前会先杀掉所有已存在的Pod。
使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod,检查启动状态,看它是成功还是失败。 当执行更新操作时,会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移 动到新的ReplicaSet中
8、StatefulSet 有状态应用
稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行操作(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现 有序收缩,有序删除(即从N-1到0)
OnDelete:当 .spec.template更新时,并不立即删除旧的Pod,而是等待用户手动删除这些旧Pod后自动创建新Pod。这是默认的更新策略,兼容v1.6版本的行为 RollingUpdate:当 .spec.template 更新时,自动删除旧的Pod并创建新Pod替换。在更新时这些Pod是按逆序的方式进行,依次删除、创建并等待Pod变成Ready状态才进行下一个Pod的更新。
9、DaemonSet 守护进程集
日志收集,比如fluentd,logstash等 系统监控,比如Prometheus Node Exporter,collectd等 系统程序,比如kube-proxy, kube-dns, glusterd, ceph,ingress-controller等
nodeSelector:只调度到匹配指定label的Node上 nodeAffinity:功能更丰富的Node选择器,比如支持集合操作 podAffinity:调度到满足条件的Pod所在的Node上
OnDelete: 默认策略,更新模板后,只有手动删除了旧的Pod后才会创建新的Pod RollingUpdate: 更新DaemonSet模版后,自动删除旧的Pod并创建新的Pod
10、Ingress
Service:使用Service提供集群内部的负载均衡,Kube-proxy负责将service请求负载均衡到后端的Pod中 Ingress Controller:使用Ingress提供集群外部的负载均衡
nginx traefik Kong Openresty
11、Job & CronJob 任务和定时任务
12、HPA(Horizontal Pod Autoscaling) 水平伸缩
控制管理器默认每隔30s查询metrics的资源使用情况(可以通过 --horizontal-pod-autoscaler-sync-period 修改) 支持三种metrics类型 预定义metrics(比如Pod的CPU)以利用率的方式计算 自定义的Pod metrics,以原始值(raw value)的方式计算 自定义的object metrics 支持两种metrics查询方式:Heapster和自定义的REST API 支持多metrics
13、Service Account
14、Secret 密钥
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中; Opaque:base64编码格式的Secret,用来存储密码、密钥等; kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。
15、ConfigMap 配置中心
计算资源,包括cpu和memory cpu, limits.cpu, requests.cpu memory, limits.memory, requests.memory 存储资源,包括存储资源的总量以及指定storage class的总量 requests.storage:存储资源总量,如500Gi persistentvolumeclaims:pvc的个数 storageclass.storage.k8s.io/requests.storage storageclass.storage.k8s.io/persistentvolumeclaims 对象数,即可创建的对象的个数 pods, replicationcontrollers, configmaps, secrets resourcequotas, persistentvolumeclaims services, services.loadbalancers, services.nodeports
资源配额应用在Namespace上,并且每个Namespace最多只能有一个 ResourceQuota 对象 开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以 用LimitRange设置默认值),用户超额后禁止创建新的资源
文章转载:性能与架构
(版权归原作者所有,侵删)
有收获,点个在看
评论