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,负责下载、解包镜像,运行实例
使用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
网友评论