第9节 Pod
❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.top
[TOC]
理解Pod
什么是pod?
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
:对象类别,例如Pod
、Deployment
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
可能会出现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
可视化界面创建pod
注意
这个板块待补充~ 欢迎pr
pod日志
好像只有pod有日志把?
和docker的日志一样用法
我们查看pod日志:
kubectl logs mynginx
⚡ 可以加上 -f
追踪式日志
kubectl logs -f mynginx
pod - IP
⚡ 每个pod – k8s都会分配一个ip,使用下面命令查看:
kubectl get pod -owide
进入pod并修改pod
🗓️ 回忆我们docker修改容器内部
docker exec -it idName #/bin/bash
使用K8s进入pod命令:
和docker命令大致一样,注意后面有
–
kubectl exec -it mynginx -- /bin/bash
可视化界面
可以直接进去k8s的可视化界面进行修改~
多容器pod细节
提醒⚠️
在Kubernetes
中部署应用时,都是以pod
进行调度的,它们基本上是单个容器的包装或房子。从某种意义上说,容器的容器。 pod
是一个逻辑包装实体,用于在K8s
集群上执行容器。可以把每个pod
想象成一个透明的包装,为容器提供一个插槽。pod
是Kubernetes
最小的可部署单位。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 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©