zoukankan      html  css  js  c++  java
  • k8s集群安装学习笔记二——资源清单

    简介:

    Kubernetes 资源清单
    Pod生命周期
    探针

    Kubernetes 资源清单

     
    在 k8s 中,一般使用 yaml 格式的文件来创建符合我们预期期望的 pod ,这样的 yaml 文件我们一般
    称为资源清单
     
    资源清单格式
    apiVersion: group/apiversion # 如果没有给定 group 名称,那么默认为 core,可以使用 kubectl api- versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
    kind: #资源类别 
    metadata: #资源元数据 
      name 
      namespace 
      lables 
      annotations # 主要目的是方便用户阅读查找 
    spec: # 期望的状态(disired state) 
    status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义

    资源清单常用命令

    获取 apiversion 版本信息
    [root@k8s-master01 ~]# kubectl api-versions admissionregistration.k8s.io/v1beta1 
    apiextensions.k8s.io/v1beta1 
    apiregistration.k8s.io/v1 
    apiregistration.k8s.io/v1beta1 
    apps/v1 ......(以下省略)
    获取资源的 apiVersion 版本信息
    [root@k8s-master01 ~]# kubectl explain pod 
    KIND: Pod 
    VERSION: v1 .....(以下省略) 
    [root@k8s-master01 ~]# kubectl explain Ingress 
    KIND: Ingress 
    VERSION: extensions/v1beta1
    获取字段设置帮助文档
    [root@k8s-master01 ~]# kubectl explain pod 
    KIND: Pod 
    VERSION: v1 
    DESCRIPTION: 
              Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. 
    FIELDS: 
         apiVersion <string> 
           ........ 
           ........
    字段配置格式
    apiVersion <string> #表示字符串类型 
    metadata <Object> #表示需要嵌套多层字段 
    labels <map[string]string> #表示由k:v组成的映射 
    finalizers <[]string> #表示字串列表 
    ownerReferences <[]Object> #表示对象列表 
    hostPID <boolean> #布尔类型 
    priority <integer> #整型 
    name <string> -required- #如果类型后面接 -required-,表示为必填字段

    示例:通过定义清单文件创建 Pod

    apiVersion: v1 
    kind: Pod 
    metadata: 
        name: pod-demo 
        namespace: default 
        labels: 
           app: myapp 
    spec: 
        containers: 
        - name: myapp-1 
          image: hub.atguigu.com/library/myapp:v1 
        - name: busybox-1 
          image: busybox:latest 
          command: 
          - "/bin/sh" 
          - "-c" 
          - "sleep 3600"
     
    运行创建上面pod.yaml文件
    $ kubectl apply -f pod.yaml
    pod/pod-demo created

    或者

    $ kubectl create -f pod.yaml
    pod/pod-demo created

    查看pod状态

    kubectl get pod

    查看运行的pod详情

    kubectl describe pod pod-demo

    查看容器日志(pod-demo pod名,-c 指定容器名,如果该pod里面只有一个容器,可不加-c)

    kubectl log pod-demo -c myapp-1

    注:当容器报错了,先用 kubectl describe pod pod-demo 查看pod详情,找到异常容器,再查看异常容器日志排查

     
    kubectl get pod xx.xx.xx -o yaml
    <!--使用 -o 参数 加 yaml,可以将资源的配置以 yaml的格式输出出来,也可以使用json,输出为json格式-->

    Pod生命周期

    init容器

    Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init容器
    Init 容器与普通的容器非常像,除了如下两点:
      Init 容器总是运行到成功完成为止
      每个 Init 容器都必须在下一个 Init 容器启动之前成功完成
     
    如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,
    如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动。
    Init 容器具有与应用程序容器分离的单独镜像
     
     
    init模板
     
     $ vim init-pod.yaml
    apiVersion: v1 
    kind: Pod #pod类型
    metadata: 
      name: myapp-pod #pod名称
      labels: #标签
        app: myapp 
    spec: #详细描述信息
      containers: 
      - name: myapp-container #容器名
        image: busybox #用的镜像
        command: ['sh', '-c', 'echo The app is running! && sleep 3600']  #启动时执行命令,取代CMD       
      initContainers:  #初始化上面的容器
      - name: init-myservice  #定义第一个初始化容器
        image: busybox 
        command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']  #until: 当条件为真时,退出循环. nslookup myservice:解析域名
      - name: init-mydb  #定义第二个初始化容器
        image: busybox 
        command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;'] 

    创建pod

    kubectl create -f init-pod.yaml

    查看网络

    kubectl get svc

    可以查看日志看到上面会一直重新解析,是因为没有该解析,就会一直尝试解析

    创建svc (service简称)

    $vim myservice.yaml
    kind: Service 
    apiVersion: v1 
    metadata: 
      name: myservice 
    spec: 
      ports: 
        - protocol: TCP 
          port: 80 
          targetPort: 9376  #暴露到svc的端口
    $ vim mydb.yaml
    kind: Service 
    apiVersion: v1 
    metadata: 
      name: mydb 
    spec: 
      ports: 
        - protocol: TCP 
          port: 80 
          targetPort: 9377

    创建pod

    $ kubectl create -f myservice.yaml
    $ kubectl create -f mydb.yaml

    然后查看,即可看到初始化成功

    $ kubectl get pod

    查看svc状态(可看到已添加解析)

    $ kubectl get svc

     探针

    探针是由 
    kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:
      ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
      TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
      HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的
     
    检测探针 - 就绪检测
    $ vim read.yaml
    apiVersion: v1 
    kind: Pod 
    metadata: #元数据信息
      name: readiness-httpget-pod 
      namespace: default 
    spec:  #详细描述
      containers: 
      - name: readiness-httpget-container 
        image: wangyanglinux/myapp:v1 
        imagePullPolicy: IfNotPresent #镜像下载策略,如果有就不下载
        readinessProbe:  #就绪检测
          httpGet:  #检测方案
            port: 80 
            path: /index1.html 
          initialDelaySeconds: 1  #初始化检测延时,这个容器在启动1秒以后,启用初始化检测
          periodSeconds: 3 #重试时间

    创建pod

    kubectl create -f read.yaml

    进入容器

    kubectl get pod
    kubectl exec readiness-httpget-pod -c readiness-httpget-container -it -- /bin/sh #如果pod中只有一个容器,可不指定-c

    检测探针 - 存活检测 

    livenessProbe-exec

    $ vim  live-exec.yaml
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: liveness-exec-pod 
      namespace: default 
    spec: 
      containers: 
      - name: liveness-exec-container 
        image: hub.atguigu.com/library/busybox 
        imagePullPolicy: IfNotPresent 
        command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]
        livenessProbe: 
          exec: 
            command: ["test","-e","/tmp/live"]  #检测这个文件是否存在
        initialDelaySeconds: 1 
        periodSeconds: 3
    kubectl create -f live-exec.yaml
    livenessProbe-httpget
    $ vim live-http.yaml
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: liveness-httpget-pod 
      namespace: default 
    spec:
      containers: 
      - name: liveness-httpget-container 
        image: hub.atguigu.com/library/myapp:v1 
        imagePullPolicy: IfNotPresent 
        ports: 
        - name: http 
          containerPort: 80 
        livenessProbe: 
          httpGet: 
            port: http 
            path: /index.html  #检测能否通过http的方式获取到这个文件
          initialDelaySeconds: 1 
          periodSeconds: 3 
          timeoutSeconds: 10
    kubectl create -f live-http.yaml
    livenessProbe-tcp
    $ vim live-tcp.yaml
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: probe-tcp 
    spec: 
      containers: 
      - name: nginx 
        image: hub.atguigu.com/library/myapp:v1 
        livenessProbe: 
          initialDelaySeconds: 5 
          timeoutSeconds: 1 
          tcpSocket: 
            port: 80
    kubectl create -f live-tcp.yaml
    启动、退出动作
    $ vim post.yaml
    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", "echo Hello from the postStop handler > /usr/share/message"]
    kubectl create -f post.yaml
    好记性不如烂笔头,最难不过坚持
  • 相关阅读:
    java中Calendar类里面的月份是月份数减一。
    hdu oj
    存在重复元素
    杨辉三角
    删除链表的倒数第n个结点
    相交链表
    环形链表 II
    环形链表
    至少是其他数字两倍的最大数
    寻找数组的中心索引
  • 原文地址:https://www.cnblogs.com/dannylinux/p/15261207.html
Copyright © 2011-2022 走看看