什么是Pod?
Pod是一组紧密关联的容器集合,也叫它容器组。它们共享PID、IPC、Network和UTS namspace,是kubernets调度的基础单元。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。一个pod运行多个容器,又叫边车模式(SideCar)
容器是一种资源隔离单位,比如隔离CPU、内存等,应用程序住在容器中,抽象特征:
1、容器就是应用+操作系统的封装,是一种资源隔离抽象
2、Pod是容器的包装,它是虚拟机抽象
3、K8S是管理Pod虚拟机的数据中心抽象
Pod是k8s中的最小调度单元,一个Pod可以包含一个或多个容器,同一Pod内的容器共享存储卷和网络空间。
共享存储:称为卷Volumes;
网络:每个 Pod在集群中有个唯一的 IP,container共享该IP地址;
container(容器):例如容器的镜像版本,对外暴露的端口等;
Pod创建流程
K8s通过watch的机制进行每个组件的协作:
1、用户使用kubectl create或apply yaml文件创建pod,请求发送到apiseerver,apiserver将yaml中的属性信息(metadata)写入etcd;
2、apiserver触发watch机制准备创建pod,转发给scheduler,使用调度算法选择worker节点,返回绑定的node信息给apiserver写入etcd;
3、apiserver又通过watch机制调用kubelet,按照pod信息触发docker run命令创建容器;
4、pod创建完成之后经由kubelet将pod的信息发送给apiserver,最后写入etcd(kubectl get pods命令调用etcd的信息);
如何发布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 是该节点的实际主机名