官网:Kubernetes
命令地址: Kubernetes(K8S)中文文档_Kubernetes中文社区
学习博客:https://blog.stanley.wang
K8s(githup下载地址): https://dl.k8s.io/v1.20.15/kubernetes-server-linux-amd64.tar.gz 点击 Server Binaries 的第一个包
etcd下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
dockerhub(镜像)下载地址: https://hub.docker.com
Helm官方地址: Helm
Ingress官方地址: Installation Guide - NGINX Ingress Controller
Volume(存储卷)官方文档地址:Volume | Kubernetes
K8S的插件配置资源清单:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons
容器监控(Prometheus)githup:https://github.com/prometheus-operator/kube-prometheus
##官方文档:https://helm.sh
################helm的目录结构
cd helm-test
tree
.
├── charts #存放依赖文件
├── Chart.yaml #Charts的描述(版本)信息
├── templates #存放用到的模板文件
│ ├── deployment.yaml
│ ├── _helpers.tpl #自定义模板或函数
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt #Chart的信息
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml #全局配置文件(设置的一些参数等)
##################常用命令
helm version #查看版本信息
helm list #查看安装的应用程序列表
helm repo add bitnami https://charts.bitnami.com/bitnami #添加官方数据源
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts #添加阿里云数据源
helm repo list #查看数据源列表
helm search repo harbor #查看应用的安装信息
helm pull bitnami/harbor #拉取应用安装包
helm create helm-test #创建一个chart(图表)模板
helm install test --dry-run . #检查模板文件格式,不会创建k8s资源
helm install test --set fullnameOverrid=aaa --dry-run . #修改values.yaml里面的值
helm install helm-test --namespace public-service . #创建操作
helm uninstall helm-test -n public-service #删除操作
helm upgrade helm-test -n public-service #更新操作
helm list -n public-service #查看helm创建的列表
Pod:Pod是K8S里能够运行的最小原子单元,由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器, Pause容器:是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享UTS、NET、IPC名称空间,一个Pod运行多个容器,称为边车(SideCar)模式; 状态:Pending:Pod已创建,在Pod内还有容器的镜像没创建,包括正在下载镜像的过程;Runnmg :Pod内的容器都已创建,至少有一个容器处于运行、启动、正在重启状态;Succeeded :Pod 内所有容器均成功执行后退出, 且不会再重启;Failed :Pod 内所有容器均已退出,但至少有 一 个容器为退出失败状态; Unknown :由千某种原因无法获取该 Pod 的状态,可能由于网络通信不畅导致 ;
Pod探针
- LivenessProbe(存活探针):用于判断容器是否存活 ( Running 状态 ),如果 Liveness Probe 探针探测到容器不健康 ,则 kubelet 将“杀掉"该容器,并根据容器的重启策略做相 应的 处理 。 如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 Success;
- ReadinessProbe(就绪探针):该探针定期触发执行,存在Pod的整个生命周期中,用于判断容器服务是否可用 ( Ready 状态 ),达到 Ready 状 态的 Pod 才可以接收请求;
- StartupProbe(启动探针):该探针是V1.16版本新增的,用于判断容器内应用程序是否已启动
Pod探针检查方式
- ExecAction(执行动作): 在容器内部运行一个命令,如果该命令的返回码为 0, 则表明容器健康;
- TCPSocketAction: 通过容器的IP地址和端口号执行 TCP 检查,如果能够建立 TCP 连接,则表明容器健康 ;
- HTTPGetAction: 通过容器的 IP 地址、端口号及路径调用 HTTP Get 方法,如果响应的状态码大于等于 200且小于400, 则认为容器健康; 该方式使用最多
Pod探针检查配置
- initialDelaySeconds: 5 初始化时间(秒),不建议设置太长时间
- periodSeconds: 60 检测间隔。默认是 10 秒。最小值是 1
- timeoutSeconds: 3 超时时间,默认1秒
- successThreshold: 1 检测到有1次成功则认为服务是`就绪`
- failureThreshold: 5 检测到有5次失败则认为服务是`未就绪`。默认值是 3,最小值是 1
Pod控制器:是Pod启动的一种模板,用来保证在K8S里启动的Pod符合预期运行,常见的控制器有:Deployment(管理部署,无状态建模)、DaemonSet、ReplicaSet(副本集)、StatefulSet(管理状态,有状态的建模)、Job(管理任务,批处理建模)、Cronjob(管理周期计划任务);
Name:是K8S内部中『资源』的一种逻辑概念(功能),name通常定义在元数据里,资源有五种维度:api版本(apiVersoin)、类别(kind)、元数据(metadata)、定义清单(spec)、状态(status);
Namespace(名称空间):用来隔离不同的用户,可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pod, service, replication controller(副本控制器) 和 deployment 等都是属于某一个 namespace 的(默认是 default),也就是具备隔离性;而 node, persistent volume(PV)/PVC,StoragrageClass,RBAC,IngressClass,namespace 等资源则不属于任何 namespace,也就是不具备隔离性;
Label(标签):一个标签对应多个资源,多个资源也可以对应一个标签,是多对多关系,标签格式:key=value,注解(annotations);
Service(服务):该服务为Pod提供统一入口,Service通过标签选择器选择后端,配合Replication Controller(副本控制器) 或者 Deployment 来保证后端容器的正常运行,匹配标签的 Pod IP 和端口列表组成 endpoints(连接端点),由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上;
Ingress:为进入集群的请求提供**路由规则**的集合,对外暴露的接口,只能以HTTP和HTTPS提供服务,在V1.19版本以后稳定;
K8S在V1.6版本以后默认使用基于角色的访问控制(RBAC);
流程图
HPA (Horizontal Pod Autoscaling是自动控制Pod数量的增加和减少):可以根据 CPU 使用率或应用自定义 metrics 自动扩展 Pod 数量;
ConfigMap:是分布式系统中的**『配置中心』**,将启动参数保存到ConfigMap中,文件名作为key,value是整个文件的内容;
CronJob:定时执行计划任务;
DaemonSet:保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用;比如:日志收集:fluentd,logstash 等;系统监控: Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等;系统程序: kube-proxy, kube-dns, glusterd, ceph 等;
Deployment:该控制器是用于部署无状态的服务,为了解决服务编排的问题,支持replicaset的所有功能; 可以管理多个副本的Pod,实现无缝迁移、自动扩容、自动缩容、自动灾难恢复、一键回滚等功能;
StatefulSet(状态集):是为了解决有状态服务的问题,在V1.9版本以后使用;
Job:负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束;
Local Volume(本地数据卷):是一个本地存储设备,比如磁盘、分区或者目录等。不支持自动创建;
Node:是Pod的运行主机,为了管理Pod,每个Node节点上至少要运行Container runtime(容器运行时),K8S只是通过Node Controller检查Node节点是否存在,通过Taints(污点) 和 tolerations(容忍)决定该Node节点是否调度Pod;
Volume(存储卷):将数据持久化存储,Volume(存储卷)的生命周期与Pod绑定,挂载为容器内的目录和文件,有ConfigMap :主要保存应用程序所需的配置文件;Secret :私密;Downward API :可以将 Pod 或 Container 的某些元数据信息(例如 Pod 名称、 Node IP 、 Label 、 Annotation 、容器资源限制等)以文件的形式 挂载到容器内;
PV(Persistent Volume ):持久卷,存储资源;PV生命周期,资源供应分为静态模式 (Static ) 和动态模式 (Dynamic) ,资源供应的结果就是将适合的PV和PVC成功绑定;资源绑定,系统将根据PVC对存储资源的请求(存储空间和访问模式)在已存在的 PV 中选择一个满足 PVC 要求的 PV ,一旦找到,就将该 PV 与用户定义的 PVC 绑定,用户的应用就可以使用这个 PVC 了;资源使用,需要在 Volume 的定义中引用 PVC 类型的存储卷,将 PVC 挂载到容器内的某个路径下进行使用 ;资源回收(Reclaiming) ,回收策略有Retain (保留数据)、 Delete (删除数据)、Recycle (弃用);
PV生命周期流程图
PVC(Persistent Volume Claim) :主要是涉及存储空间请求、访问模式、PV选择条件和存储类别等信息的设置 ;
PodDisruptionBudget (PDB):用来保证一组 Pod 同时运行的数量,这些 Pod 需要使用 Deployment、ReplicationController(副本控制器)、ReplicaSet 或者 StatefulSet 管理;
PodPreset:用来给指定标签的 Pod 注入额外的信息,如环境变量、存储卷等;
RS(ReplicaSet 副本集):支持集合式的selector,建议通过Deployment 来自动管理 ReplicaSet,支持版本记录、回滚、暂停升级等高级特性, **很少使用**;
RC (Replication Controller 副本控制器):分为两类,Controller Manager 中的和资源对象中的,RC是资源对象中的简称, **很少使用**;
Resource Quotas(资源配额):用来限制用户资源用量的一种机制,资源配额应用在Namespace上,只能有一个Resource Quotas(资源配额)对象,用户超额后禁止创建新的资源;
Pod Security Policies(PSP):是集群级的 Pod 安全策略,自动为集群内的 Pod 和 Volume 设置 Security Context(安全上下文);
Security Context :是限制不可信容器的行为,保护系统和其他容器不受其影响;
Secret(私密):解决了密码、token、密钥等敏感数据的配置问题,Secret中的数据要求以BASE6 4 编码格式存放 ;
Service account(服务账号):通过Secret保存用户身份凭证,凭证信息有CA根证书数据(ca.crt)和签名后的Token信息,当客户端通过API Server访问时,API会自动读取这些身份信息,并将其附加到HTTPS请求中传递给API Server以完成身份认证逻辑;
Event(事件):是一个事件的记录,记录事件的最早产生时间、最后重现时间、重复次数、发起者、类型以及导致此事件的众多信息;
Pod Readiness Gates: 给予了 Pod 之外的组件控制某个 Po d 就绪的能力,通过 Pod Readiness Gates 机制, 用户可以设置自定义的 Pod 可用性探测方式来告诉 Kubemetes 某个 Pod 是否可用,具体使 用方式是用户提供一个外部的控制器 (Controller ) 来设置相应 Pod 的可用性状态 ;**在1.14版本之后**
用户自定义API:用于将扩展 API 的访问请求转发到用户提供的 API Server 上,由它完成对 API请求的处理;API的元素主要由5部分组成:apiVersion 、 kind 、metadata 、spec 、status ;Fabric8 工具包:是访问K8S API客户端的一个工具;
CRD控制器:用于定义用户自定义的资源对象 ,基于客户端库 client-go 实现 Informer 、 ResourceEventHandler 、 Workqueue 等组件具体的功能处理逻辑;
QoS(Quality Of Service)服务质量等级:在K8S中,每个POD都有个QoS标记,通过这个Qos标记来对POD进行服务质量管理,它确定Pod的调度和驱逐优先级。服务质量体现在两个指标上,一个指标是CPU,另一个指标是内存 ;
- 等级类型(从高到低):Guaranteed:需要CPU、内存的Request和Limit的值一样;Burstable:CPU、内存的Request有配置,但值不一样;BestEffort:没有配置Request和Limit;
- K8S的删除策略:先删除服务质量为BestEffort,然后在删除Burstable,最后删除Guaranteed;
PodPreset: 用来给指定标签的Pod注入额外的信息,如环境变量、存储卷、配置容器时间、字符集等;
etcd服务(配置存储中心):是键值数据库,主要是存储元数据(集群信息);
1)apiserver服务(集群的控制中枢):是资源配额控制的入口,提供认证、授权、访问控制、API注册和 发现机制,负责模块之间的的数据交互,承担通信枢纽功能;
2)controller-manager服务(集群的状态管理器):负责维护集群的状态,通过apiserver实现,比如故障检测、自动扩展、滚蛋更新等,由一些列的控制器组成,控制器有:Deployment Controller(Pod控制器)、Volume Controller(存储卷控制器)、Garbage Controller(垃圾回收控制器)、Job Controller(任务控制器);Node Controller(节点控制器):通过API Server实时获取Node的相关信息,实现管理和监控集群中各个Node的相关控制功能;Resource quta Controller(资源配额控制器):通过Admission Control (准入控制 )来控制的,用LimitRanger 对 :容器级别,CPU和Memory进行限制;和Pod级别,对Pod内所有容器的资源进行限制;用ResourceQuota对Namespace(多租户)级别,包括Pod数量、Replication Contro ller 数量 、 Service 数量、 ResourceQuota 数量、 Secret 数量和可持有的 PV 数量 ;Namespace Controller(名称空间控制器):定时通过 API Server 读取 Names pace的信息经过一系列的判断 并将其保存在 etcd 中;Service Controller(服务控制器)和Endpoint Controller(接入点控制器):Endpoints(接入点集)是Service对应的所有Pod副本的访问地址,Endpoint Controller(接入点控制器)负责监听Servcie和对应的Pod副本的变化;Serv ice Controller 是K8S集群与外部的云平台之间的一个接口控制器;Node Controller(节点控制器)核心工作流程图
Resource quta Controller(资源配额控制器)流程架构图
3)scheduler服务(集群的调度中心):负责接收调度通过预算策略(predict)和优选策略(priorities)将Pod调度到适合的运算节点上,最后存到etcd中,在V1.5版本之后使用Framework调度机制;
1)keublet服务:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;定时将Pod的状态上报给apiserver;以及镜像和容器的清理;
2)kube-proxy服务:负责为 Service 提供 cluster 内部的服务发现和负载均衡;是K8S在每个节点上运行网络的代理,建立pod网络和集群网络的关系(clusterip->podip);调度用Ipvs(IP Virtual Server )模式;负责建立和删除包括调度更新;ipvs:监听Master节点增加删除service以及endpoint的消息,调用Netetlink接口创建相应的ipvs规则,通过ipvs规则,将流量转发到相应的pod上;
iptables:监听Master节点增加删除service以及endpoint的消息,对于每一个service,它都会设置一个iptables规则,将service的cluststerIP代理到后端对应的Pod;
网络模型
1)CNI网络插件:主要是实现pod资源能跨宿主机进行通信,通过Plugin(插件)在创建容器时分配网络资源,在容器销毁时删除资源;插件有: Flannel、Calico、Canal、Contiv、OpenContrail、NSX-T、Kube-router
2)服务发现插件:就是服务(应用)之间相互定位的过程,其实就是将服务名(Service Name)与集群网络IP(Cluster IP)绑定;插件有: Calico:是一个符合CNI标准的插件,给每个Pod生成一个唯一的IP地址,并且把每个节点当做一个路由;
3)服务暴露插件:Ingress资源是用于暴露7层应用到K8S集群外的一种核心资源(http/https),Ingress控制器能够为Ingress资源监听套接字,然后根据Ingress规则配置机制路由调度流量的一个组件; 插件有:Traefik
CoreDNS:用于K8s集群内部Service的解析,可以让pod把Service名称解析成IP地址,然后通过Service的IP地址连接到对应的应用上;
Metrics-server:用来采集集群数据指标;
GUI管理插件:Dashboard
CLI客户端:kubectl
############################kubectl的命令#########################################################
kubectl [command] [TYPE] [[NAME] [flags] #kubectl命令行语法:command:子命令,用于操作资源对象,例如create 、 get、describe、delete等;TYPE: 资源对象的类型,区分大小写,能以单数、复数或者简写形式表示;NAME: 资源对象的名称,区分大小写。 如果不指定名称,系统则将返回属于TYPE的全部对象列表;flags : kubectl 子命令的可选参数,例如使用-s 或--server 设置 API Server 的URL地址,而不使用默认值;
kubectl get cs #查看K8s集群状态
kubectl get namespace(ns简化方式) #在运算节点上 查看命名空间
kubectl get all -n default #在运算节点上 查看default命名空间中的资源
kubectl create namespace app #在运算节点上 创建命名空间(app)
kubectl delete namespace app #在运算节点上 删掉命名空间(app)
kubectl get events --all-namespaces #查看所有事件
kubectl get deploy -owide #查看Deployment部署的服务信息
kubectl get clusterrole #查看集群的角色权限
NAME: Deployment名称
READY: Pod的状态,已经Ready的个数
UP-TO-DATE: 已经达到期望状态的被更新的副本数
AVAILABLE: 已经可以用的副本数
AGE:
CONTAINERS:
IMAGES:
SELECTOR:
kubectl get events --field-selector involvedObject.name=nginx,involvedObject.namespace=default #查看名为nginx对象的事件
kubectl get pod reviews-v1-5bdc544bbd-5qgxj -o jsonpath="{.status.phase}" #查看pod运行状态
kubectl logs 元数据名 -c 容器名 #查看容器的输出内容
kubectl get pods -n app #查看 app命名空间中pod控制器的信息
kubectl get sa --all-namespaces #查询集群所有账户(Service Account)
kubectl get pods -n app -o wide #查看 app命名空间中pod控制器的信息
kubectl exec -ti pod的name /bin/bash -n app #进入pod资源,先查看pod信息
kubectl exec -ti cm-test-app -- bash #进人容器内
kubectl exec -ti pod的name -c tomcat --ls /usr/local/tomcat/logs #登录tomcat容器查看日志列表
kubectl exec -ti pod的name -c tomcat --tail /usr/local/tomcat/logs/catalina.2020-07-29.log #查看日志
kubectl delete pods pod的name -n app --force --grace-period=0 #强制删除(重启)app下的pod
kubectl describe sve mysql-app -n app #查看service详细信息
kubectl auth can-i create pods --all-namespaces #检查是否可以在任何命名空间下创建pod
kubectl auth can-i list deployments.extensions #检查是否可以列出当前名称空间中的部署
kubectl auth reconcile -f my-rbac-rules.yaml #自动修复有问题的RBAC策略
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 #更新镜像
kubectl rollout undo deployment/nginx-deployment #镜像回滚
kubectl taint nodes node1 key1=value1:NoSchedule #给node1节点添加taint(污点)
kubectl get cronjob 容器名 #查看定时任务运行状态
kubectl get jobs --watch #查看Cron Job定时任务执行的历史和现状
kubectl patch node kSs-node-1 -p '{"spec":{"unschedulable":true}}' #将Node剥离K8s集群
kubectl patch node kSs-node-1 -p '{"spec":{"unschedulable":false}}' #将Node加入K8s集群
kubectl label pod redis-master-bobrO role=backend #给Pod "redis-master-bobrO"添加标签"role=backend"
kubectl get pods -Lrole #查看标签
kubectl label pod redis-master-bobrO role- #删除标签
kubectl label pod redis-master-bobrO role=master --overwrite #修改标签,加上--overwrite参数
kubectl config set-cluster kubernetes-cluster --server=https://192.168.1.128:8080 #设置Context(运行环境)
kubectl config set- context ctx- dev --namespace=development #将Context(运行环境)置于之前创建的命名空间中
kubectl config view #查看已定义的 Context(运行环境)
kubectl top po -n kube-system #查看Pod的cpu和内存使用情况
kubectl top node #查看node的cpu和内存使用情况
#######################资源配置清单(yaml或json格式)
#################################################
kubectl get pods pod的name -o yaml -n app #获取pod的统一资源配置清单
kubectl get svc pod的name -o yaml -n app #获取service的统一资源配置清单
kubectl explain svc.metadata(字段名) #查看metadata段的解释信息
kubectl create -f mysql-app-svc.yaml #创建配置清单
kubectl delete -f mysql-app-svc.yaml #删除配置清单
kubectl apply -f mysql-app-svc.yaml #离线修改配置清单(建议用这种方式修改)
kubectl edit -f mysql-app-svc.yaml #在线修改配置清单
###########################命令####################################################
kubectl get clusterrole #查看权限列表
kubectl get clusterrole cluster-admin -o yaml #查看有cluster-admin角色的配置文件
kubectl api-versions 或 kubectl api-resources #查看K8S 支持的API版本以及资源对象
###########################kubectl-scheduler服务####################################################
kube-scheduler 负责分配调度 Pod 到集群内的节点上,它监听 kube-apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点(更新 Pod 的 NodeName 字段)。
指定Node节点调度:有三种方式指定 Pod 只运行在指定的 Node 节点上
nodeSelector:只调度到匹配指定 label 的 Node 上;
nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作
podAffinity:调度到满足条件的 Pod 所在的 Node 上
kubectl label nodes node-01 disktype=ssd #首先给 Node 打上标签
Pod创建流程
1)用户通过kubectl或其他API客户端提交Pod Spec给API Server。
2)API Server尝试着将Pod对象的相关信息存入etcd中,待写入操作执行完成,API Server即会返回确认信息至客户端。
3)Scheduler(调度器)通过其watcher监测到API Server创建了新的Pod对象,于是为该Pod对象挑选一个工作节点并将结果信息更新至API Server。
4)调度结果信息由API Server更新至etcd存储系统,并同步给Scheduler。
5)相应节点的kubelet监测到由调度器绑定于本节点的Pod后会读取其配置信息,并由本地容器运行时创建相应的容器启动Pod对象后将结果回存至API Server。
6)API Server将kubelet发来的Pod状态信息存入etcd系统,并将确认信息发送至相应的kubelet。
Pod删除流程
1)用户发送删除Pod对象的命令。
2)API服务器中的Pod对象会随着时间推移而更新,在宽限期内(默认为30秒),Pod被视为dead。
3)将Pod标记为Terminating状态。
4)(与第3步同时运行)kubelet在监控到Pod对象转为Terminating状态的同时启动Pod关闭过程。
5)(与第3步同时运行)端点控制器监控到Pod对象的关闭行为时将其从所有匹配到此端点的Service资源的端点列表中移除。
6)如果当前Pod对象定义了preStop钩子句柄,在其标记为terminating后即会以同步方式启动执行;如若宽限期结束后,preStop仍未执行完,则重新执行第2步并额外获取一个时长为2秒的小宽限期。
7)Pod对象中的容器进程收到TERM信号。
8)宽限期结束后,若存在任何一个仍在运行的进程,Pod对象即会收到SIGKILL信号。
9)Kubelet请求API Server将此Pod资源的宽限期设置为0从而完成删除操作,它变得对用户不再可见。
备注:默认情况下,所有删除操作的宽限期都是30秒,不过kubectl delete命令可以使用--grace-period=选项自定义其时长,使用0值则表示直接强制删除指定的资源,不过此时需要同时为命令使用--force选项
kubectl create -f pod.yaml #创建pod,在默认命名空间
kubectl apply -f pod.yaml #更新并创建pod,在默认命名空间
kubectl get po #查看pod,在默认命名空间
kubectl delete po nginx #删除pod
time kubectl delete po nginx #删除pod并显示删除时长
kubectl get event #查看Pod事件
kubectl get po nginx -oyaml #查看yaml配置文件
kubectl describe po nginx #查看pod的状态信息
kubectl get po nginx -owide #查看容器IP地址
kubectl exec -ti nginx -- sh #进入容器内部
grep -v "^#" pod.yaml | grep -v "^$" #linux中查看没有注释的内容
vim pod.yaml
apiVersion: v1 #版本信息
kind: Pod #资源类型
metadata: #元数据
#namespace: default #命名空间 default是默认空间,一般都不在文件中加该参数
name: nginx #名称,符合RFC 1035规范的名称
labels: #标签
app: nginx #相当于:app=nginx
role: frontend #角色,可以有多个
version: v2
annotations: #注释信息
app: nginx
spec: #定义容器的详细信息
terminationGracePeriodSeconds: 40 #用于控制等待时间,默认值为30秒
# initContainers: #初始化容器
# - name: init-container #容器名称
# image: busybox #镜像
# imagePullPolicy: IfNotPresent #镜像拉取策略:Always:总是拉取;Never:从不拉取;IfNotPresent:不存在就拉取
# - command: #命令
# - sh
# - -c
# - echo "I am initContainers for init some configuration"
containers: #容器列表
- name: nginx # 容器名称
image: nginx:latest #镜像
imagePullPolicy: Always #镜像拉取策略:Always:总是拉取;Never:从不拉取;IfNotPresent:不存在就拉取
command: #命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html #容器工作目录
# volumeMounts: #存储卷配置
# - name: webroot
# mountPath: /usr/share/nginx/html
# readOnly: true
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: TZ
value: Asia/shanghai
- name: LANG
value: en_US.utf8
# resources:
# limits:
# cpu: 1000m
# memry: 1024MI
# requests:
# cpu: 1000m
# memry: 512MI
# startupProbe: #检查容器内进程是否完成启动,注意三种检查方式同时只能使用一种
# httpGet: #对Pod内容器健康检查方法设置为HttpGet,需要制定Path、port
# path: /api/successStart #访问 HTTP 服务的路径
# port: 80
# tcpSocket:
# port: 80
# readinessProbe: #健康检查,注意三种检查方式同时只能使用一种
# httpGet: #对Pod内容器健康检查方法设置为HttpGet,需要制定Path、port
# path: /index.html #访问 HTTP 服务的路径
# port: 80
# livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket
# exec: #对Pod内容器健康检查方式设置为exec方式
# command: #exec方式需要制定的命令或脚本
# - ls
# initialDelaySeconds: 3 #容器启动完成后,kubelet在执行第一次探测前应该等待 5 秒。默认是 0 秒,最小值是 0。
# periodSeconds: 2 #指定 kubelet 每隔 60 秒执行一次存活探测。默认是 10 秒。最小值是 1
# timeoutSeconds: 2 #对容器健康检查探测等待响应的超时时间为 3 秒,默认1秒
# successThreshold: 1 #检测到有1次成功则认为服务是`就绪`
# failureThreshold: 1 #检测到有5次失败则认为服务是`未就绪`。默认值是 3,最小值是 1。
lifecycle:
# postStart: #容器创建完成执行指令
# exec:
# command:
# - sh
# - -c
# - 'mkdir /data/ '
preStop:
# httpGet:
# path: /
exec:
command:
- sh
- -c
- sleep 90
restartPolicy: Always
# imagePullSecrets:
# - name: default-dockercfg-86258
# hostNetwork: false
# volumes:
# - name: webroot
# emptyDir: {}
API Server架构图
架构从上到下:
API层:主要是提供各种接口,有对资源对象的增删改查和Watch的API,还有健康检查、UI、日志、性能等监控相关的API;
访问控制层:主要是对用 户身份鉴权,验明用户身份,根据配置的资源访问许可逻辑,判断是否允许访问;
Registry(注册表)注册层:保存了资源对象的类型、创建、转换版本、编码和解码为JSON 或 ProtoBuf 格式进行存储;
etcd 数据库:用于持久化存储K8S资源对象的KV数据库,API Server 创新性地设计了List-Watch接口;
API Server:API层:主要是提供各种接口,有对资源对象的增删改查和Watch的API,还有健康检查、UI、日志、性能等监控相关的API;访问控制层:主要是对用 户身份鉴权,验明用户身份,根据配置的资源访问许可逻辑,判断是否允许访问;Registry(注册表)注册层:保存了资源对象的类型、创建、转换版本、编码和解码为JSON 或 ProtoBuf 格式进行存储;etcd 数据库:用于持久化存储K8S资源对象的KV数据库,API Server 创新性地设计了List-Watch接口;
API Server的核心功能是提供 Kubernetes 各类资源对象(如 Pod 、 RC 、 Service 等)的增 、 删 、 改、查及 Watch 等 HTTP REST 接口, 成为集群内各个功能模 块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心 。
####################################kubelet 的启动参数
--register-node=true #是否向API Server注册自已
--api-servers #API Server 的位置
--kubeconfig: kubeconfig文件 #用于访问API Server的安全配置文件
--cloud-provider: #云服务商(IaaS) 地址,仅用与公有云环境中
--node-status-update-frequency #设置kubelet每隔多长时间向API Server报告节点的状态,默认10S
--config #静态Pod yaml文件路径
--file-check-frequency #设置检查该目录的时间间隔,默认20S
--manifest-url #设置HTTP端点 (URL)
--http-check-frequency #设置检查该HTTP端点数据的时间间隔,默认20S
####################################启动自定义API的功能
--requestheader-client-ca-file=/etc/kubernetes/ssl_ keys/ca.crt #客户端CA证书
--requestheader-allowed-names= #允许访间的客户端 common names 列表,通过header中--requestheader-username-headers 参数指定的字段获取 。 客户端 common names的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问
--requestheader-extra-headers-prefix= X-Remote-Extra- #请求头中需要检查的前缀名
--requestheader- group-headers=X-Remote-Group #请求头中需要检查的组名
--requestheader-username-headers= X-Remote-User #请求头中需要检查的用户名
--proxy-client-cert-file=/etc/kubernetes/ssl_keys/kubelet_client.en #在请求期间验证Aggregator的客户端CA证书
--proxy-client-key-file=/etc/kubernetes/ssl_keys/kubelet_client.key #在请求期间验证Aggregator的客户端私钥
--enable-aggregator-routing=true #启动服务的ClusterIP地址进行访问
Deployment(无状态服务控制器):用于部署无状态的服务,可以管理多个副本的Pod实现无缝迁移、自动扩容和缩容、自动灾难恢复、一键回滚等;为了解决服务编排的问题,支持replicaset的所有功能; 支持发布的停止;支持版本的滚动更新和版本回退; 通过replicaset管理pod;
#####################deployment的操作命令########################
kubectl create deployment nginx --image=nginx:1.15.2 #手动创建Deployment
kubectl create deployment mysql-app --image=docker.io/mysql:1.5.5 -n app #创建deployment类型的pod控制器 参数:mysql-app是pod控制器名称; --image是镜像地址; app是命名空间名字
kubectl replace -f nginx-deploy.yaml #通过文件或者标准输入替换原有资源
kubectl get deploy -owide | grep image #查看用deployment发布的镜像版本信息
kubectl get deploy --show-labels #查看Deployment标签
kubectl edit deploy dy-nginx #修改Deployment
kubectl delete deployment mysql-app -n app #删除mysql-app控制器
kubectl delete -f nginx-deploy.yaml #删除Deployment类型的Pod
kubectl get deploy -owide #查看Deployment状态信息
NAME: Deployment名称
READY: Pod的状态,已经Ready的个数
UP-TO-DATE: 已经达到期望状态的被更新的副本数
AVAILABLE: 已经可以用的副本数
AGE: 显示应用程序运行的时间
CONTAINERS: 容器名称
IMAGES: 容器对象
SELECTOR: 管理Pod的标签
kubectl rollout pause deploy nginx #暂停Deployment的自动更新,主要是提升性能
kubectl rollout resume deploy nginx #恢复Deployment的自动更新功能
kubectl rollout status deploy nginx #查看nginx镜像更新过程
kubectl rollout history deploy nginx #查看nginx镜像历史操作命令
kubectl rollout history nginx --revision=2 #查看指定版本的详细信息
kubectl rollout undo deploy nginx #回滚镜像到上一个版本
kubectl rollout undo deploy nginx --to-revision=2 #回滚镜像到指定版本
kubectl rollout status deploy nginx #查看滚动更新的状态
kubectl scale --replicas=3 deploy nginx #Deployment扩缩容
kubectl describe po pod的name #查看pod日志
kubectl scale deployment mysql-app --replicas=2 -n app #对pod进行扩容到2个 --replicas=2
kubectl scale deployment 元数据名称 -- replicas 5 #手动将Pod扩容到5个,如果比原有的数量小,就是缩容
kubectl expose deployment mysql-app --port=80 -n app #创建service,service是管理pod的入口,固定端口为80
kubectl describe deployment mysql-app -n app #查看 app命名空间中pod控制器的详细信息
kubectl get deployment nginx -o yaml > nginx-deploy.yaml #将配置重定向到文件中
kubectl describe po 镜像name #查看镜像的日志信息
kubectl set image deploy nginx nginx=nginx:1.15.3 --record #修改镜像版本
kubectl set image deploy nginx nginx=nginx:15.4 --record #更新镜像版本 record(记录更新信息)
vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-09-17T09:31:42Z"
generation: 1
labels:
app: dy-nginx
name: dy-nginx
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 2 #副本数
revisionHistoryLimit: 10 #设置保留RS旧的版本个数,0代表不保留历史数据,默认10个
minReadySeconds: 5 #当pod创建好后,Ready的最小秒数,默认0,即一旦创建就被使用
selector:
matchLabels:
app: dy-nginx
strategy: #滚动更新策略
rollingUpdate:
maxSurge: 25% #允许超过最大 Pod 副本数,可设为百分比或整数,默认25%
maxUnavailable: 25% #在回滚或更新时最大不可用 Pod 的数,可以设为百分比或整数,默认25%
type: RollingUpdate #更新类型,默认是RollingUpdate(滚动更新);Recreate(重建):先删除旧的Pod,在创建新Pod
template:
metadata:
creationTimestamp: null
labels:
app: dy-nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30 #用于控制等待时间,默认值为30秒
StatefulSet(状态集):主要用于管理 有状态服务的工作负载API对象,StatefulSet为每个Pod 维护了一个标识; 备注:StatefulSet会给创建的每一个Pod起一个名称
###################StatefulSet常用命令
kubectl create -f nginx-sts.yaml #创建StatefulSet
kubectl get svc #查看Service
kubectl get po --show-labels #查看pod的标签
kubectl get po -l app=nginx -w #根据标签(-l)动态(-w)查看pod启动信息
kubectl get sts web -oyaml #查看StatefulSet的yaml内容
kubectl get po web-0 -oyaml |grep image #根据要求查看配置内容
kubectl scale --replicas=3 sts web #StatefulSet扩容,web是StatefulSet的name
kubectl delete sts 服务的name #级联删除,根据名称删除StatefulSet,同时也会删除pod
kubectl delete sts 服务的name --cascade=false #非级联删除,根据名称删除StatefulSet,不删除pod
kubectl delete -f nginx-sts.yaml #删除StatefulSet类型的Pod
kubectl edit sts web #修改配置
kubectl rollout status sts web #查看StatefulSet更新状态
kubectl describe po web #查看pod日志信息
##################部署busybox#####################
##用busybox验证 StatefulSet是否能正常访问
cat<
vim nginx-sts.yaml #编辑资源清单
apiVersion: v1
kind: Service #创建一个Service,通过Service能访问到StatefulSet
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
-port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet #创建一个StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" #需要与创建的Service对应,
replicas: 2 #副本数
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.2
ports:
- containerPort: 80
name: web
updateStrategy: #滚动更新策略
rollingUpdate: #从下往上逐个更新
partition: 2 #分段更新,只更新大于2的pod
type: RollingUpdate #从下往上逐个更新
DaemonSet(守护进程集):缩写为ds,根据标签在所有节点或者是匹配的节点上都部署一个Pod
kubectl label node k8s-node01 k8s-node02 ds=true #给节点添加标签
kubectl get node --show-labels #查看节点标签
kubectl describe po 镜像Name #查看镜像日志信息
kubectl replace -f nginx-ds.yaml #重新编译配置文件
kubectl set image ds nginx nginx=ngix:1.15.3 --record #更新镜像版本
kubectl edit ds #更新DaemonSet配置
kubectl rollout history ds nginx #查看DaemonSet的历史记录
kubectl get po -owide #查看Pod的详细信息
kubectl delete -f nginx-ds.yaml #删除DaemonSet类型的Pod
vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx
name: nginx
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
updateStrategy:
type: OnDelete
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
nodeSelector:
ds: "true"
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
HPA(Horizontal Pod Autoscaler):Pod的水平自动伸缩器,用来观察Pod的CPU、内存使用率,自动扩展和缩容Pod的数量,不适用于无法缩放的对象比如DaemonSet; 备注:1.必须定义Requeste参数;2.必须安装metrics-server
kubectl top po #查看Pod的CPU和内存使用情况
kubectl top po -n kube-system #查看Pod的CPU和内存使用情况
kubectl logs -f Pod的NAME #根据Pod的名称,查询日志信息
kubectl get hpa #查看hpa
kubectl describe hpa #查看hpa的描述信息
kubectl get po -A --show-labels #查看所有(-A)容器的信息
kubectl autoscale deploy nginx-5dfc8689c6-zfcvk --cpu-percent=20 --min=2 --max=5
#设置autoscale(水平扩缩容),动态扩缩容cpu使用率,Pod在2和5之间
Labels(标签):对K8S中各种资源进行分类、分组,添加一个具有特别属性的一个标签;
kubectl label node k8s-node2 region=subnet #给节点添加标签
kubectl label po Pod的NAME app=nginx #给pod添加标签(label)
kubectl label po Pod的NAME app- #删除(-)标签
kubectl label po Pod的NAME app=nginx --overwrite #修改(--overwrite)标签
Selector(过滤):通过过滤语法对标签进行筛选查询;
kubectl get node -owide #查看节点信息
kubectl get po -A --show-labels #查看所有(-A)Pod的标签信息
kubectl get po -A -l app=nginx #查看带有app=nginx 过滤(-l)所有(-A)的Pod
kubectl get po -A -l 'app in (nginx1,ngixn2)' #根据aap标签(-l)查询所有(-A)等于nginx1和nginx2的内容
kubectl get po -A -l app!=nginx1 #查询app标签(-l)所有(-A)不等于nginx1的Pod
Service(服务):Service是一组Pod的访问入口(逻辑上的),通过标签选择器选择后端, 对于Pod来说会有一个固定的名称,配合Replication Controller(副本控制器) 或者 Deployment (无状态控制器)来保证后端容器的正常运行,匹配标签的 Pod IP 和端口列表组成 Endpoints(连接端点),由 kube-proxy 负责将服务 IP 负载均衡到这些 Endpoints 上; 备注:创建后的Servcie名称,是固定的,在不修改配置文件的情况下,名称不会改变;
kubectl create -f nginx-svc.yaml #创建Servcie
kubectl get svc #查看是否创建成功
kubectl get svc -n kube-system #查看kube-system命名空间下的 Service
kubectl get ep -n kube-system #查看kube-system命名空间下的Endpoint(端点)
kubectl get ep nginx-svc #查看nginx-svc的Endpoint(端点)信息
kubectl get po -owide #查看Pod详细信息
kubectl get svc nginx-svc -oyaml #查看Servcie的配置文件
#############验证Service服务是否正常
curl ServiceIP地址 #通过Servcie访问Pod
kubectl exec -ti busybox -- sh #进入busybox容器内
wget http://nginx-svc.default #下载访问页面,备注:nginx-svc(Servcie服务名).default(命名空间)
cat index.html #查看页面内容
vim nginx-svc.yaml #通过Service访问Pod
apiVersion: v1
kind: Service #Service名称
metadata:
labels: #自定义标签
app: nginx-svc #标签名称
name: nginx-svc #应用名称
spec:
ports: #Service要对外开放的端口
- name: http #Service的端口名称
port: 80 #Service自己的端口
protocol: TCP #访问协议,默认是TCP,支持UDP、TCP、SCTP
targetPort: 80 #后端Pod的端口号
- name: https #Service的端口名称
port: 443 #Service自己的端口
protocol: TCP #访问协议,默认是TCP,支持UDP、TCP、SCTP
targetPort: 443 #后端Pod的端口号
selector: #根据标签过滤所需要的Pod
app: dy-nginx #要与查找的Pod标签名一致
sessionAffinity: None
type: ClusterIP #Service的类型,有ClusterIP:只能在集群内部使用,是默认值;ExternalName:通过返回定义的CNAME别名,找到代理地址;NodePort:在所有安装了kub-proxy的节点上打开一个端口,此端口可以代理至后端Pod,然后集群外部可以使用节点的IP地址和NodePort的端口号访问到集群的Pod服务,默认端口范围30000~32767;LoadBalancer:使用云提供商的负载均衡器公开服务;
vim nginx-svc-external.yaml #通过Service访问nginx-svc-external.yaml反代理的IP地址
apiVersion: v1
kind: Service #Service名称
metadata:
labels: #自定义标签
app: nginx-svc #标签名称
name: nginx-svc #应用名称
spec:
ports: #Service要对外开放的端口
- name: http #Service的端口名称
port: 80 #Service自己的端口
protocol: TCP #访问协议,默认是TCP,支持UDP、TCP、SCTP
targetPort: 80 #后端Pod的端口号
sessionAffinity: None
type: ClusterIP #Service的类型,有ClusterIP:只能在集群内部使用,是默认值;ExternalName:通过返回定义的CNAME别名,找到代理地址;NodePort:在所有安装了kub-proxy的节点上打开一个端口,此端口可以代理至后端Pod,然后集群外部可以使用节点的IP地址和NodePort的端口号访问到集群的Pod服务,默认端口范围30000~32767;LoadBalancer:使用云提供商的负载均衡器公开服务;
vim nginx-svc-external.yaml #通过Servcie的Endpoint(端点)代理IP地址
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: nginx-svc-external #该标签需要与nginx-svc-external.yaml中的字段名一致
name: nginx-svc-external
namespace: default
subsets:
- addresses:
- ip: 110.242.68.66 #需要代理的地址,已百度IP地址为例,
ports:
- name: http #该方式需要与nginx-svc-external.yaml中的方式一致
port: 80 #该方式需要与nginx-svc-external.yaml中的方式一致
protocol: TCP #该方式需要与nginx-svc-external.yaml中的方式一致
################验证代理第三方IP地址(以百度为例)
ping baidu.com #查看百度IP地址
kubectl create -f nginx-svc-external.yaml #创建代理Service
kubectl create -f nginx-ep-external.yaml #创建代理端点
kubectl get svc #查看创建的代理Service
kubectl get ep #查看创建的代理端点
curl baidu.com -I #查看百度是否能正常返回
curl dailService的IP地址 -I #验证效果,备注:与curl baidu.com -I 效果一致为正常
vim nginx-externalname.yaml #反代理域名,以百度为例
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-externalname
name: nginx-externalname
spec:
type: ExternalName
externalName: www.badu.com
vim nginx-externalName.yaml #创建Service
kubectl get svc #查看创建的Service
##############验证反代理的域名
kubectl exec -ti busybox -- sh #进入busybox容器内部
nslookup nginx-externalname #解析Service服务
wget IP地址 #访问IP地址
Ingress:用于实现域名的方式访问K8S内部应用
##############ingress通过helm安装部署####################
helm search repo ingress-nginx #查看ingress-nginx资源版本
helm pull ingress-nginx/ingress-nginx #下载安装包
vim values.yaml #修改helm的配置文件
controller:
name: controller
image:
chroot: false
registry: registry.k8s.io #修改为本地镜像仓库地址
image: ingress-nginx/controller
digest: sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974 #注释该认证信息
dnsPolicy: ClusterFirstWithHostNe #如果hostNetwork是true,必须将该字段修改为:ClusterFirstWithHostNet
hostNetwork: false #修改为: ture
kind: Deployment #修改部署方式,改为:DaemonSet
terminationGracePeriodSeconds: 300
# -- Node labels for controller pod assignment
## Ref: https://kubernetes.io/docs/user-guide/node-selection/
##
nodeSelector:
kubernetes.io/os: linux
ingress: "true" #增加该行
type: LoadBAlancer #部署的环境类型,修改为:ClusterIP
patch:
enabled: true
image:
registry: registry.k8s.io #修改为本地镜像仓库地址
image: ingress-nginx/kube-webhook-certgen
kubectl create ns ingress-nginx #创建命名空间
kubectl get ns #查看命名空间
kubectl label node k8s-master03 ingress=true #添加标签
kubectl label node k8s-master03 ingress- #删除标签
helm install ingress-nginx -n ingress-nginx . #安装ingress
kubectl get po -n ingress-nginx -owide #查看ingress的Pod安装状态
netstat -lntp | grep 80 #查看端口(在k8s-master03)
ps aux|grep nginx #查看进程(在k8s-master03)
#####################ingress的使用####################
##官方文档地址: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/
vim ingress.yaml #创建访问Service的配置文件(单域名)
apiVersion: networking.k8s.io/v1 #在1.19版本以后的版本名称
kind: Ingress #资源清单类型
metadata: #元数据
annotations:
kubernetes.io/ingress.class: "dy-nginx"
name: example
spec:
rules: #定义后端转发的规则
- host: foo.bar.com #通过该域名进行转发,如不写将匹配所有地址
http:
paths: #匹配的地址
- path: / #配置访问路径,如果通过url进行转发,需要修改;空默认为访问的路径为"/"
pathType: Prefix
backend: #配置后端服务
service:
name: nginx-svc #需要代理的服务,服务名称
port:
number: 80
kubectl create -f ingress.yaml #创建ingress
kubectl replace -f ingress.yaml #更新ingress
kubectl get ingress #查看ingress的配置
kubectl get po -n ingress-nginx #查看ingress的pod名称
##配置hosts k8s-master03的IP地址(192.168.80.130) foo.bar.com
##在浏览器访问:foo.bar.com
##出现nginx页面则表示成功
ConfigMap:是分布式系统中的**『配置中心』**,将启动参数保存到ConfigMap中,文件名作为key,value是整个文件的内容;作用是:将配置和Pod的分开;
##官方文档地址:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/
#################创建configmap####################
mkdir -p configure-pod-container/configmap/ #创建本地目录
cd configure-pod-container/configmap/ #进入目录
wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties # 下载模板文件
kubectl create configmap game-config --from-file=configure-pod-container/configmap/ #创建模板, 将配置文件写入到configmap
kubectl create cm game-ui-cm --from-file=/root/config-map/configure-pod-container/configmap/ui.properties #指定properties 文件创建
kubectl create cm game-ui-cm-custom-name --from-file=ui-pro=/root/config-map/configure-pod-container/configmap/ui.properties #修改文件名称
kubectl describe cm game-config #查看文件内容(使用较少)
kubectl get configmaps game-config -o yaml #查看文件内容(使用较多)
kubectl get cm #查看所有的configmap
###############验证configmap(通过日志查看自定义配置)
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm #通过命令行定义文字值,创建configmap
kubectl get configmaps special-config -o yaml #查看创建的内容
kubectl describe cm special-config #查看创建的configmap格式内容
vim test-env-pod.yaml #使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
nodeName: k8s-master03
containers:
- name: test-container
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config
env:
- name: test
value: test-value
- name: mysqlHostAddress
value: 10.10.10.10
- name: mysqlPost
value: "3306" #数字必须是字符串
restartPolicy: Never
kubectl create -f test-env-pod.yaml #创建configmap Pod
kubectl logs -f dapi-test-pod #查看定义的配置信息
###############验证configmap(通过挂载存储卷(volume))查看配置
vim test-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
nodeName: k8s-master03
containers:
- name: test-container
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: config-volume
mountPath: /mnt/config
envFrom:
- configMapRef:
name: special-config
env:
- name: test
value: test-value
- name: mysqlPost
value: "3306"
restartPolicy: Never
volumes:
- name: config-volume
configMap:
name: game-ui-cm-custom-name
kubectl create -f test-env-pod.yaml #创建configmap Pod
kubectl exec -ti dapi-test-pod sh #进入容器内部查看配置内容
Secret(加密):解决了密码、token、密钥等敏感数据的配置问题,Secret中的数据要求以BASE64 编码格式存放 ;
##官方文档地址: https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/#using-imagepullsecrets
#################################创建 Secret(命令行)######################
echo -n 'admin' > ./username.txt #将账号放到文件中(-n没有换行符)
echo -n '1f2d1e2e67df' > ./password.txt ##将密码放到文件中(-n没有换行符)
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt #将文件打包成一个 Secret 并在 API 服务器上创建对象
kubectl create secret generic db-user-pass2 --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb=' #创建带有特殊字符的内容(无需转义)
kubectl delete secret db-user-pass #删除secret
kubectl get secret #检查 secret 是否已创建
kubectl get secret db-user-pass -oyaml #查看Secret的信息
echo "UyFCXCpkJHpEc2I9" | base64 --decode #查看解密后的username的值
#################################创建 Secret(yaml文件)######################
vim manually-secret.yaml #编辑文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
username: admin
password: password
kubectl create -f manually-secret.yaml #创建文件
kubectl get secret mysecret -oyaml #查看文件
echo "c3lzdGVtLXBhc3N3b3Jk" | base64 --decode #对username解密
############################docker私有仓库的创建####################
##imagePullSecret:Pod从私有仓库拉取镜像时使用的账号密码,kubelet使用该账号和密码从私有仓库中拉取镜像
kubectl create secret docker-registry docker-secret \
[email protected] \
--docker-username=tiger \
--docker-password=pass1234 \
--docker-server=hub.docker.com #创建docker仓库的secret
kubectl get secret docker-secret -oyaml #查看内容
echo "c3lzdGVtLXBhc3N3b3Jk" | base64 --decode #对.dockerconfigjson解密
Volume(存储卷):将数据持久化存储,Volume(存储卷)的生命周期与Pod绑定,挂载为容器内的目录和文件,有ConfigMap :主要保存应用程序所需的配置文件;Secret :私密;Downward API :可以将 Pod 或 Container(容器) 的某些元数据信息(例如 Pod 名称、 Node IP 、 Label 、 Annotation 、容器资源限制等)以文件的形式 挂载到容器内;
Volume(存储卷)的作用: Container(容器)中的磁盘文件是短暂的,当容器崩溃时,kubelet会重新拉取容器,但最初的文件会丢失,Container(容器)会以最干净的状态启动,Volume(存储卷)可以解决多个容器共享同一个文件的问题。
Volume(存储卷)的类型:
- emptyDir:主要是用于不同Container(容器)的数据共享,可以挂载到相同或不同的路径上,当Pod删除后emptyDir卷中的数据也会删除;
- hostPath:将宿主机上的文件或目录挂载到Pod上,用于Pod自定义日志输出或访问Docker内部容器等;
############################emptyDir使用方式##################
###emptyDir:主要是用于数据共享
vim nginx-deploy-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-09-17T09:31:42Z"
generation: 1
labels:
app: nginx-volume
name: nginx-volume
namespace: default
spec:
progressDeadlineSeconds: 600
eplicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: dy-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: dy-nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx #第一个容器名称
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: #第一个容器的存储卷信息
- mountPath: /opt
name: share-volume
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx2 #第二个容器名称
command:
- sh
- -c
- sleep 3600
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: #第二个容器的存储卷信息
- mountPath: /mnt
name: share-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: #存储卷
- name: share-volume
emptyDir: {}
kubectl create -f nginx-deploy-volume.yaml #创建Pod
kubectl get po #查看Pod
kubectl exec -ti nginx-volume-5f7dc9bd-zghws -c nginx -- bash #进入第一个容器
cd /opt #进入目录
touch 123 #创建文件
kubectl exec -ti nginx-volume-5f7dc9bd-zghws -c nginx2 -- bash #进入第二个容器
cd /mnt #进入目录
echo "test data" > 123 #写入内容
kubectl exec nginx-volume-5f7dc9bd-zghws -c nginx -- cat /opt/123 #从第一个容器查看内容
###################hostPath的使用方式#####################
###hostPath: 将宿主机的文件或目录挂载到容器中
cat /etc/timeone #查看宿主机日期目录
kubectl exec nginx-volume-5f7dc9bd-zghws -c nginx -- date #查看容器时间(nginx是容器名)
vim nginx-deploy-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-09-17T09:31:42Z"
generation: 1
labels:
app: nginx-volume
name: nginx-volume
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: dy-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: dy-nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx #第一个容器名
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: #第一个容器挂载volume
- mountPath: /opt #第一个容器挂载volume的emptyDir
name: share-volume
- mountPath: /etc/timezone #第一个容器挂载volume的hostPath
name: timezone
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx2 #第二个容器名
command:
- sh
- -c
- sleep 3600
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: #第一个容器挂载volume的emptyDir
- mountPath: /mnt
name: share-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: #挂载卷
- name: share-volume
emptyDir: {} #挂载卷的emptyDir
- name: timezone
hostPath: #挂载卷的hostPath
path: /etc/timezone
type: File #类型有:空字符串代表挂载hostPath之前不会执行任何检查;DirectoryOrCreate代表如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权;Directory代表在给定路径上必须存在的目录;FileOrCreate代表如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权;File代表在给定路径上必须存在的文件;Socket代表在给定路径上必须存在的 UNIX 套接字;CharDevice代表在给定路径上必须存在的字符设备;BlockDevice代表在给定路径上必须存在的块设备;
kubectl replace -f nginx-deploy-volume.yaml #更新配置文件
kubectl exec nginx-volume-5ddffdd7cd-78h5c -c nginx -- cat /etc/timezone #查看是否容器内的日期是否生效
#######################nfs的使用######################
###以下操作要在所有节点执行
yum install nfs-utils -y #安装nfs
systemctl start nfs-server #启动服务
systemctl enable nfs-server #设置开机启动
ps aux #查看是否有进程
cat /proc/fs/nfsd/versions #查看版本信息
mkdir -p /data/nfs #创建共享目录
vim /etc/exports #编辑配置文件
/data/nfs/ 192.168.80.0/24(rw,sync,no_subtree_check,no_root_squash)
exportfs -r #重新导出所有目录
systemctl reload nfs-server #重新加载
vim nginx-deploy-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-09-17T09:31:42Z"
generation: 1
labels:
app: nginx-volume
name: nginx-volume
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: dy-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: dy-nginx
spec:
containers:
- image: nginx:1.15.2 #第一个容器
imagePullPolicy: IfNotPresent
name: nginx #第一个容器名称
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: #挂载volume
- mountPath: /opt #挂载emptyDir
name: share-volume
- mountPath: /etc/timezone #挂载hostPath
name: timezone
- mountPath: /data #挂载nfs
name: nfs-volume
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx2
command:
- sh
- -c
- sleep 3600
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /mnt
name: share-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: #挂载volume
- name: share-volume #使用emptyDir方式
emptyDir: {}
- name: timezone
hostPath: #使用hostPath方式
path: /etc/timezone
type: File
- name: nfs-volume
nfs: #使用nfs方式
server: 192.168.80.131
path: /data/nfs/test-dp
kubectl replace -f nginx-deploy-volume.yaml #重新编译
kubectl get po #查看Pod状态
kubectl exec -ti nginx-volume-b5c6757d-kzvvs -c nginx -- bash #进入容器内部
df -Th #查看目录占用情况
cd /data/ #进入目录
touch 123 #创建文件
cd /data/nfs/test-dp #在192.168.80.131机器上执行
echo "test" > 123 #往文件中写数据
kubectl exec -ti nginx-volume-b5c6757d-kzvvs -c nginx -- bash #进入容器内部
cd /data/
cat 123 #查看文件内容,显示为:test
PV(Persistent Volume ):持久卷;PV生命周期,资源供应分为静态模式 (Static ) 和动态模式 (Dynamic) ,资源供应的结果就是将适合的PV和PVC成功绑定;资源绑定,系统将根据PVC对存储资源的请求(存储空间和访问模式)在已存在的 PV 中选择一个满足 PVC 要求的 PV ,一旦找到,就将该 PV 与用户定义的 PVC 绑定;资源使用,需要在 Volume 的定义中引用 PVC 类型的存储卷,将 PVC 挂载到容器内的某个路径下进行使用 ;资源回收(Reclaiming) ,回收策略有Retain (保留数据)、 Delete (删除数据)、Recycle (弃用);
PV生命周期流程图
####################nfs类型的PV##################
mkdir -p /data/nfs/test-test #创建目录
touch a #创建文件
vim nfs-pv.yaml
apiVersion: v1 #版本信息
kind: PersistentVolume #类型
metadata: #元数据
name: pv0001 #元数据名称
spec:
capacity: #持久卷的容量
storage: 5Gi
volumeMode: Filesystem #挂载的类型,Filesystem是默认;boock是块;
accessModes: #访问模式
- ReadWriteMany #ReadWriteOnce(RWO):可以被单节点以读写模式挂载;ReadWriteMany(RWX):可以被多节点以读写模式挂载;ReadOnlyMany(ROX):可以被多节点以读只模式挂载
persistentVolumeReclaimPolicy: Recycle #回收策略:Recycle(回收),对应的pv地址也会删除,已弃用;Retain(保留):保留pv的元数据;Delete:删除PVC后,PV也会删除;
storageClassName: nfs-slow #PV的类名,当PVC和PV的类名一致时才能绑定
mountOptions: #挂载的参数列表
- hard
- nfsvers=4.1
nfs:
path: /data/nfs/test-test
server: 192.168.80.131
kubectl apply -f nfs-pv.yaml #创建PV
kubectl get pv #查看创建的PV信息,状态有Available(可用的):空闲的PV,没有被PVC绑定;Bound(绑定):已被PVC绑定;Released:PVC被删除,但资源未被重新使用;Failed:回收失败;
PVC(Persistent Volume Claim) :主要是涉及存储空间请求、访问模式、PV选择条件和存储类别等信息的设置 ;
StorageClass 的选择和 PV/PVC 的绑定关系
PVC(Persistent Volume Claim)异常情况:
1.创建PVC后绑定不上PV,一直处于Pending状态的原因:1)PVC申请的空间比PV的空间大;2)PVC的storageClassName字段与PV的storageClassName名不一致;3)PVC的accessModes字段与PV的accessModes不一致;
2.创建PVC挂载的Pod,一直处于Pending状态的原因:1)PVC没创建成功;2)PVC和Pod不在同一个namespace下;
3.删除PVC后的情况:1)删除PVC;2)K8S会创建用于回收的Pod;3)根据PV的回收策略回收;4)回收后的PV处于空闲状态;5)处于Pending状态的PVC会与该PV进行绑定;
####################PersistentVolumeClaim(PVC)的创建#####################
vim test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteMany #该值要与PV中的值一致
volumeMode: Filesystem
resources:
requests:
storage: 2Gi #该值要小于PV中的值
storageClassName: nfs-slow #该值要与PV中的值一致
#selector: #标签选择器
# matchLabels: #一对一匹配
# release: "stable"
# matchExpressions: #正则匹配
# - {key: environment, operator: In, values: [dev]}
kubectl apply -f test-pvc.yaml #创建PVC
kubectl get pvc #查看PVC
###################Pod调用pvc实现方式###################
##Pod调用pvc,pvc调用pv,pv使用nfs
vim nginx-deploy-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-09-17T09:31:42Z"
generation: 1
labels:
app: nginx-volume
name: nginx-volume
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: dy-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: dy-nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /opt
name: share-volume
- mountPath: /etc/timezone
name: timezone
- mountPath: /data
name: nfs-volume
- mountPath: /tmp/pvc #挂载PVC路径
name: pvc-test
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx2
command:
- sh
- -c
- sleep 3600
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /mnt
name: share-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: share-volume
emptyDir: {}
- name: timezone
hostPath:
path: /etc/timezone
type: File
- name: nfs-volume
nfs:
server: 192.168.80.131
path: /data/nfs/test-dp
- name: pvc-test #使用PVC存储
persistentVolumeClaim:
claimName: myclaim
kubectl create -f nginx-deploy-volume.yaml #创建pod
kubectl get po #查看pod
kubectl exec -ti nginx-volume-7649688d9c-kxrb7 -c nginx -- bash #进入Pod容器
df -Th #查看挂载目录
#效果:192.168.80.131:/data/nfs/test-test nfs4 17G 3.9G 14G 23% /tmp/pvc
cd /tmp/pvc #进入挂载目录
echo "text123" >a #往文件写内容
cd /data/nfs/test-test #在192.168.80.131上执行
cat a
###效果: text123
CronJob:定时执行计划任务;
#############################创建CronJob#####################
vim busybox-cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
concurrencyPolicy: Allow #并发调度策略,Allow (默认):允许同时运行多个任务;Forbid:禁止并发运行,如果上一次运行尚未完成则跳过下一次运行;Replace:取消当前正在运行的作业并将其替换为新作业
failedJobsHistoryLimit: 1 #保留失败的任务数
schedule: "* * * * *" #调度策略,分时日月周
jobTemplate: #指定执行 CronJob 时将创建的作业
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
kubectl create -f busybox-cronjob.yaml #创建任务
kubectl get cj #查看任务
kubectl delete cj hello #删除任务
Taints(污点) 和 tolerations(容忍):
- 作用:Taints(污点):在同一类的服务器上打污点,不能tolerations(容忍)该 Taints(污点)的Pod不能在该节点部署;
- 类型: NoSchedule:禁止调度;NoExecute:如不符合该污点,会立马驱逐;PreferNoSchedule:尽量避免将Pod调度到指定的节点上;
kubectl taint node k8s-master01 master-test=test:NoSchedule #给节点打污点,NoSchedule:禁止调度;NoExecute:如不符合该污点,会立马驱逐;PreferNoSchedule:尽量避免将Pod调度到指定的节点上
kubectl taint node k8s-master01 master-test:NoSchedule- #删除节点上的污点
kubectl describe node k8s-master01 #查看节点详细信息
spec
containers:
nodeSelector: #给节点设置标签
kubernetes.io/hostname: k8s-master01
tolerations: #给节点设置容忍
- key: "master-test" #污点的名称
value: "test" #污点的值
effect: "NoSchedule" #污点的影响
operator: "Equal" #容忍的匹配规则:Equal代表等于;
tolerationSeconds: 60 #容忍时间(秒)
initContainer(初始化容器):在容器启动之前做一些初始化操作;
spec:
initContainers:
- image: nginx
imagePullPolicy: IfNotPresent
command: ["/sbin/sysctl", "-w", "vm.max_map_count=262144"]
name: elasticsearch-logging-init
securityContext:
privileged: true
Affinity(亲和性)策略
- 节点亲和性又分为:RequiredDuringSchedulingIgnoredDuringExecution(硬策略):支持必须部署在指定的节点上,也支持必须不部署在指定的节点上;PreferredDuringSchedulingIgnoredDuringExecution(软策略):尽量部署在满足条件的节点上,或尽量不要部署在指定的节点上;
Affinity(亲和性)配置规则
- nodeAffinity :节点亲和性,用来控制 Pod 要部署在哪些节点上,以及不能部署在哪些节点上,这个是
Pod与Node之间
匹配规则的;- podAffinity :pod 亲和性,这个是
Pod 与 Pod 之间
匹配规则的;- podAntiAffinity :pod 反亲和性,与 podAffinity 相反;
#######################节点(Node)亲和性#######################
kubectl label node k8s-node01 kubernetes.io/e2e-az-name=e2e-az1 #给k8s-node01打硬策略标签
kubectl label node k8s-node02 kubernetes.io/e2e-az-name=e2e-az2 #给k8s-node02打硬策略标签
kubectl label node k8s-node01 another-node-label-key=another-node-label-value #给k8s-node01打软策略标签
kubectl label node k8s-master01 another-node-label-key=another-node-label-value #给k8s-master01打软策略 标签
vim test-node-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dy-affinity
name: dy-affinity
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: dy-affinity
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: dy-affinity
spec:
affinity: #亲和性
nodeAffinity: #节点亲和性
requiredDuringSchedulingIgnoredDuringExecution: #硬策略
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In #运算关系,In:label 的值在某个列表中;NotIn:label 的值不在某个列表中;Gt:label 的值大于某个值;Lt:label的值小于某个值;Exists:某个 label 存在(值不能为字符串);DoesNotExist:某个 label 不存在
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution: #软策略
- weight: 1 #权重倾向
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl create -f test-affinity.yaml #创建Pod
kubectl delete po -l app=dy-affinity #删除Pod(批量删除相同的名字)
kubectl edit deploy dy-affinity #修改Pod
#######################Pod亲和性#######################
kubectl get po busybox -owide #查看pod的详细信息
kubectl get po busybox --show-labels #查看busybox的标签
vim test-pod-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dy-affinity
name: dy-affinity
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: dy-affinity
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: dy-affinity
spec:
affinity: #亲和性
# podAntiAffinity: #pod反亲和性,意思是与指定的Pod不部署到一起
podAffinity: #pod亲和性,意思是与指定的Pod部署到一起
requiredDuringSchedulingIgnoredDuringExecution: #硬策略
- labelSelector: #标签选择器
matchExpressions: #按节点标签列出的节点选择器要求列表
- key: app
operator: In
values:
- busybox2
namespaces: #指定参照pod的命名空间
- default
topologyKey: kubernetes.io/hostname #拓扑域,用于指定调度时作用域,例如:如果指定为kubernetes.io/hostname,那就是以Node节点为区分范围,如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl create -f test-pod-affinity.yaml #创建Pod
kubectl replace -f test-pod-affinity.yaml #更新Pod
kubectl get po -n default -l app=busybox2 #查看指定Pod的标签信息
RBAC(Role Based Access Control):基于角色的访问控制,共分为4个顶级资源1)Role(角色):包含一组权限的规则,没有拒绝规则,只是附加允许,只在本Namespace(命名空间)内有效;2)ClusterRole(集群角色)作用于整个集群;3)RoleBinding(角色绑定)只在本命名空间内有效,将ClusterRole或者Role绑定到User、Group、ServiceAccount;4)ClusterRoleBinding(集群角色绑定)作用于整个集群;
kubectl get role --all-namespaces #查看所有命名空间的角色
kubectl get role ingress-nginx -n ingress-nginx -oyaml #根据命名空间内的名字查看角色详细信息
kubectl get rolebinding --all-namespaces #查看所有命名空间的角色绑定信息
kubectl get rolebinding ingress-nginx -n ingress-nginx -oyaml #根据命名空间内的名字查看角色绑定的详细信息
kubectl get clusterrole #查看整个集群角色
kubectl get clusterrole view -oyaml #查看详细信息
Prometheus监控:kub-state-metrics采集:是监控K8S集群状态的基本信息;
node-exporter采集:是监控K8S运算节点宿主机基础设施的信息;
cadvisor采集:是一个开源的分析**Docker容器**资源使用率和性能特性的代理工具,自动查找其所在Node上的所有容器,自动采集CPU、内存、文件系统和网络使用的统计信息,通过所在Node节点暴露4194端口,**在V1.10版本已废弃**;
blackbox-exporter采集:监控业务容器是否存活;
#####################Prometheus安装部署
git clone -b release-0.11 --single-branch https://github.com/prometheus-operator/kube-prometheus.git #下载Prometheus
cd /kube-prometheus/manifests/setop #进入operator控制器目录
kubectl create -f . #安装operator控制器
kubectl get po -n monitoring #查看operator是否运行
cd /kube-prometheus/manifests #进入Prometheus目录
kubectl create -f . #安装Prometheus集群
kubectl get po -n monitoring -owide #查看服务状态
kubectl get ingress -n monitoring #查看ingress服务状态
kubectl get ingress -n monitoring prom-ingresss -oyaml #查看ingress配置文件
apiVersion: v1 #版本信息
kind: Pod #资源类型
metadata: #元数据
#namespace: default #命名空间 default是默认空间,一般都不在文件中加该参数
name: nginx #名称,符合RFC 1035规范的名称
labels: #标签
app: nginx #相当于:app=nginx
role: frontend #角色,可以有多个
annotations: #注释信息
kubernetes.io/ingress-bandwidth: 3M #限制网络带宽,入口带宽
kubernetes.io/egress-bandwidth: 4M #限制网络带宽,出口带宽
securityContext: #Pod内核环境(在V1.11版本以上)
sysctls: #设置Pod内核参数
- name: kernel.shm_rmid_forced #是否强制将共享内存和一个进程联系在一起
value: "0"
- name: net.ipv4.route.min_pmtu #路由最小传达单元
value: "552"
- name: kernel.msgmax #信息最大
value: "65536"
spec: #定义容器的详细信息
hostAliases: #自定义 hosts内容
- ip: "127.0.0.1" #
hostnames:
- "foo.local"
- "bar.local"
hostIPC: true #使用主机的 IPC 命名空间,默认为 false
hostPID: true #使用主机的网络命名空间,默认为 false
hostNetwork: true #是否为主机模式,默认为 false
hostname: busybox-2 #设置主机名,默认使用 metadata.name
subdomain: default-subdomain #设置 Pod 的子域名,默认为空; 完成域名为:busybox-2.default-subdomain.default.svc.cluster.local,也可以简写为 busybox-2.default-subdomain.default
lifecycle: #容器生命周期钩子,监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数
postStart: #第一种钩子:容器创建后立即执行的命令,注意由于是异步执行,它无法保证一定在 ENTRYPOINT 之前运行。如果失败,容器会被杀死,并根据 RestartPolicy 决定是否重启,有exec、httpGet、TCPSocket
httpGet: #钩子回调函数:向指定 URL 发起 GET 请求,如果返回的 HTTP 状态码在 [200, 400) 之间表示请求成功,否则表示失败
path: /
port: 80
preStop: #第一种钩子:容器终止前执行,常用于资源清理。如果失败,容器同样也会被杀死
exec: #钩子回调函数:在容器内执行命令,如果命令的退出状态码是 0 表示执行成功,否则表示失败
command: ["/usr/sbin/nginx","-s","quit"] #命令
priorityClassName: high-priority #设置pod调度优先级
initContainers: #初始化容器,在容器启动之前执行的一些操作,每个 Init 容器必须运行成功,下一个才能够运行,当所有的 Init 容器运行完成时,K8s 初始化 Pod 并像平常一样运行应用容器
- name: install #容器名称
image: busybox #镜像
- command: #命令
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts: #存储卷配置
- name: workdir #存储卷名称
mountPath: "/work-dir" #挂载路径
readOnly: true #只读
dnsPolicy: Default #DNS(系统域名)策略
volumes: #存储卷
- hostPath: #在 Pod 上 挂载宿主机上的文件或目录
path: /etc/localtime #宿主机路径
type: ""
name: time
- name: workdir
emptyDir: {} #空路径,临时空间,k8s默认创建,使用节点的存储介质,
containers: #容器列表
- name: nginx #容器名称
image: nginx:1.15 #容器的镜像地址
imagePullPolicy: IfNotPresent #镜像拉取策略,IfNotPresent:如宿主机有该镜像,将不在拉取;Always:总是拉取;Nevever:不管是否存在都拉取;
livenessProbe: #探测应用是否处于健康状态,如果不健康则删除并重新创建容器。
httpGet: #执行探针,对指定的容器 IP、端口及路径执行一个 HTTP Get 请求,如果返回的 状态码 在 [200,400) 之间则表示探测成功,否则表示失败
path: /
port: 80
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 15 #初始化时间
timeoutSeconds: 1 #超时时间
periodSeconds: 5 #检测间隔
startupProbe: #检测容器内进程是否完成启动,注意:三种检测方式同时只能使用一种
httpGet: #httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供
path: /api/successStart #检测路径
port: 80 #检测端口
readinessProbe: #探测应用是否启动完成并且处于正常服务状态,如果不正常则不会接收来自K8s Service 的流量,即将该Pod从Service的endpoint中移除
exec: #执行容器命令检测方式,在容器中执行一个命令,如果 命令退出码 返回 0 则表示探测成功,否则表示失败
#tcpSocket: #对指定的容器 IP 及端口执行一个 TCP 检查,如果端口是开放的则表示探测成功,否则表示失败
command #容器启动执行的命令
- cat
- /usr/share/nginx/html/index.html
workingDir: /usr/share/nginx/html #容器工作目录,进入容器的默认目录
initialDelaySeconds: 5
timeoutSeconds: 1
resources: #资源,通过 cgroups 限制容器的 CPU 和内存等计算资源
requests: #请求,调度器保证调度到资源充足的 Node 上,如果无法满足会调度失败
cpu: "300m" #CPU 请求,也是调度 CPU 资源的依据,可以超过
memory: "56Mi" #内存请求,也是调度内存资源的依据,可以超过;但如果超过,容器可能会在 Node 内存不足时清理
limits: #上限
hugepages-2Mi: 100Mi #一个能提供2MiB规格的巨页:为了提高TLB(Translation Lookaside Buffer:内存地址映射的缓存表)的缓存命中率
cpu: "1" #CPU 上限,可以短暂超过,容器也不会被停止
memory: "128Mi" #内存上限,不可以超过;如果超过,容器可能会被终止或调度到其他资源充足的机器上
ports: #容器需要暴露的端口列表
- name: http #端口名称
containerPort: 80 #容器端口号
protocol: TCP #端口协议,默认TCP
env: #环境变量配置列表
- name: TZ #变量名
value: Asia/Shanghai #变量的值
resources: #资源限制和资源请求限制
limits: #最大限制设置
cpu: 1000m #cpu
memory: 1025mi #内存
requests: #启动所需的资源
cpu: 1000m #cpu
memory: 1025mi #内存
restartPolicy: Never #重启策略,默认是Always,仅支持Never(无论何种情况下,Kubelet都不会重启该容器)、 OnFailure(当容器终止运行且退出码不为0时由Kubelet重启)、Always(当容器失效时,由Kubelet自动重启该容器。RestartPolicy的默认值)
nodeSelector: #指定node节点
region: sub7
imagePullSecrets: #拉取镜像使用的secret
- name: default-dockertcfg-86258
volumes: #共享存储卷列表
- name: webroot #名称,与上述对应
emptDir: {} #挂载目录
hostPstPath: #挂载本机目录
path: /etc/hosts
apiVersion: v1 #版本信息
kind: Pod #资源类别
metadata: #元数据
name: with-node-affinity #名称
spec: #期望的状态(disired state),期望资源应该用于什么特性
podSelector : #定义该网络策略作用的 Pod 范围,本例的选择条件为包含role=db标签
matchLabels: #
role: db
policyTypes: #网络策略的类型,包括 ingress 和 egress 两种
ingress: #定义允许访问目标 Po d 的入站白名单规则,满足 from 条件的客户端才能访问 ports 定义的目标 Pod 端口号
- from : #对符合条件的客户端Pod进行网络放行,规则包括基千客户端Pod的Label、基于客户端Pod所在命名空间的Label 或者客户端的 IP 范围 。
- ipBlock :
cidr : 172.17.0.0 / 16
except:
- 172.17.1.0/24
egress : #定义目标Pod允许访问的”出站“白名单规则,目标Pod仅允许访问满足to 条件的服务端IP范围和ports定义的端口号
- to : #允许访问的服务端信息,可以基于服务端Pod的Label、基于服务端Pod所在命名空间的Label或者服务端IP范围
- ipBlock :
cidr : 10.0.0.0/24
schedule: "*/1 * * * *" #定时,每个1分钟运行一次
jobTemplate : #工作模板
spec: #模板描述
template : #模板内容
spec: #描述
containers : #容器
- name : hello #容器名称
image : busybox #镜像名称
args: #参数
- /bin/sh #运行的是shell脚本
- -c
-date; echo Hello from the Kubernetes cluster #脚本运行时会在控制台输出 时间和hello字符串
restartPolicy: OnFailure #重启策略
nodeSelector: #节点选择器,只有label匹配
disktype: ssd #标签名称 命令: kubectl label nodes node-01 disktype=ssd 首先给Node打上标签
affinity: #亲和度
podAffinity: #Pod亲和性的调度策略,表示两个Pod在同一个节点上运行
requiredDuringSchedulingIgnoredDuringExecution: #要求只运行在amd64的节点上
- labelSelector: #标签选择器
matchExpressions: #比较表达式
- key: security #key是security
operator: In #运算 (In包含)
values: #值
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone #目标拓扑区域内几种相关联的Pod要“在一起或不在一起"
podAntiAffinity: #Pod互斥的调度策略,创建的Pod,我们希望它不与目标Pod运行在同一个Node上
preferredDuringSchedulingIgnoredDuringExecution: #要求尽量运行在磁盘类型为ssd的节点上
- weight: 100
podAffinityTerm: #
labelSelector: #标签选择器
matchExpressions: #比较表达式
- key: security #key是security
operator: In #运算 (In包含)
values: #值
- S2
topologyKey: kubernetes.io/hostname
nodeAffinity: #Node亲和性的调度策略
requiredDuringSchedulingIgnoredDuringExecution: #要求只运行在amd64的节点上
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution: #要求尽量运行在磁盘类型为ssd的节点上
- weight: 1
preference: #优先
matchExpressions: #比较表达式
- key: another-node-label-key #key是another-node-label-key
operator: In #运算 (In包含)
values: #值
- another-node-label-value
containers: #容器
- name: with-node-affinity #容器名称
image: gcr.io/google_containers/pause:2.0 #镜像