什么是Pod?

Pod是一组紧密关联的容器集合,也叫它容器组。它们共享PID、IPC、Network和UTS namspace,是kubernets调度的基础单元。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。一个pod运行多个容器,又叫边车模式(SideCar)

容器是一种资源隔离单位,比如隔离CPU、内存等,应用程序住在容器中,抽象特征:

1、容器就是应用+操作系统的封装,是一种资源隔离抽象
2、Pod是容器的包装,它是虚拟机抽象
3、K8S是管理Pod虚拟机的数据中心抽象

k8s对容器连接数限制 k8s容器组_docker


Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:

共享存储:称为卷(Volumes)
网络:每个 Pod在集群中有个唯一的 IP,container共享该IP地址
container(容器):例如容器的镜像版本,对外暴露的端口等

多容器

k8s对容器连接数限制 k8s容器组_容器_02


多容器Pod技术是为了屏蔽未来容器的变化,例如支持docker、containerd、rtk。

Pod创建流程

k8s对容器连接数限制 k8s容器组_kubernetes_03


流程说明:

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 是该节点的实际主机名