zoukankan      html  css  js  c++  java
  • k8s之pod与Pod控制器

    k8s中最为重要的基础资源,pod,pod controller,service
    pod controller类型有多种需要向控制器赋值之后使用:

    kubectl命令使用

    kubectk get nodes/pod/deployment/ns  name#查询节点,pod,控制器。名称空间
    kubectl delete pod|ns...  name #删除名称空间,pod
    [root@node1 ~]# kubectl create namespace myns
    namespace/myns created
    [root@node1 ~]# kubectl get ns
    NAME              STATUS   AGE
    default           Active   167m
    kube-node-lease   Active   167m
    kube-public       Active   167m
    kube-system       Active   167m
    myns              Active   2m11s
    
    kubectl get namespace myns -o wide| -o yaml #显示详细信息或者yml格式信息
    kubectl describe resource(资源) name(名称) #显示当前资源创建状态
    
    kubectl get namespace myns -o wide| -o yaml #显示详细信息或者yml格式信息
    

    image.png

    [root@node1 ~] kubectl create deploy myweb --image=nginx:1.14-alpine  #创建一个deploy控制器。此控制器会创建一个pod资源。如果不指定名称空间则会在默认名称空间中
    [root@node1 ~]# kubectl get all
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/myweb-5f8b88984c-476rn   1/1     Running   0          26s
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   177m
    
    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/myweb   1/1     1            1           26s
    
    NAME                               DESIRED   CURRENT   READY   AGE
    replicaset.apps/myweb-5f8b88984c   1         1         1       26s
    [root@node1 ~]# kubectl get pods -o wide
    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
    myweb-5f8b88984c-476rn   1/1     Running   0          2m29s   10.244.1.2   node3   <none>   
    
    

    image.png
    使用pod的ip即可访问,如果手动删除此pod,deploy控制器则会自动重新创建一个pod
    image.png
    虽然会自动重建一个容器,但是ip以及名称会变化,一般使用service资源绑定后端pod资源

    kubectl create service clusterip myweb --tcp=80:80 #创建一个service资源。会自动关联至myweb这个deploy资源中的pod中。此service资源中的地址很少会便。几十后端podip地址经常变动,也可以使用service资源ip访问到后端pod
    image.png
    由于service资源中的ip地址也有可能会变动。则可以使用service名称来或者label绑定

    kubectl create service nodeport myapp --tcp=80:80 #创建nodeport类型端口,此类型会在k8s集群中每一台主机中打开一个端口绑定至后端主机

    [root@node1 ~]# kubectl create service nodeport myweb --tcp=80:80
    service/myweb created
    [root@node1 ~]# kubectl get svc -o wide
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3h37m   <none>
    myweb        NodePort    10.100.112.31   <none>        80:30593/TCP   4s      app=myweb
    

    image.png
    image.png
    在宿主机外使用宿主机地址加端口访问集群内部pod

    kubectl api-versions #查看api资源版本

    [root@node1 ~]# kubectl api-versions
    admissionregistration.k8s.io/v1
    admissionregistration.k8s.io/v1beta1
    apiextensions.k8s.io/v1
    apiextensions.k8s.io/v1beta1
    apiregistration.k8s.io/v1
    apiregistration.k8s.io/v1beta1
    apps/v1
    authentication.k8s.io/v1
    authentication.k8s.io/v1beta1
    authorization.k8s.io/v1
    authorization.k8s.io/v1beta1
    autoscaling/v1
    autoscaling/v2beta1
    autoscaling/v2beta2
    batch/v1
    batch/v1beta1
    certificates.k8s.io/v1beta1
    coordination.k8s.io/v1
    coordination.k8s.io/v1beta1
    events.k8s.io/v1beta1
    extensions/v1beta1
    networking.k8s.io/v1
    networking.k8s.io/v1beta1
    node.k8s.io/v1beta1
    policy/v1beta1
    rbac.authorization.k8s.io/v1
    rbac.authorization.k8s.io/v1beta1
    scheduling.k8s.io/v1
    scheduling.k8s.io/v1beta1
    storage.k8s.io/v1
    storage.k8s.io/v1beta1
    v1
    

    资源对象的配置格式
    apiVersion:api版本类型
    kind:类型
    metadata:元数据字段,可嵌套
    spec:用户自定义期望状态:可嵌套
    status:实际状态,是有k8s集群自行维护

    kubectl api-resources##查看当前k8s之前的所有支援类型

    自定义简单的配置清单

    [root@node1 ~]# vim ns.yml
    apiVersion: v1
    kind: Namespace
    metadate:
      name: develop
    [root@node1 ~]# kubectl apply -f ns.yml   #使用apply -f 部署yml文件中的配置清单
    namespace/develop created
    

    https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.16/
    k8s官方资源配置文档

    kubectl get pod myweb-5f8b88984c-nhmt9 -o yaml --export ##也可以使用--export将pod的配置导出作为模板。

    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null 
      name: pod-demo  #pod名称
      namespace: develop #属于哪个名称空间
    spec:
      containers:
      - image: iKubernetes/myapp:v1 #拉取镜像
        imagePullPolicy: IfNotPresent #表示如果本地有镜像则从本地镜像启动,如果没有则去网上拉取镜像
        name: myapp #pod中运行的容器名称
        resources: {} #定义资源限制,比如多少cpu,内存等
      dnsPolicy: ClusterFirst #dns策略,clusterfirst为k8s默认dns策略
      priority: 0 #定义优先级
      restartPolicy: Always #重启策略,定义pod宕机时,则有controller重启pod
      schedulerName: default-scheduler #由哪个调度器调度
      securityContext: {}  #安全上下文
     
    
    [root@node1 ~]#kubectl apply -f pod.yml
    [root@node1 ~]# kubectl get pod -n develop              
    NAME       READY   STATUS    RESTARTS   AGE
    pod-demo   1/1     Running   0          22s
    

    explain 可查看核心资源类型定义字段。

    kubectl explain pods.spec.hostIPC #可一级一级往下查看字段内容

    在一个pod中创建两个容器

    [root@node1 ~]# vim pod-2.yml         
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo-2
      namespace: prod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
      - name: bbox
        image: busybox
        imagePullPolicy: ifNotPresent
        command: ["/bin/sh","-c","sleep 86400"]
    ~                                          
    

    [root@node1 ~]# kubectl exec pod-demo-2 -c bbox -n prod -it -- /bin/sh #连接容器内部

    / # netstat -tan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
    / # 
    

    此busybox没有默认运行程序为bin/sh。这里的监听端口为第一个myapp容器提供,两个容器是共享pod中的网络
    kubectl logs myweb-5f8b88984c-nhmt9 ##查看pod中日志

    spec.network字段可定义pod直接共享宿主机的网络,外部可直接访问宿主机

    [root@node1 ~]# vim pod-3.yml              
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo-3
      namespace: prod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
      hostNetwork: true
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    也可使用宿主机端口映射至内部pod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - protocol: TCP
          containerPort: 80
          name: http
          hostPort: 8080
    
    

    image.png

    image.png
    且只能在被调度的节点上使用8080端口访问。

    label标签
    由键前缀和键名组成,键前缀必须为dns域名。标签用来将service和pod controller来关联至后端pod,k8s中service和pod资源 ip和名称可能会发生变化,但是标签不会变。

    标签选择器用于表达标签查询条件或者选择标准。
    matchLabels:通过直接给定键值对指定标签选择器

    [root@node1 ~]# kubectl get pods --show-labels  #查看pod标签选择器
    NAME                     READY   STATUS    RESTARTS   AGE   LABELS
    myweb-5f8b88984c-nhmt9   1/1     Running   0          19h   app=myweb,pod-template-hash=5f8b88984c
    

    直接在metadata字段指定labels标签。可以指定多个键,这里为app和rel

    image.png
    image.png

    [root@node1 ~]# kubectl label pod pod-demo -n prod tier=frontend #可使用kubectl直接给pod打上标签。
    --overwrite覆盖掉之前标签修改
    "key-" 在键后面使用减号删除
    -l app=myapp #过滤标签
    -L app 过滤出所有带有app这个键的资源

    [root@node1 ~]# kubectl get pod -n prod --show-labels -l rel=stable
    NAME         READY   STATUS    RESTARTS   AGE   LABELS
    pod-demo-2   2/2     Running   0          12m   app=pod-demo,rel=stable
    [root@node1 ~]# 
    

    Pod生命周期
    一阶段,初始容器阶段
    1,容器刚刚创建完成,可能需要环境初始化,在核心容器启动之前由一个容器将主页或者其他配置信息拉取或者配置好退出
    2阶段,主容器运行阶段
    pod.sepc.containers.lifecycle定义了容器运行之前和结束之前命令,其中由两个字段poststart,prestop。用来定义开始和结束之前运行的命令
    https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/

    apiVersion: v1
    kind: Pod
    metadata:
      name: lifecycle-demo
    spec:
      containers:
      - name: lifecycle-demo-container
        image: nginx
        lifecycle: #定义容器的生命周期字段
          postStart: #开始之前
            exec:
              command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
          preStop: #结束之前
            exec:
              command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
    

    2,正常运行阶段
    健康状态检查,如果检查失败,则重启容器,且不会一直马上重启,会有一个时间检测间隔。
    pod.spec.containers.livenessProbe:定义正常运行阶段pod中容器的健康状态检测

    使用liveness健康状态来检测容器
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness-exec
      name: liveness-exec
    spec:
      containers:
      - name: liveness-demo
        image: busybox
        args: #此字段定义容器主程序运行命令
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 30
        livenessProbe: #健康状态检测
          exec: #exec表示使用自定义shell命令来检测,此检测表示探测容器中healthy文件是否存在
            command:
            - test
            - -e
            - /tmp/healthy
    

    image.png
    之后会看见此pod重启次数会增加,现在是2次

    使用lifecycle定义启动容器之后创建一个文件,livenessProbe使用HTTP来检测网页的方式来做健康状态检测
    apiVersion: v1
    kind: Pod
    metadata:
     labels:
       test: liveness
     name: liveness-http
    spec:
     containers:
     - name: liveness-demo
       image: nginx:1.12-alpine
       ports:
       - name: http
         containerPort: 80
       lifecycle:
         postStart:
           exec:
             command:
             - /bin/sh
             - -c
             - 'echo Healty > /usr/share/nginx/html/healthz'
       livenessProbe:
         httpGet: #使用http请求方式检测容器状态
           path: /healthz #http请求路径
           port: http
           scheme: HTTP
         periodSeconds: 2 #间隔检测
         failureThreshold: 2 #失败次数
         initialDelaySeconds: 3 #初始化3秒后检测
    

    就绪状态检测:
    pod.sepc.containers.readinessProbe(无权力重启容器)配置参数于livenessProbe相似

    ##删除一个文件,睡眠30秒之后在创建。创建之后30秒后则检测就绪成功
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: readiness-exec
      name: readiness-exec
    spec:
      containers:
      - name: readiness-demo
        image: busybox
        args: ["/bin/sh", "-c", "while true; do rm -f /tmp/ready; sleep 30; touch /tmp/ready; sleep 300; done"]
        readinessProbe:
          exec:
            command: ["test", "-e", "/tmp/ready"]
          initialDelaySeconds: 5 # 延迟5秒中检测
          periodSeconds: 5 #检测5次
    

    3,容器结束之前
    2阶段,主容器运行阶段

    pod相位
    pod对象应该总是处于以下几个相位中
    Pending:API创建pod资源并且存入etcd中,但尚未调度完成或者处于下载镜像中
    Running:Pod以被调度至某节点,所有容器都被kubelet创建完成
    Succeeded:Pod中所有容器成功终止并且不会被重启
    Failed:所有容器中止,但至少有一个容器终止失败,
    Unknown:API server 无法正常获取到Pod对象的状态信息。通常由于无法于所在节点kubelet通信导致

    Pod对象容器的重启策略
    Always:但凡Pod对象终止就重启,为默认设定
    OnFailure:仅在Pod对象出现错误时才将其重启,手动终止则不会重启
    Never:从不重启

    kubectl explain pod.spec.containers.resources #定义资源范围
    limits:定义资源上限
    requests:资源下线,低于下线值则pod不会启动

    apiVersion: v1
    kind: Pod
    metadata:
      name: stress-pod
    spec:
      containers:
      - name: stress
        image: ikubernetes/stress-ng
        command: ["/usr/bin/stress-ng", "-c 1", "-m 1", "--metrics-brief"]
        resources: #定义资源限制
          requests: #下限
            memory: "128Mi" #定义内存下限为128M
            cpu: "200m" #CPU为0.2个核心
          limits:#上限
            memory: "512Mi" #定义上限不超过512M内存 
            cpu: "400m" #上限为0.4个核心
    

    Pod服务质量类别
    Guaranteed.
    Burstable
    BestEffort

    Pod控制器

    Pod controller 类型
    ReplicaSet:用于控制无状态应用
    spec字段:
    Pod Template:定义Pod的模板,控制器以此模板创建pod 。
    Pod Selector:控制器通过标签识别那些Pod为自己管理,
    Replicas:用户期望的pod数量

    RS配置示例
    apiVersion: apps/v1 
    kind: ReplicaSet
    metadata:
      name: myapp-rs
      namespace:prod
    spec:
      replicas: 2 #Pod复本数
      selector: #标签选择器
         matchLabels: #使用标签匹配
           app: myapp-pod  #app=myapp-pod
      template: #定义pod模板
        metadata: #Pod元数据 
          labels: #Pod的模板
            app: myapp-pod #定义Pod的标签需要与控制器的标签选择相同否则的话会一直创建pod却匹配不到Pod
        spec: #Pod的创建字段
          containers:
          - name: myapp
            image: ikubernetes/myapp:v1
            ports:
            - name: http
              containerPort: 80
    
    [root@node1 chapter5]# kubectl get pods -n prod
    NAME             READY   STATUS              RESTARTS   AGE
    myapp-rs-cjx5q   0/1     ContainerCreating   0          8s
    myapp-rs-jqhwf   1/1     Running             0          8s
    pod-demo-2       2/2     Running             0          24h
    pod-demo-3       1/1     Running             0          42h
    [root@node1 chapter5]# kubectl get rs -n prod    
    NAME       DESIRED   CURRENT   READY   AGE
    myapp-rs   2         2         2       13s
    [root@node1 chapter5]# 
    
    

    Deployment Pod控制器配置示例

    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deploy-nginx
    spec:
      replicas: 3
      minReadySeconds: 10
    #  strategy: #更新策略,可利用此策略实现金丝雀更新
    #    rollingUpdate: 
    #      maxSurge: 1 #允许多一个
    #      maxUnavailable: 1 #允许少一个,
    #    type: RollingUpdate #滚动更新
      selector:
        matchLabels:
          app: myapp
          rel: stable
      template:
        metadata:
          labels:
            app: myapp
            rel: stable
        spec:
          containers:
          - name: myapp
            image: ikubernetes/myapp:v1
            ports:
            - containerPort: 80
              name: http
            readinessProbe:
              periodSeconds: 1
              httpGet:
                path: /
                port: http
    
    Deploy 控制器创建完成后会自动创建一个rs控制器由RS控制器管理pod。deploy控制着rs
    [root@node1 chapter5]# kubectl apply -f deploy-nginx.yaml 
    deployment.apps/deploy-nginx created
    [root@node1 chapter5]# kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    liveness-http            1/1     Running   0          23h
    myweb-5f8b88984c-nhmt9   1/1     Running   0          45h
    [root@node1 chapter5]# kubectl get pods -n prod
    NAME                            READY   STATUS    RESTARTS   AGE
    deploy-nginx-6db964bf97-25rbj   1/1     Running   0          8s
    deploy-nginx-6db964bf97-tzlw5   1/1     Running   0          8s
    deploy-nginx-6db964bf97-ztpwp   1/1     Running   0          8s
    [root@node1 chapter5]# kubectl get rs -n prod    
    NAME                      DESIRED   CURRENT   READY   AGE
    deploy-nginx-6db964bf97   3         3         3       16s
    [root@node1 chapter5]# 
    
    

    使用deploy更新时只需要修改yml文件中的image版本,则会自动以滚动放松删除一个pod添加一个更新后的pod

    创建过程
    [root@node1 chapter5]# kubectl get pods -n prod -w
    NAME                            READY   STATUS    RESTARTS   AGE
    deploy-nginx-56c8d75644-zxd6c   1/1     Running   0          11s
    deploy-nginx-6db964bf97-25rbj   1/1     Running   0          2m49s
    deploy-nginx-6db964bf97-tzlw5   1/1     Running   0          2m49s
    deploy-nginx-6db964bf97-ztpwp   1/1     Running   0          2m49s
    deploy-nginx-6db964bf97-tzlw5   1/1     Terminating   0          2m56s
    deploy-nginx-56c8d75644-czr8j   0/1     Pending       0          0s
    deploy-nginx-56c8d75644-czr8j   0/1     Pending       0          0s
    deploy-nginx-56c8d75644-czr8j   0/1     ContainerCreating   0          0s
    deploy-nginx-6db964bf97-tzlw5   0/1     Terminating         0          2m57s
    deploy-nginx-6db964bf97-tzlw5   0/1     Terminating         0          2m58s
    deploy-nginx-6db964bf97-tzlw5   0/1     Terminating         0          2m58s
    deploy-nginx-56c8d75644-czr8j   0/1     Running             0          7s
    deploy-nginx-56c8d75644-czr8j   1/1     Running             0          7s
    deploy-nginx-6db964bf97-25rbj   1/1     Terminating         0          3m13s
    deploy-nginx-56c8d75644-qn6rz   0/1     Pending             0          0s
    deploy-nginx-56c8d75644-qn6rz   0/1     Pending             0          0s
    deploy-nginx-56c8d75644-qn6rz   0/1     ContainerCreating   0          0s
    deploy-nginx-6db964bf97-25rbj   0/1     Terminating         0          3m14s
    deploy-nginx-56c8d75644-qn6rz   0/1     Running             0          7s
    deploy-nginx-56c8d75644-qn6rz   1/1     Running             0          8s
    deploy-nginx-6db964bf97-25rbj   0/1     Terminating         0          3m24s
    deploy-nginx-6db964bf97-25rbj   0/1     Terminating         0          3m24s
    deploy-nginx-6db964bf97-ztpwp   1/1     Terminating         0          3m31s
    deploy-nginx-6db964bf97-ztpwp   0/1     Terminating         0          3m32s
    deploy-nginx-6db964bf97-ztpwp   0/1     Terminating         0          3m33s
    deploy-nginx-6db964bf97-ztpwp   0/1     Terminating         0          3m33s
    

    DaemonSets Pod控制器
    此控制器会创建出于node数量同等的pod,每个node一个

    配置示例
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: filebeat-ds
      labels:
        app: filebeat
    spec:
      selector:
        matchLabels:
          app: filebeat
      template:
        metadata:
          labels:
            app: filebeat
          name: filebeat
        spec:
          containers:
          - name: filebeat
            image: ikubernetes/filebeat:5.6.5-alpine
            env: #此字段表示传递变量进入容器中
            - name: REDIS_HOST #变量名
              value: db.ikubernetes.io:6379 #变量值
            - name: LOG_LEVEL #变量名
              value: info
           nodeSelector: #节点选择器。
             log: "on" #只有当节点有log为on的标签时才会调度至此节点
    


    此控制器会根据node数量创建相应的pod并在每个node运行一个
    可以在 pod字段中nodeselector选择调度到相应标签的节点上

    k8s之pod与Pod控制器

  • 相关阅读:
    洛谷 P4297 [NOI2006]网络收费
    bzoj 5072: [Lydsy1710月赛]小A的树
    树形背包
    loj #2071. 「JSOI2016」最佳团体
    bzoj 2427: [HAOI2010]软件安装
    bzoj 4987: Tree
    loj #2007. 「SCOI2015」国旗计划
    loj #2006. 「SCOI2015」小凸玩矩阵
    loj #2020. 「AHOI / HNOI2017」礼物
    loj #547. 「LibreOJ β Round #7」匹配字符串
  • 原文地址:https://www.cnblogs.com/woaiyitiaochai/p/12023151.html
Copyright © 2011-2022 走看看