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。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容