K8S是基于声明式API和资源对象进行交互的;为了便于管理,通过使用yaml文件对API
每个API对象都有三大类属性:1、元数据:metadata
2、规范:spec
3、状态:status
其中spec中可以定义期望状态,而实际状态是status
K8S创建POD并不是直接创建的,而是先创建一个POD 控制器,然后通过控制器来创建POD,由控制器来控制pod的生命周期
一、创建
1、 Deployment控制器的yaml文件,通过Deployment控制器来创建pod
kind: Deployment #资源类型是Deployment
apiVersion: apps/v1 #api版本,查询它的api版本kubectl explain deployment.apiVersion
metadata: #定义pod元数据信息,可查询它的下级子字段kubectl explain deployment.metadata
labels: #定义Deployment控制器的标签,可以给HPA控制器使用,它是对POD做控制伸缩的,HPA就是通过这个标签找到控制器,然后控制POD
app: nginx-deployment-label #标签名称以键值形式定义,可以定义多个,这里标签是app值是后面字符
name: nginx-deployment #deployment资源的名称
namespace: n90 #deployment所属的namespace,如果不写该字段默认是defaule
spec: #定义Deployment中容器详细信息,可通过kubectl explain查询
replicas: 1 #定义创建出pod的副本数,默认值是1个pod
selector: #定义标签选择器,跟上面的Deployment标签不是一回事,控制器通过标签选择器来到template模板中找符合标签的pod
matchLabels: #定义匹配的标签,必须要设置
app: nginx-selector #匹配的目标pod标签,控制器通过这个标签匹配下面的pod
template: #定义模板,用来描述需要创建的pod作用
metadata: #定义模板元数据
labels: #这个labels定义的下面的标签会继承给下面所有metadata模板中创建的pod
app: nginx-selector #这个标签会继承给下面的pod,与上面模板中matchLabels定义的标签一样
spec: #定义pod的详细信息
containers: #定义pod中容器列表,可以定义多个pod
- name: nginx-container #容器名称
image: nginx:laster #容器镜像
command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
imagePullPolicy: Always #镜像拉取策略
ports: #定义容器端口列表
- containerPort: 443 #定义一个端口
protocol: TCP #定义协议
name: http #端口名称
env: #给容器传递环境变量
- name: "password" #变量名称,必须引号引起来
value: "123" #上面变量的值
resources: #对资源的上下限值设置(一个是limits上限,一个是requests下限)
limits: #资源上限设置,不能超过资源上限
cpu: 500m #CPU限制,单位为core,可以写0.5或500m,一核CPU在K8S被拆分为1000m
memory: 2Gi #内存限制,单位可为Mib/Gib,不能
requests: #资源的下限设置,不能低于资源下限
cpu: 200m #cpu请求数,启动容器的最小CPU资源需求
memory: 512Mi #内存请求数,启动容器的最小的内存资源需求
2、service资源的yaml文件,通过service来代理pod,实现对外提供访问
kind: Service #类型为service
apiVersion: v1 #定义service API版本
metadata: #定义service元数据
lables: #定义标签
app: linux-nginx #定义service标签内容
name: #定义service名称,此名称会被DNS解析
namespace: n90 #定义service所在namespace,要跟Deployment控制器在同一个namespace里面
spec: #定义service详细信息
type: NodePort #service类型,一共有四种
ports: #定义访问端口,一个service可以定义多个端口的映射关系
- name: http #定义端口名称
port: 80 #定义service的端口,service端口可以跟pod,node端口都不一样,它是K8S中一个独立的子网
protocol: TCP #协议类型
targetPort: 80 #目标pod的端口,当访问宿主机的30001端口时就会转到这边pod的80端口
nodePort: 30001 #node节点暴露的端口,如果没写这个nodePort,那么创建service的时候会自动创建并随即分配端口
selector: #service的标签选择器,定义要访问的目标pod
app: linux-nginx #将流量路由到选择的podshang ,必须是Deployment.spec.selector.matchLabels
#service之所以知道把宿主机某某端口流量转发至对应pod的某个端口,之所以知道要转给哪些pod,是因为service的标签选择器
#只有带有app: linux-nginx标签的pod,service才会把流量转发过去
下面的443是service端口,30000是宿主机端口
查看下service后面有哪些pod
第一列是service的名字,NAME就是pod名称,ENDPOINTS是service的后端服务器,是通过service的标签选择器自动匹配的