持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
创建并运行资源清单
1、通过资源清单创建pod
编写资源清单
apiVersion: v1
# 资源类型
kind: Pod
metadata:
# pod名称
name: pod-test
# pod所在namespace是test
namespace: test
spec:
# initC容器
initContainers:
- name: init-container
image: busybox:latest
command: ['sh','-c','echo init container is running && sleep 3600' ]
# mainC容器
containers:
- name: nginx-pod
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
# 钩子
lifecycle:
# 容器启动钩子
postStart:
exec:
command: ["/bin/sh","-c", "echo pod is starting > /tmp/start "]
#容器关闭钩子
preStop:
exec:
command: ["/bin/sh","-c", "echo pod is stoping > /tmp/stop "]
# 就绪检测
readinessProbe:
# httpGet检测,podip:80/index.html
httpGet:
port: 80
path: /index.html
# 存活检测
livenessProbe:
# tcp检测,检测80端口是否打开
tcpSocket:
port: 80
上面是一个nginx的pod,创建在test命名空间下。
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: test
labels:
app: myapp
spec:
containers:
- name: myapp-1
image: wangyanglinux/myapp:v1
- name: busybox-1
image: busybox:latest
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
- 我们可以去官网查询busybox的镜像地址, 官网是hub.docker.com, 可以通过搜索找到busybox,然后获取最新版本即可。默认是去docker官网拉取镜像。
- Command: 含义是重写pod原来的命令
创建命名空间
kubectl create namespace 名字空间名称
查询命名空间
kubectl get namespace 或者 kubectl get ns
通过资源清单创建pod命令:
kubectl create -f 资源文件名
- create创建文件的原理:yaml 文件通过kubectl 转化为json文件,发送给apiserver,去实现资源的创建。
例如:
kubectl create -f pod.yaml
pod默认创建在default命名空间下。
拉取镜像的过程中,可以通过kubectl describe pod pod名 查看事件进展
kubectl describe pod pod-demo
看到上面的信息,表示pod启动成功
- READY 2/2 :表示有两个容器,并且两个都是ready的。
2、查询pod
kubectl get pod
-
如果不再默认命名空间下,需要加上-n 命名空间
kubectl get pod -n test -
查询所有命名空间下的pod
kubectl get pod --all-namespaces
3、查询pod的所有label标签
kubectl get pod --all-namespaces --show-labels
查询指定pod的label标签
4、查询指定标签的pod
命令:
kubectl get pod --show-labels -l key/key=value
- -l 后面可以跟key或者key=value
举例:
kubectl get pod --all-namespaces --show-labels -l k8s-app
5、展示pod的json格式的资源清单
kubectl get pod podName --all-namespaces -o json
6、展示pod的yaml格式的资源清单
kubectl get pod podName --all-namespaces -o yaml
7、展示pod全部的数据
kubectl get pod --all-namespaces -o wide
这个命令可以展示出pod的ip地址,工作在哪个节点。
查询pod-demo的信息
- Pod-name 创建在node2上,ip是10.244.2.4
8、监听pod节点状态变化
kubectl get pod --all-namespaces -w
当执行了这个命令以后,光标就定住了,当pod的状态有变化的时候,会打印出一条记录
9、查询资源的详细信息
kubectl get pod -n kube-system coredns-6d8c4cb4d-7sd7m -o yaml
这条命令会列出当前pod的所有的信息。包括当前的运行状态status,运行的ip,pod的ip等
10、查看pod的简要信息
kubectl describe pod -n kube-system coredns-6d8c4cb4d-7sd7m
在这个命令里详细列出了资源近期发生的事件。比如:
第一个事件:调度。成功在node02节点发生事件调度
第二个事件:拉取资源
第三个事件:资源拉取完成
第四个事件:创建资源
第五个事件:启动资源
describe看的是系统,也就是k8s本身对这个pod的信息描述
11、查询pod日志
当pod中只有1个容器时,查看日志命令如下
kubectl logs pod名称
例如:
kubectl logs coredns-6d8c4cb4d-7sd7m -n kube-system
logs命令是对pod进程的信息描述
当pod中有n(n>1)个容器时,查看日志命令:
kubectl logs pod名称 -c 容器名 -n 命名空间
describe + logs一起,对pod的错误描述会更完整。
12、删除pod
kubectl delete pod pod名称·
13、查询文档说明
kubectl explain pod.spec
14、执行命令,进入到pod中
kubectl exec -it pod-name -c containerName -n namespace -- bash
-
-i: 变成交互状态
-
-t :仅投入到终端
-
-c: 如果一个pod中有多个容器,需要指定容器的name
容器名称,可以通过 -o yaml 查看。例如:
kubectl get pod kube-proxy-cmjkv -n kube-system -o yaml
三、pod的概念
上面我们创建了一个pod,名字叫pod-demo。pod中有两个容器,一个是myapp, 一个是busybox.
通过kubectl get pod -o wide可以查看pod创建在哪个node节点
kubectl get pod -o wide
可以看到pod被创建在node2节点上。
现在我们来node2节点看看docker中都有哪些启动的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f4bec4a11ee busybox "/bin/sh -c 'sleep 3…" 44 minutes ago Up 44 minutes k8s_busybox-1_pod-demo_default_bb1d9eb3-57a2-41f9-8036-b333144ad096_0
df986fd94590 wangyanglinux/myapp "nginx -g 'daemon of…" 45 minutes ago Up 45 minutes k8s_myapp-1_pod-demo_default_bb1d9eb3-57a2-41f9-8036-b333144ad096_0
c72273aeaa0a registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 46 minutes ago Up 46 minutes k8s_POD_pod-demo_default_bb1d9eb3-57a2-41f9-8036-b333144ad096_0
826e010b1d1b 8cb5de74f107 "/opt/bin/flanneld -…" 7 days ago Up 7 days k8s_kube-flannel_kube-flannel-ds-h22hw_kube-system_0c708f02-5433-46e8-9ccb-95fe2824b7c8_0
3d23a28e15bc registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 7 days ago Up 7 days k8s_POD_kube-flannel-ds-h22hw_kube-system_0c708f02-5433-46e8-9ccb-95fe2824b7c8_0
1f10ce836725 registry.aliyuncs.com/google_containers/kube-proxy "/usr/local/bin/kube…" 7 days ago Up 7 days k8s_kube-proxy_kube-proxy-bhjtx_kube-system_fa43b2f8-e3f5-4368-91d3-4884037ef07e_0
c5ecebb000b3 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 7 days ago Up 7 days k8s_POD_kube-proxy-bhjtx_kube-system_fa43b2f8-e3f5-4368-91d3-4884037ef07e_0
我们根据Name名称可以将pod归一下类。 pod名称相同的归为一类
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
第一组:
8f4bec4a11ee busybox "/bin/sh -c 'sleep 3…" 44 minutes ago Up 44 minutes k8s_busybox-1_pod-demo_default_bb1d9eb3-57a2-41f9-8036-b333144ad096_0
df986fd94590 wangyanglinux/myapp "nginx -g 'daemon of…" 45 minutes ago Up 45 minutes k8s_myapp-1_pod-demo_default_bb1d9eb3-57a2-41f9-8036-b333144ad096_0
c72273aeaa0a registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 46 minutes ago Up 46 minutes k8s_POD_pod-demo_default_bb1d9eb3-57a2-41f9-8036-b333144ad096_0
第二组:
826e010b1d1b 8cb5de74f107 "/opt/bin/flanneld -…" 7 days ago Up 7 days k8s_kube-flannel_kube-flannel-ds-h22hw_kube-system_0c708f02-5433-46e8-9ccb-95fe2824b7c8_0
3d23a28e15bc registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 7 days ago Up 7 days k8s_POD_kube-flannel-ds-h22hw_kube-system_0c708f02-5433-46e8-9ccb-95fe2824b7c8_0
第三组:
1f10ce836725 registry.aliyuncs.com/google_containers/kube-proxy "/usr/local/bin/kube…" 7 days ago Up 7 days k8s_kube-proxy_kube-proxy-bhjtx_kube-system_fa43b2f8-e3f5-4368-91d3-4884037ef07e_0
c5ecebb000b3 registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 7 days ago Up 7 days k8s_POD_kube-proxy-bhjtx_kube-system_fa43b2f8-e3f5-4368-91d3-4884037ef07e_0
一共有三组,每一组都有一个pause容器,因为我们在创建pod的时候,会创建一个共享的pause容器。无论是系统创建的flannel还是kube-proxy,还是我们自己创建的pod,他们都是一个容器,并且首先会创建一个pause容器。
myapp-1 和 busybox-1容器他们在同一个pod中,所以共享网络栈。因此,myapp-1启动了80端口,在busybox-1中也可以请求到
查询pod的ip
kubectl get pod -o wide
在master节点上执行
curl 10.244.2.5
请求成功。这时访问的是nginx的默认文件,index.html
kubectl exec -it pod-demo -c myapp-1 -- /bin/sh
cd /usr/share/nginx/html
进入到busybox-1节点,他和myapp-1是两个单独的容器,下面验证这两个容器的网络是互通的
kubectl exec -it pod-demo -c busybox-1 -- /bin/sh
进入到busybox-1容器中,访问localhost:80端口。
但是busybox-1中没有安装curl命令,我们使用wget下载localhost下的文件
wget localhost/index.html
我们看到,文件下载成功,并且在本地可以访问文件内容。
通过上面的描述,其实我们可以看到pod里面的container其实就是docker容器。只不过多加了容器和容器之间的网络通讯和存储卷,不用把pod想的很复杂。