什么是Pod?
Pod是一组紧密关联的容器集合,也叫它容器组。它们共享PID、IPC、Network和UTS namspace,是kubernets调度的基础单元。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。一个pod运行多个容器,又叫边车模式(SideCar)
容器是一种资源隔离单位,比如隔离CPU、内存等,应用程序住在容器中,抽象特征:
1、容器就是应用+操作系统的封装,是一种资源隔离抽象
2、Pod是容器的包装,它是虚拟机抽象
3、K8S是管理Pod虚拟机的数据中心抽象
Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:
共享存储:称为卷(Volumes)
网络:每个 Pod在集群中有个唯一的 IP,container共享该IP地址
container(容器):例如容器的镜像版本,对外暴露的端口等
多容器
多容器Pod技术是为了屏蔽未来容器的变化,例如支持docker、containerd、rtk。
Pod创建流程
流程说明:
1、kubectl命令工具向master节点的apiserver发起一个ReplicaSet请求,apiserver将该请求存放到etcd库里;
2、Controller Manager监听ReplicaSet的创建或修改的事件,事件触发后,Controller Manager会对比期望的集群状态与实际的集群状态,当发现不一致时,就创建新的预期的pod;
3、Scheduler当监听到创建pod的操作后,运行调度算法,选择合适的worker节点分配
4、由apiserver更新pod定义,并通知worker节点;
此时,pod还没有最终创建到worker节点,只是由master更新了pod和集群状态
5、kubelet接收到通知后,就会运行container runtime下载镜像,创建容器,最后由kubelet监控。
如何发布Pod?
1、
发布 : kubectl apply -f .
转发暴露pod:kubectl port-forward mysql 53306:3306
查看:kubectl get all、kubectl describe pod mysql
删除:kubectl delete po mysql
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
resources:
limits:
memory: "500Mi"
cpu: "500m"
env:
- name: MYSQL_ROOT_PASSWORD
value: root
- name: MYSQL_DATABASE
value: test
ports:
- containerPort: 53306
标签
解决问题:部署同一组件的多个副本、多个版本或不同运行环怎么区分
定义:键值对KEY=VALUE
特征:标记任何资源、资源内唯一、一个资源可以有多个标签、随时随地创建
作用:版本发布的切换、运行环境的切换、功能分层管理、金丝雀发布等
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
k8s.kuboard.cn/displayName: nginx gw on tencent cloud
labels:
k8s.kuboard.cn/layer: gateway #两个标签被附加到了pod
k8s.kuboard.cn/name: nginx
name: nginx
namespace: default
查看:kubectl get deployment --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS mongodb-deployment 1/1 1 1 21d app=mongodb nginx 3/3 3 3 25h k8s.kuboard.cn/layer=gateway,k8s.kuboard.cn/name=nginx nginx-deployment 2/2 2 2 21d app=nginx
再添加:kubectl get deployment -L run-env,run-version
NAME READY UP-TO-DATE AVAILABLE AGE RUN-ENV RUN-VERSION mongodb-deployment 1/1 1 1 21d nginx 3/3 3 3 25h local 1.0
筛选
kubectl get deployment -l run-env=local --show-labels
kubectl get deployment -l run-env=sit --show-labels
kubectl get deployment -l run-env!=sit --show-labels
kubectl get deployment -l run-env!=sit,run-version='1.0' --show-labels
调度pod到指定节点
随机调度、透明访问,是k8s的标准实现方式,但是在某些场景:有些worker是机械硬盘,有些是固态硬盘、有些提供GPU加速等等
GPU计算是使用GPU(图形处理单元)作为协处理器来加速CPU,以加快科学、分析、工程、消费和企业应用程序的运行速度
解决方案 是:
同过标签和标签选择器,对资源进行描述,以应对结点的需求。
apiVersion: v1
kind: Node
metadata:
annotations:
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: '0'
volumes.kubernetes.io/controller-managed-attach-detach: 'true'
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
gpu: 'true' # 在此处添加标签
kubernetes.io/arch: amd64
kubectl get nodes -l gpu='true' --show-labels
NAME STATUS ROLES AGE VERSION LABELS minikube Ready control-plane,master 22d v1.23.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gpu=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=minikube,kubernetes.io/os=linux,minikube.k8s.io/commit=362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7,minikube.k8s.io/name=minikube,minikube.k8s.io/primary=true,minikube.k8s.io/updated_at=2022_03_12T12_00_47_0700,minikube.k8s.io/version=v1.25.2,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
kubectl get nodes -l gpu!='true' --show-labels
No resources found
NAME STATUS ROLES AGE VERSION LABELS minikube Ready control-plane,master 22d v1.23.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gpu=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=minikube,kubernetes.io/os=linux,minikube.k8s.io/commit=362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7,minikube.k8s.io/name=minikube,minikube.k8s.io/primary=true,minikube.k8s.io/updated_at=2022_03_12T12_00_47_0700,minikube.k8s.io/version=v1.25.2,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
#kubernetes.io/hostname=minikube 是该节点的实际主机名