pod概述
1)Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定镜像,用来运行具体的服务。Pod代表集群上正在运行的一个进程,一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程
2 )Deployment
Replicaset是Kubernetes中的副本控制器,管理Pod,使pod副本的数量始终维持在预设的个数。Deployment是管理Replicaset和Pod的副本控制器,Deployment可以管理多个Replicaset,是比Replicaset更高级的控制器,也即是说在创建Deployment的时候,会自动创建Replicaset,由Replicaset再创建Pod,Deployment能对Pod扩容、缩容、滚动更新和回滚、维持Pod数量。
3 )label
label是标签的意思,k8s中的资源对象大都可以打上标签,如Node、Pod、Service 等,一个资源可以绑定任意多个label,k8s 通过 Label 可实现多维度的资源分组管理,后续可通过 Label Selector 查询和筛选拥有某些 Label 的资源对象,例如创建一个 Pod,给定一个 Label是app=tomcat,那么service可以通过label selector选择拥有app=tomcat的pod,和其相关联,也可通过 app=tomcat 删除拥有该标签的 Pod 资源。
4 )service 在kubernetes中,Pod是有生命周期的,如果Pod重启IP很有可能会发生变化。如果我们的服务都是将Pod的IP地址写死,Pod的挂掉或者重启,和刚才重启的pod相关联的其他服务将会找不到它所关联的Pod,为了解决这个问题,在kubernetes中定义了service资源对象,Service 定义了一个服务访问的入口,客户端通过这个入口即可访问服务背后的应用集群实例,service是一组Pod的逻辑集合,这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现的。
pod创建过程
第一步: kubectl 向api server 发起一个create pod 请求 第二步: api server接收到pod创建请求后,不会去直接创建pod,而是生成一个包含创建信息的yaml。 第三步: apiserver 将刚才的yaml信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录, 还没有任何的实质性进展。 第四步: scheduler 查看 k8s api ,类似于通知机制。 首先判断:pod.spec.Node == null? 若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。 然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点) ps:同样上述操作的各种信息也要写到etcd数据库中中。 第五步: kubelet 通过监测etcd数据库(即不停地看etcd中的记录),发现api server 中有了个新的Node; 如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了); 则调用node中的docker api,创建container。
pod用法查看
帮助信息 kubectl expain 资源名称[.字段名] ---------------- 创建pod kubectl create -f ymal文件 ------------------ 查看pod kubectl get pod [-n 名称空间] kubectl get pod -o wide ------------------ 更新pod kubectl apply -f yaml文件 --------------- 删除pod kubectl delete pod pod名称 ------------------- 进入pod中的容器 kubectl exec -it pod名称 shell ------------------------ 查看pod中容器日志 kubectl logs pod名称 -c 容器名
yaml文件注意事项
大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 ”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略 在Kubernetes中,只需要知道Lists和Maps两种结构类型即可 ------------------ 列子:- apiVersion: v1 #pod属于k8s核心组v1 kind: Pod #创建的是一个Pod资源 metadata: #元数据 name: demo-pod #pod名字 namespace: default #pod所属的名称空间 labels: app: myapp #pod具有的标签 env: dev #pod具有的标签 spec: containers: #定义一个容器,容器是对象列表,下面可以有多个name - name: tomcat-pod-java #容器的名字 ports: - containerPort: 8080 image: tomcat:8.5-jre8-alpine #容器使用的镜像 imagePullPolicy: IfNotPresent --------------------- 列子:二 apiVersion: v1 kind: Service metadata: name: tomcat spec: type: NodePort ports: - port: 8080 nodePort: 30080 selector: app: myapp env: dev
namespace(命名空间)
查看命名空间
kubectl get namespace
创建命名空间
kubectl create namespace 名称
资源限制
解析:就是控制pod资源使用情况的 实列: kubectl autoscale deployment hpa-deploy --cpu-percent=50 --min=1 --max=10