zoukankan      html  css  js  c++  java
  • kubernetes之dop Deployment

    一:介绍

     

    1.简介

    K8s有很多技术概念,同时对应很多API对象,最重要的也是最基础的是微服务

    Pod是在K8s部署中运行部署应用或服务的最小单元,它是可以支持多容器的

    Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务

    如果您运行一个操作系统发行版的软件仓库,一个Nginx容器用于发布软件,另一个容器专为从源仓库做同步,这两个容器的可能不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服

    这种情况下,不同的团队各自开发内置自己的容器组件,在部署的时候组合成一个微服务对外提供服务,这就是K8S中的POD

     

    2.Pod带来的好处

     

    ①Pod做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极大的方便

     

    ②Pod做为最小的应用实例可以独立运行,因此可以方便的进行部署,水平扩展和收缩,方便进行调度管理与资源的分配

     

    ③Pod中的容器共享相同的数据和网络地址空间,Pod之间也进行了统一的资源管理与分配。

     

    3.Pod是如何管理多个容器的

    Pod中可以同时运行多个进程(作为容器运行)协同工作

    同一个Pod中的容器会自动的分配到同一个节点上

    同一个Pod中的容器共享资源,网络环境和依赖,所以它们总是被同时调度

    在一个Pod中同时运行多个容差器是一种比较高级的用法

    只有当你的容器需要紧密配合协作的时候才考虑用这种模式

     

    4.Pod中的数据持久性

    Pod在设计⽀持就不是作为持久化实体的在

    调度失败,预警故障,常规资源或维护的状态下都会死掉会被驱逐

    通常,我们是需要重新部署Docker存储卷这样的资源来做Pod的数据持久化的

     

    5.资源清单格式

    # 在kubernetes中,一切皆资源
    # 定义创建的资源
    kind: Pod
    # 指定API版本号
    apiVersion: v1
    # 定义当前资源的元数据
    metadata:
      # 定义名称(由字母、数字、横杠组成,必须小写,必须以字母或数字开头)
      name: test-pod
      # 资源标签
      labels:
        app: pod-test
        class: darker
    # 配置资源详情
    spec:
      # 重启策略:Always(默认)、On-Failure、Never
      restartPolicy: Always
      # 配置Pod当中包含的容器
      containers:
        # 指定容器名称
        - name: nginx
          # 指定镜像
          image: nginx:1.19.2
          # 镜像拉取策略
          imagePullPolicy: 
          # 指定容器暴露的端口
          ports:
            - containerPort: 80
              name: http
            - containerPort: 443
              name: https
              # 指定端口的网络协议
              protocol: TCP
        - name: django
          image: alvinos/django:v1

    #注意:
     当一个Pod中有多个容器时,当Pod启动出现错误,可通过
      kubectl describe pods pod-demo      #查看其中每个容器的Status,来确认每个容器的运行状态。

    4.Pod的资源清单详解

    apiVersion: v1 # 必选,API 的版本号
    kind: Pod # 必选,类型 Pod
    metadata: # 必选,元数据
      name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
      namespace: web-testing # 可选,不指定默认为 default,Pod 所在的命名空间
      labels: # 可选,标签选择器,一般用于 Selector
        - app: nginx
      annotations: # 可选,注释列表
        - app: nginx
    spec: # 必选,用于定义容器的详细信息
      containers: # 必选,容器列表
      - name: nginx # 必选,符合 RFC 1035 规范的容器名称
        image: nginx:v1 # 必选,容器所用的镜像的地址
        imagePullPolicy: Always # 可选,镜像拉取策略
        workingDir: /usr/share/nginx/html # 可选,容器的工作目录
        volumeMounts: # 可选,存储卷配置
        - name: webroot # 存储卷名称
          mountPath: /usr/share/nginx/html # 挂载目录
          readOnly: true # 只读
      ports: # 可选,容器需要暴露的端口号列表
      - name: http # 端口名称
        containerPort: 80 # 端口号
        protocol: TCP # 端口协议,默认 TCP
      env: # 可选,环境变量配置
      - name: TZ # 变量名
        value: Asia/Shanghai
      - name: LANG
        value: en_US.utf8
      resources: # 可选,资源限制和资源请求限制
        limits: # 最大限制设置
          cpu: 1000m
          memory: 1024MiB
        requests: # 启动所需的资源
          cpu: 100m
          memory: 512MiB
      readinessProbe: # 可选,容器状态检查
        httpGet: # 检测方式
          path: / # 检查路径
          port: 80 # 监控端口
        timeoutSeconds: 2 # 超时时间
        initialDelaySeconds: 60 # 初始化时间
      livenessProbe: # 可选,监控状态检查
        exec: # 检测方式
          command:
          - cat
          - /health
      httpGet: # 检测方式
        path: /_health
        port: 8080
        httpHeaders:
        - name: end-user
          value: jason
      tcpSocket: # 检测方式
        port: 80
        initialDelaySeconds: 60 # 初始化时间
        timeoutSeconds: 2 # 超时时间
        periodSeconds: 5 # 检测间隔
        successThreshold: 2 # 检查成功为 2 次表示就绪
        failureThreshold: 1 # 检测失败 1 次表示未就绪
      securityContext: # 可选,限制容器不可信的行为
        provoleged: false
      restartPolicy: Always # 可选,默认为 Always
      nodeSelector: # 可选,指定 Node 节点
        region: subnet7
      imagePullSecrets: # 可选,拉取镜像使用的 secret
      - name: default-dockercfg-86258
      hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
      volumes: # 共享存储卷列表
      - name: webroot # 名称,与上述对应
        emptyDir: {} # 共享卷类型,空
        hostPath: # 共享卷类型,本机目录
        path: /etc/hosts
      secret: # 共享卷类型,secret 模式,一般用于密码
        secretName: default-token-tf2jp # 名称
        defaultMode: 420 # 权限
        configMap: # 一般用于配置文件
        name: nginx-conf
        defaultMode: 420

    5,生命周期

    状态描述
    挂起(待定) API服务器创建了pod资源对象已存入etcd中
    但它尚未被调度完成或者仍处于从仓库下载之上的过程中
    运行中(Running) Pod已经被调度至某议员,并且所有容器都已经被kubelet创建完成
    成功(成功) Pod中的所有容器都已经成功终止并且不会被重启
    失败(Failed) Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止
    即容器以非0状态退出或被系统禁止
    未知(Unknown) Api服务器无法正常获取到Pod对象的状态信息
    通常是由于无法与所在工作路由器的kubelet通信所致
     

    6.Pod的重启策略

    重启策略描述
    总是 任何情况下容器停止运转,kubernetes都会重启
    失败时 当容器非正常状态下退出,k8s重新启动
    决不 任何情况下都不重启
     

    7,荚果拉取策略

    重启策略描述
    如果不存在 如果当前系统概述已存在则不再拉取,如果不存在则去先前仓库拉取较长
    总是 不论当前系统是否存在,都去仓库拉取额外
    决不 不管任何当前系统是否存在,都不去过多仓库拉取额外
     

    二:基本使用

     

    1.部署

    kubectl apply -f [配置清单路径]
    kubectl apply -f test.yaml

    2.查看当前系统Pod的列表

    # 查看当前系统Pod的列表
    kubectl get [资源类型]
    kubectl get pods 
    
    # 展示标签
    kubectl get pods --show-labels
    
    # 查看详情信息
    kubectl get pods -o wide
    
    # 查看当前pod的配置资源
    kubectl explain Pod
    kubectl explain Pod.spec

    .查找

    # 查看pods的标签
    kubectl get pods --show-labels
    
    # 通过标签找到pod
    kubectl get pods -l class=darker

    4.删除

    # 删除资源
    kubectl delete -f [配置清单路径]
    kubectl delete -f test.yaml
    
    # 通过标签删除pod
    kubectl delete pods -l class=darker

    5.筛选

     筛选资源
    kubectl get -f [资源清单路径]

    6.通过配置清单,建造一个nginx服务

    # 创建1个nginx
    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-test
      labels:
        app: pod-test
        class: darker
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.2

    查看nginx

    kubectl get pods -l class=darker -o wide
    
    
    [root@kubernetes-master-01 ~]# kubectl get pods -l class=darker -o wide
    NAME         READY   STATUS    RESTARTS   AGE     IP           NODE                 NOMINATED NODE   READINESS GATES
    nginx-test   1/1     Running   0          2m45s   10.244.1.8   kubernetes-node-01   <none>           <none>

    查看

    kubectl get pods -n kube-system -o wide
    
    
    [root@kubernetes-master-01 ~]# kubectl get pods -n kube-system -o wide
    NAME                                           READY   STATUS    RESTARTS   AGE     IP            NODE                   NOMINATED NODE   READINESS GATES
    coredns-7dcc599b9f-25lvl                       1/1     Running   0          3h11m   10.244.0.2    kubernetes-master-01   <none>           <none>
    coredns-7dcc599b9f-r24kj                       1/1     Running   0          3h11m   10.244.0.3    kubernetes-master-01   <none>           <none>
    etcd-kubernetes-master-01                      1/1     Running   0          3h11m   172.16.0.50   kubernetes-master-01   <none>           <none>
    kube-apiserver-kubernetes-master-01            1/1     Running   0          3h11m   172.16.0.50   kubernetes-master-01   <none>           <none>
    kube-controller-manager-kubernetes-master-01   1/1     Running   0          3h11m   172.16.0.50   kubernetes-master-01   <none>           <none>
    kube-flannel-ds-58qfj                          1/1     Running   0          3h3m    172.16.0.54   kubernetes-node-02     <none>           <none>
    kube-flannel-ds-7ndcg                          1/1     Running   0          3h3m    172.16.0.53   kubernetes-node-01     <none>           <none>
    kube-flannel-ds-gqlcd                          1/1     Running   0          3h10m   172.16.0.50   kubernetes-master-01   <none>           <none>
    kube-proxy-924sw                               1/1     Running   0          3h3m    172.16.0.54   kubernetes-node-02     <none>           <none>
    kube-proxy-bp4z5                               1/1     Running   0          3h11m   172.16.0.50   kubernetes-master-01   <none>           <none>
    kube-proxy-td8h6                               1/1     Running   0          3h3m    172.16.0.53   kubernetes-node-01     <none>           <none>
    kube-scheduler-kubernetes-master-01            1/1     Running   0          3h11m   172.16.0.50   kubernetes-master-01   <none>           <none>

    yaml主要格式

    # yaml格式的pod定义文件完整内容:
    apiVersion: v1       #必选,版本号,例如v1
    kind: Pod       #必选,Pod
    metadata:       #必选,元数据
      name: string       #必选,Pod名称
      namespace: string    #必选,Pod所属的命名空间
      labels:      #自定义标签
        - name: string     #自定义标签名字
      annotations:       #自定义注释列表
        - name: string
    spec:         #必选,Pod中容器的详细定义
      containers:      #必选,Pod中容器列表
      - name: string     #必选,容器名称
        image: string    #必选,容器的镜像名称
        imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
        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     #内存清楚,容器启动的初始可用数量
        livenessProbe:     #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
          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的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
        nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
        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的存储卷,挂载集群与定义的secre对象到容器内部
            scretname: string  
            items:     
            - key: string
              path: string
          configMap:     #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: string
            items:
            - key: string
              path: string
  • 相关阅读:
    GBDT(MART)
    C#中数组中Skip、Take和Concat的用法
    VUE中对获取到的数组进行排序
    el-date-picker只能选择今天
    Vue获取时间
    执行Add-Migration Initial报错
    Vue中使用for循环绑定值
    Element UI——日期时间选择器el-date-picker开始时间与结束时间约束解决方案
    el-date-picker日期组件
    缓存的问题
  • 原文地址:https://www.cnblogs.com/ltyc/p/14110746.html
Copyright © 2011-2022 走看看