Kubernetes笔记资料

​​​​​​地址​​​​​​​

官网: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 

helm命令

##官方文档: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);  
  1. 流程图

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 (弃用);​​​​​​​  
  1. PV生命周期流程图         

Kubernetes笔记资料_第1张图片
 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注入额外的信息,如环境变量、存储卷、配置容器时间、字符集等;

​​​​​​​​​​​​​​​​​​​​​​​​​​​​ K8S核心组件

etcd服务(配置存储中心):是键值数据库,主要是存储元数据(集群信息);

主控(master)节点 

        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(节点控制器)核心工作流程图

                
  1. Resource quta Controller(资源配额控制器)流程架构图

        3)scheduler服务(集群的调度中心):负责接收调度通过预算策略(predict)和优选策略(priorities)将Pod调度到适合的运算节点上,最后存到etcd中,在V1.5版本之后使用Framework调度机制;

工作节点 (node)

        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. 网络模型

                         Kubernetes笔记资料_第2张图片

网络插件 

        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的命令#########################################################
   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创建流程

​​​​​​​​​​​​​​

Kubernetes笔记资料_第3张图片

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删除流程

Kubernetes笔记资料_第4张图片

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架构图
  1. 架构从上到下:

    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 (弃用);​​​​​​​  
  1. PV生命周期流程图         

Kubernetes笔记资料_第5张图片
####################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 的绑定关系

Kubernetes笔记资料_第6张图片

 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配置文件

yaml配置含义

创建Pod的yaml

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   

yaml文件内容解释 

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 #镜像

你可能感兴趣的:(云原生)