Zero to JupyterHub with Kubernetes中篇 - Kubernetes 常规使用记录

Kubernetes介绍、资源实战与Helm部署

前言:纯个人记录使用。

参考: https://www.yuque.com/fairy-era/yg511q/xyqxge

1、Kubernets介绍

1.1 简介

Kubernetes是Google 团队发起的一个开源项目,用于自动部署、扩展和管理容器化(docker)的应用程序。主要目的是管理跨多个主机的容器。

Kubernetes 中的绝大多数概念都抽象成 Kubernetes 管理的一种资源对象(一切皆资源)。

1.2 架构与组件

在这里插入图片描述

Master : 负责管理集群,协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。

  • kube-apiserver:集群控制的访问入口,提供HTTP REST服务。
  • kube-controller-manager:集群中所有资源对象的自动化控制中心,负责维护集群的状态,比如程序部署、故障检测、自动扩展、滚动更新等。
  • kube-scheduler:负责集群资源调度,按照策略将Pod调度到相应node上。
  • etcd:负责存储集群中各种资源对象信息(键值对形式)。

Node:k8s集群工作节点。每个工作节点都有一个kubelet,它管理本节点并且负责与Master主节点通信。每个节点上都需安装Docker相关服务。

  • kubelet :负责维护容器的生命周期,通过控制docker来创建、更新、销毁容器(负责Pod的创建、启动、监控、重启、销毁等工作),同时与Master 节点通讯,实现集群管理的基本功能。

  • kube-proxy:实现集群内部服务发现和负载均衡(代理应用的访问入口,如jupyterhub应用)。

  • docker:负责pod容器应用。

Kubernetes 核心组件

  • etcd:保存了整个集群的状态,就是一个数据库
  • apiserver :提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
  • controller manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
  • scheduler :负责资源的调度、按照预定的调度策略将Pod调度到相应的机器上
  • kubelet :负责维护容器的生命周期、同时负责Volume(CSI/Container Storage Interface)和网络(CNI/Container Network Interface)的管理
  • kube-proxy :负责为Service提供cluster 内部的服务发现和负载均衡
  • docker:负责镜像管理以及Pod和容器的真正运行(CRI/Container R untime Interface)

其他插件:

  • Dashboard :提供集群GUI

  • Metrics-scraper: 为Dashboard提供资源监控

  • Ingress Controller :为服务提供外网接口

  • Coredns: 负责为整个集群提供DNS服务


2、重要资源实战

  • kubectl:k8s集群命令行工具

    kubectl [command] [type] [name] [flags]

    ● command:指定要对资源执行的操作,比如create、get、delete。
    ● type:指定资源的类型,比如deployment、pod、service。
    ● name:指定资源的名称,名称大小写敏感。
    ● flags:指定额外的可选参数。

    • command 资源操作命令

      # 基本命令
      create	创建一个资源
      edit	编辑一个资源
      get	    获取一个资源
      patch	更新一个资源
      delete	删除一个资源
      explain	解释展示资源文档
      
      # 运行调试命令
      run	        在集群中运行一个指定的镜像
      expose	    暴露资源为Service,常用于暴露应用端口
      describe	显示资源内部信息
      logs	    输出容器在Pod中的日志
      attach	    连接运行中的容器,通常用于与正在运行的进程进行交互,查看进程的输出或向进程发送输入。
      exec	    执行容器中的一个命令(bin/bash)  参数 -i(interactive)交互式 ,-t 启用伪终端
      cp	        在Pod内外复制文件
      rollout	    管理版本的发布
      scale	    扩(缩)容Pod的数量
      autoscale	自动调整Pod的数量
      
      # 高级命令
      apply	 通过yaml文件对资源进行配置
      label	 更新资源上的标签
      
      # 其他
      cluster-info	集群信息	显示集群信息
      version         显示当前Client和Server的版本
      api-resources   查看集群资源对象
      
    • type 资源操作类型

      # 查看集群所有资源对象
      [root@k8s-master ~/test]$ kubectl api-resources
      NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
      namespaces                        ns           v1                                     false        Namespace
      pods                              po           v1                                     true         Pod
      nodes                             no           v1                                     false        Node
      # Pod资源控制器 
      replicasets                       rs           apps/v1                                true         ReplicaSet
      deployments                       deploy       apps/v1                                true         Deployment
      # 负载均衡和服务发现
      services                          svc          v1                                     true         Service
      ingresses                         ing          extensions/v1beta1                     true         Ingress
      # 资源存储
      persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
      persistentvolumes                 pv           v1                                     false        PersistentVolume
       ...
      
  • 常规使用方式

    # 创建或更新资源
    kubectl apply -f xxx.yaml
    # 删除资源
    kubectl delete -f xxx.yaml
    # 查看资源
    kubectl get(describe) 资源名称
    

2.1 Namespace

  • Namespace:命名空间,用于进行资源隔离。

    • kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离

    • 默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。

    • 可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

    # 查看所有命名空间
    [root@k8s-master /data/s0/kubernetes/test]$ kubectl get namespace
    NAME                   STATUS   AGE
    default                Active   7d5h   # 所有未指定的Namespace的对象都会被分配在default命名空间。
    kube-node-lease        Active   7d5h   # 集群节点之间的心跳维护,v1.13开始引入。
    kube-public            Active   7d5h   # 此命名空间的资源可以被所有人访问(包括未认证用户)。
    kube-system            Active   7d5h   # 所有由kubernetes系统创建的资源都处于这个命名空间(calico网络pod)
    kubernetes-dashboard   Active   2d1h   # 人为自定义集群资源可视化命名空间
    # 查看命名空间中资源
    [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pods -n kubernetes-dashboard -o wide(/json/yaml:结果输出形式) 
    NAME                                         READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
    dashboard-metrics-scraper-7b59f7d4df-l6ngh   1/1     Running   0          28d   10.244.235.195   k8s-master   <none>           <none>
    kubernetes-dashboard-548f88599b-k7824        1/1     Running   1          28d   10.244.169.132   k8s-node2    <none>           <none>
    
    # 创建命名空间
    [root@k8s-master /data/s0/kubernetes/test]$ kubectl create ns test 
    namespace/test created
    
    

2.2 Pods

  • pods: Pod 是Kubernetes调度的基本单位,是一组紧密相关的容器集合(至少一个),它们共享PID、IPC、Network 和 namespace。Pod 设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通讯和文件共享这种简单高效的方式组合完成整个服务。每个Pod可以由一个或多个业务容器和一个根容器(Pause)组成。一个Pod表示某个应用的一个实例。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • Pod 创建与删除

    • 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|IfNotPresent|Never]  #获取镜像的策略,always:总是从镜像仓库拉取;IfNotPresent:优先使用本地镜像,无再从镜像仓库拉取;Never 只使用本地镜像 
            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:   #在该
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值