kubernetes

kubernetes

一、Kubernetes 简介

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种可靠、可扩展和高效的方式来管理容器集群,使得应用程序能够在不同的环境中轻松运行。

二、安装 Kubernetes

  1. 安装 Minikube(用于本地开发和测试):

    • Minikube 是一个在本地运行单节点 Kubernetes 集群的工具。
    • 下载并安装 Minikube 对应操作系统的版本。
    • 启动 Minikube:minikube start
  2. 安装 kubectl(Kubernetes 命令行工具):

    • 下载并安装 kubectl 工具。
    • 设置 kubectl 与 Minikube 或实际的 Kubernetes 集群进行通信。

三、Kubernetes 核心概念

  1. 节点(Node):

    • 是 Kubernetes 中可以运行容器化应用的工作机器,可以是物理机或虚拟机。
    • 节点分为主节点(控制平面)和工作节点。
  2. 主节点(Master Node):

    • 负责管理整个集群,包括调度容器、存储配置信息等。
    • 主要组件包括 API 服务器、调度器、控制器管理器等。
  3. 工作节点(Worker Node):

    • 运行实际的容器化应用。
    • 包含容器运行时(如 Docker)、kubelet(与主节点通信并管理容器)、kube-proxy(负责网络代理和负载均衡)。
  4. 容器组(Pod):

    • Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间和存储卷。
    • Pod 通常用于部署一个单一的应用程序或一组紧密相关的应用程序。
  5. 服务(Service):

    • 定义了一组 Pod 的访问策略,提供了稳定的网络地址和负载均衡功能。
    • 服务可以通过标签选择器(Label Selector)来选择要关联的 Pod。
  6. 部署(Deployment):

    • 用于管理 Pod 的创建、更新和扩缩容。
    • 可以定义副本数量、更新策略等。
  7. 标签(Label)和选择器(Selector):

    • 用于给资源(如 Pod、Service)打标签,以便进行分类和选择。
    • 选择器可以根据标签来选择特定的资源进行操作。
  8. 命名空间(Namespace):

    • 用于隔离不同的用户、项目或环境。
    • 可以在不同的命名空间中创建独立的资源,避免资源冲突。

四、基本操作

  1. 创建 Pod:
    • 可以使用 YAML 配置文件来定义 Pod。
    • 例如,创建一个包含一个 Nginx 容器的 Pod:
      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx-pod
      spec:
        containers:
        - name: nginx
          image: nginx
      
    • 使用kubectl apply -f pod.yaml命令创建 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|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
  1. 创建 Service:

    • 定义 Service 来暴露 Pod 的网络访问。
    • 例如,创建一个 ClusterIP 类型的 Service:
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service
      spec:
        selector:
          app: nginx
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      
    • 使用kubectl apply -f service.yaml命令创建 Service。
  2. 创建 Deployment:

    • 使用 Deployment 来管理 Pod 的副本数量和更新。
    • 例如,创建一个有三个副本的 Nginx Deployment:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
      
    • 使用kubectl apply -f deployment.yaml命令创建 Deployment。
  3. 查看资源:

    • 使用kubectl get pods查看 Pod 列表。
    • 使用kubectl get services查看 Service 列表。
    • 使用kubectl get deployments查看 Deployment 列表。
  4. 扩缩容:

    • 使用kubectl scale deployment/nginx-deployment --replicas=5将 Nginx Deployment 的副本数量扩展到 5。
  5. 更新 Deployment:

    • 修改 Deployment 的 YAML 文件,然后使用kubectl apply -f deployment.yaml进行更新。

五、存储管理

  1. 存储卷(Volume):

    • Kubernetes 支持多种类型的存储卷,如 EmptyDir(临时存储)、HostPath(挂载宿主机目录)、PersistentVolume(持久化存储)等。
    • 在 Pod 的 YAML 配置中定义存储卷,并将其挂载到容器中。
  2. PersistentVolume 和 PersistentVolumeClaim:

    • PersistentVolume 是集群中的一块存储资源,可以由管理员预先创建或动态供应。
    • PersistentVolumeClaim 是用户对存储资源的请求,它会绑定到一个合适的 PersistentVolume。

六、网络管理

  1. Kubernetes 网络模型:

    • 每个 Pod 都有自己独立的 IP 地址,并且可以在集群内直接通信。
    • 不同节点上的 Pod 之间的通信通过网络插件(如 Flannel、Calico 等)实现。
  2. Ingress:

    • Ingress 用于将外部流量路由到集群内的服务。
    • 可以通过定义 Ingress 规则来实现 URL 路由、负载均衡等功能。

七、监控和日志管理

  1. 监控:

    • 可以使用 Prometheus 和 Grafana 等工具对 Kubernetes 集群进行监控,收集指标如 CPU 使用率、内存使用率、容器状态等。
  2. 日志管理:

    • 可以使用 Elasticsearch、Fluentd 和 Kibana(EFK 栈)等工具来收集、存储和分析容器的日志。

八、应用部署最佳实践

  1. 蓝绿部署:

    • 同时维护两个版本的应用,通过切换服务指向不同版本的 Deployment 来实现零停机部署。
  2. 滚动更新:

    • 逐步替换旧版本的 Pod 为新版本的 Pod,确保应用的可用性。
  3. 健康检查:

    • 在容器中定义存活探针(liveness probe)和就绪探针(readiness probe),以确保容器的健康状态。
posted @ 2024-11-06 10:20  渔樵江渚  阅读(22)  评论(0)    收藏  举报