/k8s学习笔记

Created Tue, 16 May 2023 11:04:10 +0900

参考:黑马程序员K8S全套教程

知识点概括

  • pod:控制器的特点以及使用定义方式
  • 服务发现:svc原理以及构建方式
  • 存储:多种存储类型的特点
  • 调度器: 原理,根据需求把pod定义到想到的节点运行
  • 安全:集群的认证 鉴权 访问控制 原理及其流程
  • HELM: 类比linux yum,原理
  • 运维: 修改Kubeadm(搭建k8s集群的工作) 延长证书可用期限更高,构建高可用的k8s集群

附: 服务分类:有状态服务(DBMS)和无状态服务(APACHE)

组件

  • APISERVER:所有服务访问统一入口
  • CrontrollerManager:维持副本期望数目
  • Scheduler:负责介绍人物,选择合适的节点进行分配任务
  • ETCD: 键值对数据库 储存K8S集群所有重要信息(持久化)
  • Kubelet: 直接跟容器引擎交互实现容器的生命周期管理
  • Kube-proxt:负责写入规则至IPTABLES,IPVS 实现服务映射访问的
  • (插件)CoreDNS:为急群众的SVC中创建一个域名IP对应关系解析
  • (插件)DASHBOARD:给k8s集群提供B/S结构访问体系
  • (插件)INGRESS CONTROLLER:官方只实现4层代理,INGRESS可以实现7层代理
  • (插件)FEDETATION:提供一个可以跨集群中文多K8S统一管理功能
  • (插件)PROMETHEUS:提供K8S集群的监控能力
  • (插件)ELK:提供K8S集群日志统一分析接入平台

知识点详解

资源管理方式

先创建yaml文件,然后使用kubectl命令去根据yaml文件创建k8s上的资源。

pod相关

注意点:

  1. pod如果被delete,然后被deployment拉起之后,一般内部的虚拟ip会发生改变
  2. 访问容器中的程序需要使用的是podIp:containerPort
  3. 启动时最好加上参数–record,这个命令可以记录历史记录等

label相关

deployment相关

service相关

service的type为ClusterIP的话,只能在k8s的node节点上访问到(内部集群可访问)。为NodePort的话,在外部也可访问。

cluster

NodePort

pod详解

每个pod都会有一个根容器,叫做Pause容器。一般用于①评估整个pod的健康状态。②在根容器上设置ip地址,其他容器通过此ip实现pod内部的网络通信。

pod的资源清单(yaml配置参数详解)

可以直接用kubectl explain pod命令来查看

apiVersion: v1     #必选,版本号,例如v1
kind: Pod         #必选,资源类型,例如 Pod
metadata:         #必选,元数据
  name: string     #必选,Pod名称
  namespace: string  #Pod所属的命名空间,默认为"default"
  labels:           #自定义标签列表
    - name: string                 
spec:  #必选,Pod中容器的详细定义
  containers:  #必选,Pod中容器列表
  - name: string   #必选,容器名称
    image: string  #必选,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #获取镜像的策略 
    command: [string]   #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]      #容器的启动命令参数列表
    workingDir: string  #容器的工作目录
    volumeMounts:       #挂载到容器内部的存储卷配置
    - name: string      #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean #是否为只读模式
    ports: #需要暴露的端口库号列表
    - name: string        #端口的名称
      containerPort: int  #容器需要监听的端口号
      hostPort: int       #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string    #端口协议,支持TCP和UDP,默认TCP
    env:   #容器运行前需设置的环境变量列表
    - name: string  #环境变量名称
      value: string #环境变量的值
    resources: #资源限制和请求的设置
      limits:  #资源限制的设置
        cpu: string     #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests: #资源请求的设置
        cpu: string    #Cpu请求,容器启动的初始可用数量
        memory: string #内存请求,容器启动的初始可用数量
    lifecycle: #生命周期钩子
		postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
		preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
    livenessProbe:  #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
      exec:         #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
  restartPolicy: [Always | Never | OnFailure]  #Pod的重启策略
  nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
  imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork: false   #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:   #在该pod上定义共享存储卷列表
  - name: string    #共享存储卷名称 (volumes类型有很多种)
    emptyDir: {}       #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string   #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret:          #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
      scretname: string  
      items:     
      - key: string
        path: string
    configMap:         #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string

pod生命周期

  • pod的创建过程
  1. pod的前置环境测试:在initContainers中写入测试代码,当initContainers中的command执行成功时才会去创建pod
  2. pod的环境搭建好了之后,需要去进行一些测试,保证环境满足程序运行的条件。一般写在lifecycle.postStart里(有Exec命令,TCPSocket方式,HTTPGet命令)
  3. 探测:存活性探测(是否正常运行,否时会重启容器)和就绪性探测(是否可接收请求,否时会从负载均衡中摘取)。同样有有Exec命令,TCPSocket方式,HTTPGet命令。
  4. pod在停止前需要做的操作写在lifecycel.preStop中。

pod的调度

pod控制器

  • Deployment。 一般无状态服务使用Deployment。Deployment会生成rs并且进行管理。Deployment可以做到动态的扩缩容(scale命令),版本回退(rollout)等。 例如: 后端,前端这种无状态服务。

  • StatefulSet 一般有状态服务使用StatefulSet。Kubernetes 中的 StatefulSet 控制器并不维护历史版本,它主要负责管理有状态应用程序的部署和更新,而不是像 Deployment 控制器那样维护版本历史记录。 例如: redis, mysql这种db类型的有状态服务。

  • HPA

    使用HPA需要使用到metrics-server启动的server,会在k8s的系统ns下启动。

    # 通过yaml文件启动
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    
  • DaemonSet 一般用于日志收集

service(4层网络层路由负载)详解

5种模式:ClusterIP(内部),NodePort(外部),HeadLiness(不使用,转而使用自己的内部LB),LoadBalancer(不使用,转而使用自己的外部LB),ExternalName(把外部的服务引用到内部)

kube-proxy使用rr(轮询)规则。

kube-proxy可选模式

  • userspace模式: 请求转发到kube-proxy中,然后由kube-proxy挑选pod分发请求。稳定,但增加了数据拷贝而性能较低。
  • iptables模式: kube-proxy生成iptables规则,然后请求直接通过已经生成了的iptables规则转发到pod上。效率高,但BL策略不灵活,在后端pod不可用时无法重试。
  • ipvs模式(常用):必须安装ipvs内核模块才能用,否则降级为iptables。

kube-proxy生成的endpoints

由yaml配置文件根据selector生成的

Ingress(7层应用层负载均衡)详解

类比进行反向代理的nginx,可以进行http代理或者https代理。

https

http的基础上,指定secretName字段就可以了

数据存储

即有状态服务中的数据持久化。

  • 简单存储:EmptyDir,HostPath,NFS
  • 高级存储:PV,PVC
  • 配置存储:ConfigMap,Secret

简单存储

EmptyDir

临时的存储空间,也用于容器间的数据共享。在pod被销毁时,该目录会被永久删除。

HostPath

直接挂载到宿主机的一个实际目录里。在pod被摧毁时,该目录会维持原样。yaml文件中的字段:HostPath

NFS

其实就是HostPath上,把目录挂载到NFS(云存储)上而已。

高级存储(推荐使用)

屏蔽底层存储技术,引入pv和pvc概念直接使用。

pv(集群资源)&pvc(namespace资源)

一般pv是由管理员创建的,创建后等待用户创建pvc来绑定pv使用。

pv的生命周期状态:

  • Available(可用):可用,还没跟任何PVC绑定
  • Bound(绑定):已被PVC绑定
  • Released(已释放):PVC已被删除,但是资源未被集群重新声明
  • Failed(失败):PV的自动回收失败

pv于pvc的生命周期图

配置存储

是一种比较特殊的存储卷,主要作用是用来存储配置信息的。

明文密码(ConfigMap)

用上图的yaml文件举例:当申请ConfigMap资源后,会启动一个容器,该容器内部的文件和目录相当于:/configmap/config/info文件里的内容

证书密文密码(Secret)

同明文密码,不过容器内的文件内容是无法直接查看到的(只输出长度) *后端的配置参数使用 读取环境变量 的方式好处在于:k8s的配置存储支持动态更新。修改db密码后,相关的一连串使用的pod也能直接流水线更新config,无须人工逐步修改。

安全认证相关

认证管理

  • HTTP BASE认证
  • HTTP Token认证
  • HTTPS证书认证

授权管理

  • AlwaysDeny:拒绝所有请求,一般用于测试
  • AlwaysAllow:运行接收所有请求,相当于集群不需要所有授权流程
  • RBAC:基于角色的访问控制

准入控制

各个API,哪个可以设置什么权限可以参考官方文档