zoukankan      html  css  js  c++  java
  • k8s in action

    容器与虚拟机的区别?P8

    虚拟机将宿主机的资源硬隔离,每个虚拟机都有一个独立的操作系统,这些操作系统的生成需要消耗宿主机额外的资源,一个服务一个虚拟机的方式浪费太多资源,所以只能多个服务公用一个虚拟机,就行权益平台1.0一样,当一个服务重启就会影响其他服务

    多个容器可以共享宿主机的操作系统,容器消耗的资源只是容器内程序运行依赖的资源,没有操作系统资源的浪费,可以一个服务一个容器

    使用K8S部署流程?P19

    构建镜像-》提交镜像-》提交应用描述到K8S API-》API分配节点-》节点kubelets负责拉取镜像运行docker容器

    k8s好处?P20

    在集群中自动分配资源节点-也可指定节点启动相应服务、节点及容器健康监控-自动转移pod、自动扩缩容、发版时检测版本是否异常-自动停止滚动更新

    --------------------------pod---------------------------------

    pod中的服务容器是紧密相关的组件,pod是扩缩容的基本单位

    pod描述文件yaml P59,创建pod:kubectl create -f createPod.yml

    apiVersion: v1
    kind: Pod
    metadata:
     name: kubia-manual
    spec:
     containers:
     - image: yfzhou528/kubia
       name: kubia
       ports:
       - containerPort: 8080
         protocol: TCP
    createPod.yml

    --------------------------标签---------------------------------

    功能:筛选满足标签条件的资源,如pod、节点等

    为节点增加标签,在pod描述文件中使用nodeSelector指定pod运行在添加特定标签的节点上

    为高GPU的node节点添加标签:
    kubectl lable node $nodeName gpu=true
    
    apiVersion: v1
    kind: Pod
    metadata:
     name: kubia-manual
    spec:
     nodeSelector: // 标签选择器
       gpu: "true"
     containers:
     - image: yfzhou528/kubia
       name: kubia
       ports:
       - containerPort: 8080
         protocol: TCP
    示例

    -----------------------命名空间------------------------------------

     资源隔离,创建pod时可指定命名空间

    ----------------------存活探针-------------------------------------

    k8s通过存活探针检测容器是否正常运行,如果不正常,通过RC或Deployment重新创建容器

    HTTP GET 探针,通过向容器ip发送get请求检测响应是否正常,可设置首次探针探测时间、响应超时时间、探测多久探一次、失败阈值即失败几次后要重启容器

    apiVersion: v1
    kind: Pod
    metadata:
     name: kubia-manual
    spec:
     nodeSelector: // 标签选择器
       gpu: "true"
     containers:
     - image: yfzhou528/kubia
       name: kubia
       livenessProbe: //探针
        httpGet:      //httpGet存活探针
         path: /      //get请求路径
         port: 8080   //get请求端口
        initialDelaySeconds: 15 //第一次探针检测在容器启动15s后,防止误探
       ports:
       - containerPort: 8080
         protocol: TCP
    yaml中指定探针属性

     探测容器、重启容器这项工作由k8s节点上的kubelet负责,如果节点挂了,kubelet无法完成这项工作,所以引入副本控制器ReplicationController

    ------------------ReplicationController-----------------------------------------

    作用:通过标签选择器确保标签匹配的pod始终正常运行,通过检查pod副本数来新建/删除pod。

    注意RC作用的最小单元是pod而不是容器,而kubelet的工作是检测pod内的容器状态和重启容器

    三要素:标签选择器、副本数、pod模板

    如果RC标签选择器selector中有多个标签,组成集合A,则pod的标签labels中的标签项集合B必须是A的父级才会被RC管理

    apiVersion: v1
    kind: ReplicationController
    metadata:
     name: kubia-rc
    spec:
     replicas: 3      // 副本数
     selector:        // 标签选择器
      app: kubia      // rc只作用于携带此标签的pod
     template:        // pod模板
      metadata:
       label:
        app: kubia    // pod携带的标签,必须与上面相同
      spec:
       containers:
       - image: yfzhou528/kubia
         name: kubia
         livenessProbe: //探针
          httpGet:      //httpGet存活探针
             path: /      //get请求路径
             port: 8080   //get请求端口
            initialDelaySeconds: 15 //第一次探针检测在容器启动15s后,防止误探
         ports:
         - containerPort: 8080
           protocol: TCP
    rc.yaml

    如果更改pod标签,rc会发现副本数不足而新建pod。如果更改rc标签,之前的pod全部失效,rc会再创建replicas个pod

    更改rc文件(kubectl edit rc $rcname)的pod模板只会影响之后创建的pod,对现有pod无影响

    扩缩容:更改rc文件的replicas实现,或者通过命令kubectl scale rc $rcname --replicas=5

    删除rc会将其管理的pod也一并删除,可通过--cascade=false保留pod

    --------------------ReplicaSet---------------------------------------

    与ReplicationController的区别?P104 标签匹配功能更强:匹配多标签、匹配缺少某个标签、匹配标签key

    apiVersion: apps/v1beta2
    kind: ReplicaSet
    metadata:
     name: kubia-rs
    spec:
     replicas: 3      // 副本数
     selector:        // 标签选择器
      matchLables:    // *****matchLables选择器****
       app: kubia     // rc只作用于携带此标签的pod
     template:        // pod模板
      metadata:
       labels:
        app: kubia    // pod携带的标签,必须与上面相同
      spec:
       containers:
       - image: yfzhou528/kubia
         name: kubia
         livenessProbe: //探针
          httpGet:      //httpGet存活探针
             path: /      //get请求路径
             port: 8080   //get请求端口
            initialDelaySeconds: 15 //第一次探针检测在容器启动15s后,防止误探
         ports:
         - containerPort: 8080
           protocol: TCP
    matchLables选择器yaml
    apiVersion: apps/v1beta2
    kind: ReplicaSet
    metadata:
     name: kubia-rs
    spec:
     replicas: 3        // 副本数
     selector:          // 标签选择器
      matchExpressions: // *****matchExpressions选择器****
       - key: app       // pod标签的key必须是app
         operator: In   // pod标签的值必须在下面values集合中
         values:        // pod标签的值的集合
          - kubia
     template:          // pod模板
      metadata:
       labels:
        app: kubia    // pod携带的标签,必须与上面相同
      spec:
       containers:
       - image: yfzhou528/kubia
         name: kubia
         livenessProbe: //探针
          httpGet:      //httpGet存活探针
             path: /      //get请求路径
             port: 8080   //get请求端口
            initialDelaySeconds: 15 //第一次探针检测在容器启动15s后,防止误探
         ports:
         - containerPort: 8080
           protocol: TCP
    matchExpressions选择器yaml P107

    ---------------------DaemonSet--------------------------------------

    通过标签选择器匹配节点,并在节点上创建并管理一个pod,当节点挂了之后不会在其他节点创建pod,当新加入一个节点时会在它上面新建一个pod。场景:集群日志收集系统

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
     name: kubia-ds
    spec:
     selector:        // 标签选择器
      matchLabels:
       app: ssd-ds
     template:        // pod模板
      metadata:
       labels:
        app: ssd-ds   // 在创建pod时自动为pod打上此标签
      spec:
       nodeSelector:  // 节点选择器
        disk: ssd     // 只会在有此标签的节点上才会创建pod
       containers:
       - image: yfzhou528/kubia
         name: kubia
    ds.yaml

    -------------------------Job----------------------------------

    适用临时任务:运行完任务就终止

    若pod内部进程成功结束,不重启容器;若pod异常退出会新建一个pod,直到完成任务

    缺陷:资源创建后会立即运行任务,不能控制触发时间

    apiVersion: batch/v1
    kind: Job
    metadata:
     name: kubia-job
    spec:
     completions: 5       // *******顺序创建运行5个pod,用于任务需顺序执行5次的场景******
     parallelism: 2       // *******并行度,最多同时运行2个pod******
     backoffLlimit: 6     // *******job被标记为失败之前可重试的次数,默认6****
     selector:            // 标签选择器,管理此标签的pod
      matchLabels:
       app: batch-job
     template:            // pod模板
      metadata:
       labels:
        app: batch-job    // 在创建pod时自动为pod打上此标签
      spec:
       restartPolicy: OnFailure  // *******pod重启策略******
       activiDeadlineSeconds: 100 // ****pod运行超过100s则任务失败****
       containers:
       - image: yfzhou528/kubia
         name: kubia
    job.yaml

    CronJob

    优势:在指定的时间运行job,注意同时启动多个job时要保证幂等

    apiVersion: batch/v1
    kind: CronJob
    metadata:
     name: kubia-cron-job
    spec:
     schedule: "0,30 * * * *"       // ********任务在每小时的0分、30分触发一次********
     jobTemplate:                   // job模板
      spec:
       template:                    // pod模板
        metadata:
         labels:
          app: batch-job            // 在创建pod时自动为pod打上此标签
        spec:
         restartPolicy: OnFailure   // pod重启策略
         activiDeadlineSeconds: 100 // pod运行超过100s则任务失败
         containers:
         - image: yfzhou528/kubia
           name: kubia
    cronjob.yaml

    ---------------------Service--EndPoint------------------------------------

    功能:为辖内的pod提供外部访问入口,转发、负载均衡。

    服务在整个生命周期内ip不变,辖内的pod不管怎么变动都无所谓,其他pod都可以通过访问service来间接访问pod

    先创建service,再创建客户端pod,则客户端pod会自动在环境变量中添加service的ip及端口,通过这个就可以访问service

    apiVersion: v1
    kind: Service
    metadata:
     name: kubia-service
    spec:
     selector:            // 为此标签的pod提供对外服务及请求重定向
      app: kubia
     ports:               // service对外暴露的端口集合
     - name: http
       port: 80           // service对外暴露的端口
       targetPort: 8080   // service内的pod对应的接收转发端口
     - name: https
       port: 443
       targetPort: 8443 
    不指定类型的service.yaml

    service并不是直接和辖内的pod连接的,而是通过EndPoint资源,当service中指定selector选择器时会自动创建对应的EndPoint资源,如果不指定则需手动创建

    service中的selector选择器将符合的pod的ip及port列表存储在EndPoint资源中,当service收到请求后会从EndPoint资源存储的列表中选择一个

    apiVersion: v1
    kind: Service
    metadata:
     name: kubia-service-no-selector
    spec:
     #selector:            // 不提供选择器
      #app: kubia
     ports:               // service对外暴露的端口集合
     - name: http
       port: 80           // service对外暴露的端口
       targetPort: 8080   // service内的pod对应的接收转发端口
     - name: https
       port: 443
       targetPort: 8443 
    ------------
    apiVersion: v1
    kind: EndPoints
    metadata:
     name: kubia-service-no-selector// 必须与Service名字相同
    subsets:                        // 手动提供pod的ip及端口
     - addresses:                   
       - ip: 11.11.11.11
       - ip: 22.22.22.22
       ports:
       - port: 80
    不指定selector的Service及手动指定Endpoint的yaml

    向集群外部的客户端暴露服务的几种方式

    1.通过节点负载均衡器暴露service:

    apiVersion: v1
    kind: Service
    metadata:
     name: kubia-loadbalancer
    spec:
     type: LoadBalancer   // *******该服务从k8s基础架构获取针对节点的负载平衡器*******
     selector:            // 为此标签的pod提供对外服务及请求重定向
      app: kubia
     ports:               // service对外暴露的端口集合
     - name: http
       port: 80           // service对外暴露的端口
       targetPort: 8080   // service内的pod对应的接收转发端口
     - name: https
       port: 443
       targetPort: 8443 
    LoadBalancer-service.yaml

     -------------------------Ingress----------------------------------

    2.通过Ingress暴露服务

    通过LoadBalancer暴露服务的缺点:服务过多时,每个服务都需要独有的负载均衡器及公网ip

    Ingress类似nginx,只需一个公网ip提供入口,然后根据请求域名找到对应的转发规则,将请求转发给对应的服务 P144

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
     name: kubia-ingress
    spec:
     rules:
     - host: kubia.example.com         // 对外域名,访问时映射到此服务
       http:
        paths:
        - path: /aa                    // 将kubia.example.com/aa请求发送到kubia-nodeport服务的80端口(nginx转发功能)
          backend:
           serviceName: kubia-nodeport // kubia-nodeport是一个NodePort类型的服务
           servicePort:80
     - host: kubia.example.com2       
       http:
        paths:
        - path: /bb                    // 将kubia.example.com2/bb请求发送到kubia-nodeport2服务的80端口(nginx转发功能)
          backend:
           serviceName: kubia-nodeport2
           servicePort:80
    ingress.yaml

    ----------------------就绪探针-------------------------------------

    service和其后端pod组成服务集群,当pod启动时,就绪探针会检查是否就绪,如果没就绪就不将pod添加到后端集群中,即不添加到Endpoint维护的ip:port列表,当探查到它就绪时再添加进去

    就绪探针只会根据探查结果操作endpoint列表,不设计pod的删除、新建、重启。而存活探针会在容器不存活时重启容器,它针对的是容器不是pod。

    apiVersion: v1
    kind: ReplicationController
    metadata:
     name: kubia-rc
    spec:
     replicas: 3      // 副本数
     selector:        // 标签选择器
      app: kubia      // rc只作用于携带此标签的pod
     template:        // pod模板
      metadata:
       label:
        app: kubia    // pod携带的标签,必须与上面相同
      spec:
       containers:
       - image: yfzhou528/kubia
         name: kubia
         readinessProbe: //*******就绪探针,默认10s检查一次*******
          exec:
           command:
           - ls
           - /var/ready
         livenessProbe: //存活探针
          httpGet:      //httpGet存活探针
             path: /      //get请求路径
             port: 8080   //get请求端口
            initialDelaySeconds: 15 //第一次探针检测在容器启动15s后,防止误探
         ports:
         - containerPort: 8080
           protocol: TCP
    rc-readinessProbe.yam

    ----------------------持久卷PV、持久卷声明PVC-------------------------------------

    PV是集群层面的资源,不属于任何一个命名空间;PVC是命名空间层面的资源

    集群管理员创建PV资源,开发通过创建PVC资源,然后在pod的容器中挂载卷,并在pod资源的volumes属性的卷中指定PVC,来获取匹配的PV

    一个PVC创建之后会自动与现有的PV匹配,匹配成功后PVC就和PV绑定了,这是在PVC创建时就完成的。一个PV只能同时被一个PVC绑定

    #####创建持久卷PV#####
    apiVersion: v1
    kind: PersistentVolume
    metadata:
     name: kubia-pv
    spec:
     capacity:            |->PV容量
      storage: 1Gi        |
      
     accessModes:         |->PV支持的访问模式
     - ReadWriteOnce      |ReadWriteOnce:允许单客户端读写
     - ReadOnlyMany       |ReadOnlyMany:允许多客户端读
                          |ReadWriteMany:允许多客户端读写
                                           |->PV被PVC释放后,处理PV的策略
     persistentVolumeReclaimPolicy: Retain |Retain:保留不作处理
                                           |Recycle:删除卷的存储内容,可被其他PVC再次绑定循环使用
                                           |Delete:删除卷的存储内容,不可被其他PVC再次绑定
     nfs:
      path: "/data/k8s/volumes"   |
      server: 192.168.1.101       |->持久卷存储在哪,这里指定nfs服务器地址及存储目录
      readOnly: false             |
                                           
    
    #####创建持久卷声明PVC#####
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: kubia-pvc    <---------------------------------------------------
    spec:                                                                  |
     resources:            |                                               |
      requests:            |->声明需要的系统资源                           |
       storage: 1Gi        |                                               |
                                                                           |
     accessModes:          |->声明持久卷的访问模式                         |
     - ReadWriteOnce       |                                               |
                                                                           |
     storageClassName: ""  |确保PVC绑定到预先配置的PV,而不是自动生成的PV上|
                                                                           |
                                                                           |
    #####创建Pod指定PVC#####                                               |
    apiVersion: v1                                                         |
    kind: Pod                                                              |
    metadata:                                                              |
     name: kubia-pod                                                       |
    spec:                                                                  |
     containers:                                                           |
     - image: yfzhou528/kubia                                              |
       name: kubia                                                         |
       ports:                                                              |
       - containerPort: 27017                                              |
         protocal: TCP                                                     |
       volumeMounts:                                                       |
       - name: kubia-data      |指定容器使用的卷名    <-------------       |
         mountPath: /data/db                                       |       |
     volumes:                  |自定义容器使用的卷名及卷对应的PVC  |       |
     - name: kubia-data   ---------------------------------------- |
       persistentVolumeClaim:  |                                           |
        claimName: kubia-pvc   |--------------------------------------------
         
    PV-PVC-POD.yaml

    ----------------------ConfigMap-------------------------------------

    创建configmap一般使用命令行模式而不是yaml模式

    apiVersion: v1           
    kind: Pod                
    metadata:                
     name: kubia-configmap         
    spec:                    
     containers:             
     - image: yfzhou528/kubia
       name: kubia           
       env:                    #指定环境变量
       - name: INTERVAL        #环境变量名<----------------------------
         valueFrom:            |                                      |
          configMapKeyRef:     |->环境变量源自ConfigMap               |
           name: my-configmap  #源自哪个ConfigMap,指定它的名字       |
           key: sleep-interval #将ConfigMap中哪个key的值赋给INTERVAL---
    ConfigMap中的值作为Pod的环境变量.yaml

    若Pod中某个container引用的ConfigMap不存在,则这个容器启动失败,pod中的其他容器无影响,当这个不存在的ConfigMap创建后,失败容器会自动重启

    configMap卷:pod中的某个容器挂在一个卷,在这个卷中将configMap中的条目放进去,这样容器需要的卷内容就与卷声明解耦,依赖的条目内容改变后无需更改卷声明

    配置热更新:kubectl edit修改ConfigMap的内容后,引用ConfigMap卷的容器和pod无需重启即可实现配置热更新,但是会有一定的延迟

    apiVersion: v1           
    kind: Pod                
    metadata:                
     name: kubia-configmap         
    spec:                    
     containers:             
     - image: yfzhou528/kubia
       name: kubia    
       
       volumeMounts:
       - name: config
         mountPath: /etc/zhou #将ConfigMap的条目挂载到容器的哪个目录
     volumes:
     - name: config
       configMap:              #configMap类型的卷
        name: myConfigMap      #哪个ConfigMap
    pod挂载configmap卷.yaml

    Secret资源:类似ConfigMap,支持HTTPS

    ----------------------DownwardAPI卷-------------------------------------

    apiVersion: v1           
    kind: Pod                
    metadata:                
     name: kubia-downward     
     labels:
      foo: bar
     annotations:
      key1: value1  
    spec:                    
     containers:             
     - image: yfzhou528/kubia
       name: kubia    
       volumeMounts:
       - name: downVolume
         mountPath: /etc/zhou
     volumes:
     - name: downVolume
       downwardAPI:
        items:
        - path: "podName"
          fieldRef:
           fieldPath: metadata.name # kubia-downward
        - path: "labels"
          fieldRef:
           fieldPath: metadata.labels # foo: bar  
        - path: "annotations"
          fieldRef:
           fieldPath: metadata.annotations  # key1: value1  
    容器挂载DownwardAPI卷,将Pod元数据传递给容器.yaml

    自动更新:可以在pod运行时修改标签和注解,容器挂载的DownwardAPI卷中相关的pod元数据项将自动更新

    DownwardAPI卷局限性:只能将本pod及容器的元数据传递给进程,对本pod之外的数据无能为力

    容器可通过与K8S API服务器交互获取其他pod的元数据,但是需要认证和授权才行

    在pod内专门创建一个代理容器负责与K8S API服务器交互,pod内的其他容器只需与代理容器交互即可,免去每个容器都有认证授权

    ----------------------***Deployment***----------------------------------

    用于版本发布-滚动升级

    通过Deployment资源触发滚动升级时,会自动创建一个新的ReplicaSet,新旧两个RS通过label来区分管理新旧版本的pod: P263

      1.新RS创建后,在RS的selector中除了pod的标签,新增了一个deploment标签,它的值是当前版本pod模板的hash值,用于区分RS版本。由于旧pod中没有新增的deployment标签,所以旧pod不归新RS管理

      2.旧pod也都会增加一个另外的deploment标签,这时旧RS仍然能管理旧pod

      3.旧RS再增加这个相同的deploment标签,这时旧RS仍然能管理旧pod

    Deployment滚动升级完成后,不会删除旧RS,此旧RS用于版本回滚

    maxSurge+maxUnavailable控制滚动升级速率、minReadySeconds+就绪探针 阻止异常pod滚动升级:

    apiVersion: apps/v1beta1           
    kind: Deployment 
    metadata:                
     name: kubia-deployment
    spec:
     replicas: 3                    #升级后期望运行多少个pod
     minReadySeconds: 10            #新创建的pod成功运行多久后才视为可用
     strategy:                      #升级策略:
      type: RollingUpdate           #RollingUpdate(默认):渐进删除旧pod,同时创建新pod
                                    #Recreate:在删除全部旧pod后,再创建新pod
      rollingUpdate:                #控制滚动升级速率:
       maxSurge: 1                  #在滚动升级期间,允许超出期望副本replicas的pod数。
                                    #即允许最多同时存在pod数=replicas+maxSurge
       maxUnavailable: 0            #在滚动升级期间,相对于期望副本数,允许存在不可用状态pod的数量。
                                    #即同时正常运行的最少pod数=replicas-maxUnavailable
                                  
     template:                      #定义pod模板
      metadata:
       name: kubia
       labels:
        app: kubia
      spec:
       containers:             
       - image: yfzhou528/kubia:v2  #版本tag v2非常重要,代表本次要更新的版本号
         name: kubia    
         readinessProbe:            #就绪探针,配合minReadySeconds可阻止异常版本继续滚动升级
          periodSeconds: 1          #探测频率
          httpGet:
           path: /
           port: 8080
    maxSurge+maxUnavailable控制滚动升级速率、minReadySeconds+就绪探针 阻止异常pod滚动升级

    如何阻止异常pod滚动升级(maxUnavailable + minReadySeconds + 就绪探针)?

    就绪探针在未超过minReadySeconds的时间内,探测到pod未就绪,而如果maxUnavailable设置为0,即表示不允许有不存活的pod存在,这就不能满足继续滚动升级的条件,导致滚动停止,若10分钟内没完成滚动升级则视为升级失败

    ---StatefulSet--------------------------------------------------------

    可以用于解决RS的什么问题:RS的声明文件中,如果一个pod的某个容器挂载了一个卷,这个卷会制定一个PVC,这个PVC会绑定一个PV。如果RS的期望副本数>1,则多个pod中的这个容器都是用同一个PV,数据都往一处写,无法做到分开写。

    StatefulSet不像RS那样指定PVC,而是通过指定一个PVC模板,同时先创建好多个PV,等SS创建pod时会通过PVC模板创建属于此pod的PVC实例,此PVC再绑定到创建好的PV中的一个,这样就做到了不同pod中的容器挂载不同的PV就行数据存储;

    同时如果SS创建的pod挂了,SS进行恢复创建pod时,会和挂掉的pod保持相同的pod名、ip地址、pv,新pod仍可以使用挂掉的pod之前存储在pv中的数据

    SS修改资源文件的副本数进行缩容时,会先删最高索引值的pod,删pod不会删它的PVC实例(如果需要释放PVC绑定的PV,需要手动删除PVC,这时数据就没了),这时如果再进行扩容,会使用没删的PVC实例及它绑定的PV中的数据,这中机制是为了保证误删pod时可以恢复数据。

    SS资源创建步骤:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
     name: kubia-pv-a
    spec:
     capacity:            
      storage: 1Gi        
     accessModes:         
     - ReadWriteOnce                       
     persistentVolumeReclaimPolicy: Retain 
     nfs:
      path: "/data/k8s/volumes/kubia-pv-a"
      server: 192.168.1.101    
      readOnly: false
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
     name: kubia-pv-b
    spec:
     capacity:            
      storage: 1Gi        
     accessModes:         
     - ReadWriteOnce                       
     persistentVolumeReclaimPolicy: Retain 
     nfs:
      path: "/data/k8s/volumes/kubia-pv-b"
      server: 192.168.1.101    
      readOnly: false
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
     name: kubia-pv-c
    spec:
     capacity:            
      storage: 1Gi        
     accessModes:         
     - ReadWriteOnce                                                     
     persistentVolumeReclaimPolicy: Retain                                                                            
     nfs:
      path: "/data/k8s/volumes/kubia-pv-c"
      server: 192.168.1.101    
      readOnly: false
    创建多个PV.yaml
    apiVersion: v1
    kind: Service
    metadata:
     name: kubia-service
    spec:
     clusterIP: None  #headless模式让客户端pod直接访问此service辖内的pod,而不是通过service来访问
     selector:
      app: kubia
      ports:
      - name: http
        port:80
    创建pod的service.yaml
    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
     name: kubia-ss
    spec:
     serviceName: kubia-service   #与上面创建的service对应
     replicas: 2
     template:
      metadata:
       labels:
        app: kubia
      spec:                    
       containers:             
       - image: yfzhou528/kubia
         name: kubia           
         ports:                
         - name: http
           containerPort: 8080 
         volumeMounts:         
         - name: kubia-data    
           mountPath: /data/db 
           
     volumeClaimTemplates:      |
     - metadata:                |
        name: kubia-data        |
       spec:                    |
        resources:              |->创建久卷声明模板
         requests:              |
          storage: 1Gi          |
         accessModes:           |
         - ReadWriteOnce        |
     
    创建ss.yaml

    -----------------------------------------------------------

  • 相关阅读:
    「SOL」工厂选址(BZOJ)
    「NOTE」数论小札
    Flask实现简单的群聊和单聊
    python基础总结
    基于Flask和百度AI实现与机器人对话
    django创建路径导航
    django中权限控制到按钮级别
    django中非菜单权限的归属
    MongoDB的增删改查
    jQuery于js的区别和联系
  • 原文地址:https://www.cnblogs.com/yfzhou528/p/13366940.html
Copyright © 2011-2022 走看看