【k8s系列七】k8s资源清单2---创建并运行资源清单

112 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

image

看到上面的信息,表示pod启动成功

image

  • 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

image

查询指定pod的label标签

image

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 

image

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地址,工作在哪个节点。

image

查询pod-demo的信息

image

  • Pod-name 创建在node2上,ip是10.244.2.4

8、监听pod节点状态变化

kubectl get pod --all-namespaces -w

当执行了这个命令以后,光标就定住了,当pod的状态有变化的时候,会打印出一条记录

image

9、查询资源的详细信息

kubectl get pod -n kube-system coredns-6d8c4cb4d-7sd7m -o yaml

image

这条命令会列出当前pod的所有的信息。包括当前的运行状态status,运行的ip,pod的ip等

image

10、查看pod的简要信息

kubectl describe pod -n kube-system coredns-6d8c4cb4d-7sd7m

在这个命令里详细列出了资源近期发生的事件。比如:

image

第一个事件:调度。成功在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

image

可以看到pod被创建在node2节点上。

现在我们来node2节点看看docker中都有哪些启动的容器

docker ps

image

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

image

在master节点上执行

curl 10.244.2.5

image

请求成功。这时访问的是nginx的默认文件,index.html

kubectl exec -it pod-demo -c myapp-1 -- /bin/sh
cd /usr/share/nginx/html

image

进入到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

image

我们看到,文件下载成功,并且在本地可以访问文件内容。

通过上面的描述,其实我们可以看到pod里面的container其实就是docker容器。只不过多加了容器和容器之间的网络通讯和存储卷,不用把pod想的很复杂。