第9节 Pod


❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.topopen in new window


[TOC]

理解Pod

什么是pod?

img

pod是运行中的一组容器,pod是kubernetes中应用的最小单位。

什么是CRI?(container runtime interface)

或许你可以理解是docker,CRI就是容器运行时的环境。我们开发的应用就能以容器化的方式运行~

提示

💡 那么k8s为了管理方便,又封装了pod,所以说pod是容器运行的最小单位~

  • 每一个容器封装成一个pod
  • 每个pod可能有一个或者多个容器,但是也称之为一组容器

pod是可以有多个容器的,而且组成原子,这个是和容器的区别~

⚡ 描述某一个pod是如何运行的

kubectl describe pod my-nginx-7fb96c846b-m9rjp
展开查看详情💡
[root@k8s-master03 ~]# kubectl get pod
NAME                        READY   STATUS    RESTARTS      AGE
my-nginx-7fb96c846b-cnhbz   1/1     Running   2 (92m ago)   38h
my-nginx-7fb96c846b-g55km   1/1     Running   2 (92m ago)   38h
my-nginx-7fb96c846b-m9rjp   1/1     Running   2 (92m ago)   38h
[root@k8s-master03 ~]# kubectl describe pod my-nginx-7fb96c846b-m9rjp
Name:             my-nginx-7fb96c846b-m9rjp
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-master03/192.168.0.4
Start Time:       Thu, 20 Oct 2022 22:05:22 +0800
Labels:           app=nginx
                  pod-template-hash=7fb96c846b
Annotations:      cni.projectcalico.org/containerID: 66626e89ebcb580eeef3f2e75d7d860fe14ee213458642f7b25a860e164ea9a3
                  cni.projectcalico.org/podIP: 100.66.195.18/32
                  cni.projectcalico.org/podIPs: 100.66.195.18/32
Status:           Running
IP:               100.66.195.18
IPs:
  IP:           100.66.195.18
Controlled By:  ReplicaSet/my-nginx-7fb96c846b
Containers:
  nginx:
    Container ID:   containerd://85c401a1bca6531519ad09b539ee57bb2b508b370d71053926a1df0b5421597e
    Image:          nginx:1.14.2
    Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sat, 22 Oct 2022 11:27:59 +0800
    Last State:     Terminated
      Reason:       Unknown
      Exit Code:    255
      Started:      Fri, 21 Oct 2022 11:10:13 +0800
      Finished:     Sat, 22 Oct 2022 11:27:01 +0800
    Ready:          True
    Restart Count:  2
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-x77br (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-x77br:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>

我们只要看Events就好了~

可以查看状态和原因,可以去排查事故原因

删除pod

由于k8s的概念很多,删除需要指定概念

  • 指定命名空间,不指定是默认
  • 指定删除pod
kubectl delete pod mypodName -n xxxNamespace

管理对象的两种方式

命令行指令

使用 kubectl 命令来创建和管理 kubernetes 对象

简单、高效快速但是功能有限,操作不容易追溯,多用于开发和调试。

声明式配置

kubernetes 使用 yaml 文件来描述 kubernetes 对象

声明式配置就好比申请表,学习难度大而且配置麻烦

好处是操作留痕迹,适合操作复杂的对象,多用于生产

yaml 语法

  • 缩进代表上下级关系
  • 缩进时使用空格,不要使用tab,通常使用2个空格
  • 使用双引号,不要使用单引号
  • : 键值对的分隔符,前面不要有空格,后面要有空格
  • - 数组的分隔符,前后都要有空格
  • # 注释,后面要有空格
  • | 多行文本,后面要有空格,后面可以有换行
  • > 多行文本,后面要有空格
  • --- yaml文件的分隔符,前后都要有空格

配置对象

在创建 Kubernetes 对象所对应的 yaml 文件中,需要配置的字段:

  • apiVersion :Kubernetes API 版本
  • Kind :对象类别,例如 PodDeployment
  • metadata :描述对象的元数据,包括一个 name 字符串、UID 和 可选的namespace
  • spec :对象的配置

配置文件创建pod

我们或许可以用配置文件的方式去创建一个pod~

[root@k8s-master01 ~]# vim pod.yaml 
[root@k8s-master01 ~]# kubectl apply -f pod.yaml 

yaml创建pod格式

apiVersion: v1
kind: Pod  # 资源类型
metadata:  
  labels:
    run: myapp
  name: myapp  # pod名称
spec: # pod详细配置信息
  containers: # 启动一个容器
  - image: nginx # 启动nginx
    name: mynginx
  - image: tomcat:8.5.68
    name: mytomcat
  - image: redis
    name: myredis

image-20221022153945150

可能会出现pod状态处于ContainerCreating的情况,常见的原因之一是镜像拉取失败。

💡容器的创建详情查看如下:

kubectl describe pod mynginx
⚡ 展开查看详情
[root@k8s-master01 ~]# kubectl describe pod mynginx
Name:             mynginx
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-master03/192.168.0.4
Start Time:       Sat, 22 Oct 2022 13:20:17 +0800
Labels:           run=mynginx
Annotations:      cni.projectcalico.org/containerID: 9fc6db4dd24c4816b28be43c1f2907c89adea8fadb36fb49844fea42142671e7
                  cni.projectcalico.org/podIP: 100.66.195.25/32
                  cni.projectcalico.org/podIPs: 100.66.195.25/32
Status:           Running
IP:               100.66.195.25
IPs:
  IP:  100.66.195.25
Containers:
  mynginx:
    Container ID:   containerd://69b25d59d551f94e8f7cc659ef3b740765e23673b60f45de7353cfbc13d52420
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:5ffb682b98b0362b66754387e86b0cd31a5cb7123e49e7f6f6617690900d20b2
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sat, 22 Oct 2022 13:21:13 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-m6rqn (ro)
  myredis:
    Container ID:   containerd://e72e35e2f7dda8d6108a89e98c41da32b4678eab31cf26c8406eeaee5e3ecc3c
    Image:          redis
    Image ID:       docker.io/library/redis@sha256:c95835a74c37b3a784fb55f7b2c211bd20c650d5e55dae422c3caa9c01eb39fa
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sat, 22 Oct 2022 13:21:47 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-m6rqn (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-m6rqn:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  113s  default-scheduler  Successfully assigned default/mynginx to k8s-master03
  Normal  Pulling    112s  kubelet            Pulling image "nginx"
  Normal  Pulled     58s   kubelet            Successfully pulled image "nginx" in 54.707721222s
  Normal  Created    57s   kubelet            Created container mynginx
  Normal  Started    57s   kubelet            Started container mynginx
  Normal  Pulling    57s   kubelet            Pulling image "redis"
  Normal  Pulled     23s   kubelet            Successfully pulled image "redis" in 33.819467112s
  Normal  Created    23s   kubelet            Created container myredis
  Normal  Started    23s   kubelet            Started container myredis

image-20221022132504701

可视化界面创建pod

注意

这个板块待补充~ 欢迎pr

pod日志

好像只有pod有日志把?

和docker的日志一样用法

我们查看pod日志:

kubectl logs mynginx

image-20221022133031267

⚡ 可以加上 -f 追踪式日志

kubectl logs -f  mynginx

image-20221022133159587

pod - IP

⚡ 每个pod – k8s都会分配一个ip,使用下面命令查看:

kubectl get pod -owide

image-20221022150442624

进入pod并修改pod

🗓️ 回忆我们docker修改容器内部

docker exec -it idName #/bin/bash

使用K8s进入pod命令:

和docker命令大致一样,注意后面有

kubectl exec -it mynginx -- /bin/bash

image-20221022151001187

可视化界面

可以直接进去k8s的可视化界面进行修改~

多容器pod细节

提醒⚠️

Kubernetes中部署应用时,都是以pod进行调度的,它们基本上是单个容器的包装或房子。从某种意义上说,容器的容器。 pod是一个逻辑包装实体,用于在K8s集群上执行容器。可以把每个pod想象成一个透明的包装,为容器提供一个插槽。podKubernetes最小的可部署单位。pod是一组一个或多个容器,具有共享的存储/网络资源,以及如何运行容器的规范。因此,最简单地说,pod是一个容器如何在Kubernetes中“用起来”的机制。

  • pod是k8s的最小单元,容器包含在pod中,一个pod中有一个pause容器和若干个业务容器,而容器是单独的一个容器,简而言之,pod是一组容器的集合。

  • pod相当于逻辑主机,每个pod都有自己的ip地址

  • pod内的容器共享相同的ip和端口

  • 默认情况下,每个容器的文件系统与其他容器完全隔离

  • pod是一组容器,一个pod也是可以部署两个甚至是多个容器

更多命令

更多命令:

# 查看全部
kubectl get all

# 重新部署
kubectl rollout restart deployment test-k8s

# 命令修改镜像,--record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record

# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
kubectl rollout pause deployment test-k8s

# 恢复
kubectl rollout resume deployment test-k8s

# 输出到文件
kubectl get deployment test-k8s -o yaml >> app2.yaml

# 删除全部资源
kubectl delete all --all
遗留问题:
  • 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod
  • 访问还需要端口转发
  • Pod 重创后 IP 变了,名字也变了

END 链接