一、k8s入门系列----pod
一开始学习k8s的时候,好多文章一开始就讲很多抽象的概念,看了不知所云,借着对知识脉络整理的机会,梳理一下k8s的知识点,本系列先讲解实际的应用,再讲解相关理论知识,从实践来讲解理论知识,这样才能对理论知识理解的更加透彻。
这里使用的环境是基于kubespray 部署的 k8s 集群,三个节点即作为master也是node,kubespray部署k8s集群可以看上一篇博客:https://www.cnblogs.com/fenggq/p/15000696.html
集群信息如下,单节点也可以运行k8s:
[root@ylserver10686071 ~]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ylserver10686071 Ready master 4d v1.19.10 10.68.60.71 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14 ylserver10686072 Ready master 4d v1.19.10 10.68.60.72 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14 ylserver10686073 Ready master 4d v1.19.10 10.68.60.73 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://19.3.14 [root@ylserver10686071 ~]#
k8s最小的调度单元是pod,用命令行创建一个pod,镜像为 tomcat:8.0 ,名字为 tomcat:
kubectl run tomcat --image=tomcat:8.0
查看已经创建的pod:
[root@ylserver10686071 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE tomcat 1/1 Running 0 2m1s [root@ylserver10686071 ~]#
k8s创建资源有2种方式,一种是上面的命令行方式创建,另外一种是配置文件方式创建,文件格式为YAML。
编辑配置文件:
[root@ylserver10686071 ~]# cat pod.yml apiVersion: v1 kind: Pod metadata: name: app001 spec: containers: - name: tomcat image: tomcat:8.0
应用配置文件,生产一个新的pod,名称为 app001,镜像依然为 tomcat:8.0:
[root@ylserver10686071 ~]# kubectl apply -f pod.yml pod/app001 created [root@ylserver10686071 ~]#
查看创建好的pod ,使用参数 -o wide 可以看到详细的信息:
[root@ylserver10686071 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app001 1/1 Running 0 89s 10.233.75.45 ylserver10686071 <none> <none> tomcat 1/1 Running 0 8m51s 10.233.75.44 ylserver10686071 <none> <none> [root@ylserver10686071 ~]#
先来分析一下YAML内容,其中 1-3 的内容是创建每个资源必填字段:
- apiVersion 创建资源使用的 api 版本号
- kind 要创建资源的类型,这里为pod
- metadata 创建资源的元数据,name 字段为必填字段
- sepc 该资源的规格说明
- container 该资源的容器信息,包括容器名称,使用的镜像信息
看到container 就会产生一个疑问,pod是否就是docker的容器呢,实验验证一下:
[root@ylserver10686071 ~]# docker ps |grep `docker images|grep tomcat|grep 8.0|awk '{print $3}'` 7f822f0a8570 ef6a7c98d192 "catalina.sh run" About an hour ago Up About an hour k8s_tomcat_app001_default_b82f6db9-c527-4e25-adcd-9c00601626e7_0 6040cf5c1012 ef6a7c98d192 "catalina.sh run" 2 hours ago Up 2 hours k8s_tomcat_tomcat_default_adc9dbe5-ae26-4770-81dd-8d5d5ae02c94_0
通过镜像 tomcat:8.0 启动的容器有2个,刚好上面创建了2个pod,貌似是一一对应关系,回头看看YAML内容,发现 spec.containers 是一个数组,那继续给数组添加元素:
[root@ylserver10686071 ~]# cat pod2.yml apiVersion: v1 kind: Pod metadata: name: app002 spec: containers: - name: tomcat image: tomcat:8.0 - name: nginx image: nginx:1.21
先删除掉原来创建的pod,删除方式也是有2种,一种是通过命令行删除,一种是通过原来的配置文件删除:
[root@ylserver10686071 ~]# kubectl delete pod tomcat pod "tomcat" deleted [root@ylserver10686071 ~]# kubectl delete -f pod.yml pod "app001" deleted [root@ylserver10686071 ~]#
创建新pod app002:
[root@ylserver10686071 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app002 2/2 Running 0 9m53s 10.233.75.49 ylserver10686071 <none> <none> [root@ylserver10686071 ~]#
查看docker创建的容器:
[root@ylserver10686071 ~]# docker ps|grep app002 7b2817ef7392 4cdc5dd7eaad "/docker-entrypoint.…" 10 minutes ago Up 10 minutes k8s_nginx_app002_default_970ef684-8fae-40c2-a535-7c17a695b68c_0 89315eefde8e ef6a7c98d192 "catalina.sh run" 10 minutes ago Up 10 minutes k8s_tomcat_app002_default_970ef684-8fae-40c2-a535-7c17a695b68c_0 ca024d5975bd k8s.gcr.io/pause:3.3 "/pause" 10 minutes ago Up 10 minutes k8s_POD_app002_default_970ef684-8fae-40c2-a535-7c17a695b68c_0 [root@ylserver10686071 ~]#
可以看到pod app002创建了3个容器,其中pause容器在每个pod创建的时候都生成,可以理解为pod下其他容器的父容器,其作用更多是在其他容器异常退出时,可以回收僵尸进程,减少僵尸容器的产生,有兴趣的可以去了解一下。
这里可以清楚的看到一个pod下可以有多个容器,同一个pod下的容器共享网络、环境变量和volume挂载等信息,其原理可以参考docker link,接着试着请求一下pod 下2个容器接口:
curl http://10.233.75.49:8080 curl http://10.233.75.49
k8s 同 docker 一样也可以进入container 的shell模式:
[root@ylserver10686071 ~]# kubectl exec -it app002 -c tomcat -- sh # exit [root@ylserver10686071 ~]# kubectl exec -it app002 -c nginx -- sh # exit [root@ylserver10686071 ~]#
总结一下:
- k8s 的资源有2种创建方式:命令行和配置文件,配置文件格式为YAML,日常使用都是配置文件方式创建
- POD 是 k8s 最小的调度单元,一个 POD 可以有多个 container,此处 container 对应docker的容器,pause container 是 pod 下的其他容器的父容器,每个 pod 都会有一个pause container
- 同一个POD下的所有container共享网络、环境变量、volume挂载等信息
- POD 是 k8s 抽象出来的一个概念,其实体化则为运行的一系列 container,后面的 Deployment 则是对 POD 的更上一层的抽象概念。