Kubernetes学习笔记——2.3 Pod和Node

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。


Kubernetes学习笔记——2.3 Pod和Node_第1张图片
image.png

Node

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

每个Node至少要运行:

  • Kubelet 负责Master和Node通讯的进程,管理运行的Pod和容器
  • 容器运行环境 比如Docker或rkt,负责下载、解包镜像,运行实例
Kubernetes学习笔记——2.3 Pod和Node_第2张图片
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:    
    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:  
Tolerations:     
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)