18-Pods
一、Pods
Pod是一组容器;这些容器共享存储、网络以及怎样运行这些容器的声明。Pod 中的内容总是并置的并且一同调度,在共享的上下文中运行。Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器,这些容器是相对紧密的耦合在一起的。
- 在Docker的世界中,容器 是最小的可控单元
- 在k8s的世界中,Pod 是最小的可控单元
-
Pod 包含 一个或多个容器
image.png
Pod.png
Pod(容器组)是一个k8s中一个抽象的概念,用于存放一组 Container (可包含一个或多个 Container 容器,即图上正方形),以及这些 Container 的一些共享资源
- 共享存储,称为卷(Volumes),上图紫色圆柱
- 网络,每个 Pod(容器组)在集群中有个唯一的IP,Pod (容器组)中的 Container(容器)共享该 IP 地址
- Container (容器) 的基本信息
二、Node
Pod(容器组)总是在 Node(节点)上运行。Node(节点)是kubernetes集群中的计算机,可以是虚拟机或物理机。每个Node都由 master 管理。一个Node可以有多个Pod,kubernetes master 会根据每个 Node 上可用资源的情况,自动调度 Pod 到最佳的 Node上
1、每个Node(节点)至少运行
- kubelet:负责 master 节点和worker节点之间通信的进程;管理 Pod 和 Pod内运行的Controller
- kube-Proxy:负责进行流量转发
-
容器运行环境(如:Docker)负责下载镜像、创建和运行容器等
Node.png - kubelet启动的pod每个都由ip,全集群任意位置均可访问
kubeadm init \
--apiserver-advertise-address=172.20.173.235 \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.169.0.0/16
- 注意:pod-cidr 与 service-cidr
- cidr 无类别域间路由(Classless Inter-Domain Routing、CIDR)
- 指定一个网络可达范围 Pod 的子网范围 + service 负载均衡网络的子网范围 + 本机ip的子网范围不能有重复域
- --apiserver-advertise-address=master节点 私有ip(不能随便写)
- --pod-network-cidr=192.169.0.0/16:设置 Pod 的 ip 范围(可以随便)
- --service-cidr=10.96.0.0/16 :设置 Service 的 ip 范围(可以随便写,不能与pod的ip有交集)
三、部署应用
1、创建一次部署工作,带有自愈机制
- 帮助命令
kubectl create --help
- 部署应用
kubectl create deployment 这次部署的名称 --image=nginx
kubectl create deployment my-nginx --image=nginx
-
这次部署最终在一个机器上有一个 Pod,这个Pod其实本质里面就是一个容器
-
部署应用,同时设置副本数
kubectl create deployment my-nginx --image=nginx --replicas=3
- 部署应用,同时设置端口
kubectl create deployment my-nginx --image=nginx --port=80
Department(部署)的意义
- 在 k8s中,通过发布 Department,可以创建应用程序(docker image)的实例(docker Container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元
- 在 k8s 集群中发布 Department 后,Department 将指示 k8s 如何创建和更新应用程序的实例,master 节点将应用程序实例调度到集群中的具体的worker节点上
- 创建应用程序实例后,kubernetes Deployment Controller 会持续监控这些实例。如果运行实例的worker 节点关机或删除,则kubernetes Department Controller 将在集群中资源最优的另一个worker节点上重新创建一个新的实例。这提供了一种自我修复机制来解决机器故障或维护问题
- Deployment 处于 master 节点上,通过发布 Deployment,master 节点会选择适合的 worker 节点创建 Container (图中正方体),Container会被包含在 Pod (蓝色圆圈)里 image.png
四、故障排除
1、显示资源列表
kubectl get 资源类型
kubectl get deployments
2、获取 Deployments 类型资源列表
image.png3、获取 Pod 类型资源列表
kubectl get pod
image.png
4、获取 node 类型资源列表
kubectl get node
image.png
5、获取 命名空间下的 类型资源列表
5.1、查看全部命名空间
kubectl get deployments -A
或
kubectl get deployment --all-namespaces
image.png
5.2、查看特定命名空间
kubectl get deployment -n default
image.png
6、不是所有资源都有命名空间
# 在命名空间里
kubectl api-resources --namespaced=true
# 不在命名空间里
kubectl api-resources --namespaced=false
7、显示有关资源的详细信息
kubectl describe pod my-nginx
或者
# 查看名称为 my-nginx 的 deployment 的信息
kubectl describe deployment my-nginx
8、查看 Pod 中的容器的打印日志
kubectl logs Pod名称
kubectl logs my-dep-5b7868d854-6j2zl
9、进入Pod
kubectl exec -it my-dep-5b7868d854-6j2zl /bin/bash
# v1.21.0 推荐使用下面命令
kubectl exec -it my-dep-5b7868d854-6j2zl -- /bin/bash
五、小结
kubectl create 资源 #创建任意资源
kubectl create deploy #创建部署,拥有【自愈功能】
kubectl run #只创建一个Pod,不具有 【自愈功能】
kubectl get 资源名(node/pod/deploy) -n xxx(指定名称空间,默认是default) #获取资源
kubectl describe 资源名(node/pod/deploy) xxx #描述某个资源的详细信息
kubectl logs 资源名 ##查看日志
kubectl exec -it pod名 -- 命令 #进pod并执行命令
kubectl delete 资源名(node/pod/deploy) xxx #删除资源