一、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 的内容是创建每个资源必填字段:

  1. apiVersion 创建资源使用的 api 版本号
  2. kind  要创建资源的类型,这里为pod
  3. metadata 创建资源的元数据,name 字段为必填字段
  4. sepc 该资源的规格说明
  5. 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 ~]# 

  

  总结一下:

  1. k8s 的资源有2种创建方式:命令行和配置文件,配置文件格式为YAML,日常使用都是配置文件方式创建
  2. POD 是 k8s 最小的调度单元,一个 POD 可以有多个 container,此处 container 对应docker的容器,pause container 是 pod 下的其他容器的父容器,每个 pod 都会有一个pause container
  3. 同一个POD下的所有container共享网络、环境变量、volume挂载等信息
  4. POD 是 k8s 抽象出来的一个概念,其实体化则为运行的一系列 container,后面的 Deployment 则是对 POD 的更上一层的抽象概念。

 

posted @ 2021-07-16 17:28  梦君子  阅读(392)  评论(0编辑  收藏  举报