美文网首页
Kubernetes学习笔记——2.3 Pod和Node

Kubernetes学习笔记——2.3 Pod和Node

作者: IFELSE | 来源:发表于2018-02-22 14:40 被阅读0次

    by kowen 2018.02.06
    本文翻译自Viewing Pods and Nodes

    学习目标

    • 学习什么是Pod
    • 学习什么是Node
    • 错误排查

    Pod

    在创建新部署时,Kubernetes会建立一个Pod来寄存你的应用实例。Pod是一个抽象的概念,它包含一个或多个容器组成的容器组,还有这些容器共享的资源,这些资源包括:

    • 共享的存储,例如Volume
    • 网络,比如使用唯一的集群IP地址
    • 如何运行容器的配置信息,比如镜像版本和容器端口

    Pod模型上类似于一个具有特定应用的逻辑主机,它可以包含相对紧密耦合的不同应用容器。例如,一个Pod可能既包含Node.js Web服务容器,又包含给它提供数据库服务的容器。同一个Pod里的容器共享一个IP地址和端口段,协同工作和调度,并且在同一节点上的共享环境中运行。

    Pod是Kuberlnetes平台中的原子单位。在部署创建时,部署并不直接创建容器,而是创建包含了容器的Pod。Pod被分配绑定在指定的Node上,除非被停止或者删除它会一直在该Node上工作。万一出现Node宕机的情况,集群中另外一个可用的Node会马上启动运行一个完全一样的Pod。


    image.png

    Node

    Pod必须在Node上运行。Node是Kubernetes中的工作机器,可以使实体机可以是虚拟机。Node由Master管理。一个Node可以运行多个Pod,根据每个Node的资源情况,Master自动在集群中的Node上调配Pod。

    每个Node至少要运行:

    • Kubelet 负责Master和Node通讯的进程,管理运行的Pod和容器
    • 容器运行环境 比如Docker或rkt,负责下载、解包镜像,运行实例
    image.png

    使用kubectl排除故障

    在前面的内容中我们使用了kubectl。最常用的操作包括:

    • kubectl get 展示资源
    • kubectl describe 资源详情
    • kubectl logs 打印容器日志
    • kubectl exec 在容器上执行命令

    你可以使用这些命令查看应用部署时间、当前状态、运行位置和配置信息。

    交互式学习

    查看应用配置

    查看已部署应用的运行情况kubectl get pods

    $ kubectl get pods
    NAME                                  READY     STATUS    RESTARTS   AGE
    kubernetes-bootcamp-390780338-zwtz1   1/1       Running   0          1m
    

    查看pod内运行的容器和使用了什么镜像kubectl describe pods

    $ kubectl describe pods
    Name:           kubernetes-bootcamp-390780338-zwtz1
    Namespace:      default
    Node:           host01/172.17.0.80
    Start Time:     Thu, 08 Feb 2018 07:58:09 +0000
    Labels:         pod-template-hash=390780338
                    run=kubernetes-bootcamp
    Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"kubernetes-bootcamp-390780338","uid":"cc34b0d0-0ca5-11e8-80da-02...
    Status:         Running
    IP:             172.18.0.2
    Created By:     ReplicaSet/kubernetes-bootcamp-390780338
    Controlled By:  ReplicaSet/kubernetes-bootcamp-390780338
    Containers:
      kubernetes-bootcamp:
        Container ID:   docker://fa2db60f6758e56a8354db777b9c3c661b6958a5207b047022bd2255cb430a45
        Image:          docker.io/jocatalin/kubernetes-bootcamp:v1
        Image ID:       docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
        Port:           8080/TCP
        State:          Running
          Started:      Thu, 08 Feb 2018 07:58:15 +0000
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-lzshq (ro)
    Conditions:
      Type           Status
      Initialized    True
      Ready          True
      PodScheduled   True
    Volumes:
      default-token-lzshq:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-lzshq
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     <none>
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  3m    default-scheduler  Successfully assigned kubernetes-bootcamp-390780338-zwtz1 to host01
      Normal  Pulled     3m    kubelet, host01    Container image "docker.io/jocatalin/kubernetes-bootcamp:v1" already present on machine
      Normal  Created    3m    kubelet, host01    Created container with docker id fa2db60f6758; Security:[seccomp=unconfined]
      Normal  Started    3m    kubelet, host01    Started container with docker id fa2db60f6758
    

    我们能看到Pod中容器的相关信息:IP地址,端口号以及声明周期的一些事件。

    有些信息超出了目前的所学范围,后期我们会有更多介绍。

    在终端查看应用信息

    记住Pod是运行在单独隔离的网络中,所以我们需要设置代理访问它才能进行交互调试。运行代理程序的方式是在新终端中运行kubectl proxy

    运行代理后,我们再一次获取Pod名称放入POD_NAME环境变量中,让后通过代理直接访问pod。

    export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
    echo Name of the Pod: $POD_NAME
    

    接下来查看应用的输出内容

    $ curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/
    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-zwtz1 | v=1
    

    查看容器日志

    应用发送到STDOUT的所有信息都会记录进Pod的日志。通过以下命令可以查看日志信息

    $ kubectl logs $POD_NAME
    Kubernetes Bootcamp App Started At: 2018-02-08T07:58:15.550Z | Running On:  kubernetes-bootcamp-390780338-zwtz1
    
    Running On: kubernetes-bootcamp-390780338-zwtz1 | Total Requests: 1 | App Uptime: 781.629 seconds | Log Time: 2018-02-08T08:11:17.179Z
    Running On: kubernetes-bootcamp-390780338-zwtz1 | Total Requests: 2 | App Uptime: 835.026 seconds | Log Time: 2018-02-08T08:12:10.576Z
    

    注意:以上没有指定容器名称,因为在Pod只包含一个容器

    在容器上执行命令

    只要Pod启动后,我们可以直接在容器上运行命令,下面是在容器上获取所有环境变量信息(只有一个容器,所以省略了容器名称):

    $ kubectl exec $POD_NAME env
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=kubernetes-bootcamp-390780338-zwtz1
    KUBERNETES_PORT=tcp://10.0.0.1:443
    KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
    KUBERNETES_PORT_443_TCP_PROTO=tcp
    KUBERNETES_PORT_443_TCP_PORT=443
    KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
    KUBERNETES_SERVICE_HOST=10.0.0.1
    KUBERNETES_SERVICE_PORT=443
    KUBERNETES_SERVICE_PORT_HTTPS=443
    NPM_CONFIG_LOGLEVEL=info
    NODE_VERSION=6.3.1
    HOME=/root
    

    启动一个bash,可以连接到运行Nodejs程序的控制台:

    $ kubectl exec -ti $POD_NAME bash
    root@kubernetes-bootcamp-390780338-zwtz1:/#
    

    打印server.js程序:

    root@kubernetes-bootcamp-390780338-zwtz1:/# cat server.js
    var http = require('http');
    var requests=0;
    var podname= process.env.HOSTNAME;
    var startTime;
    var host;
    var handleRequest = function(request, response) {
      response.setHeader('Content-Type', 'text/plain');
      response.writeHead(200);
      response.write("Hello Kubernetes bootcamp! | Running on: ");
      response.write(host);
      response.end(" | v=1\n");
      console.log("Running On:" ,host, "| Total Requests:", ++requests,"| App Uptime:", (new Date() - startTime)/1000 , "seconds", "| Log Time:",new Date());
    }
    var www = http.createServer(handleRequest);
    www.listen(8080,function () {
        startTime = new Date();;
        host = process.env.HOSTNAME;
        console.log ("Kubernetes Bootcamp App Started At:",startTime, "| Running On: " ,host, "\n" );
    });
    

    在容器本地测试访问:

    root@kubernetes-bootcamp-390780338-zwtz1:/# curl localhost:8080
    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-zwtz1 | v=1
    

    退出容器控制台exit

    相关文章

      网友评论

          本文标题:Kubernetes学习笔记——2.3 Pod和Node

          本文链接:https://www.haomeiwen.com/subject/acsgzxtx.html