k8s:基础内容

一、yaml文件详解

1.yaml常见语法

1) apiVersion

kubectl api-versions
  • v1:Kubernetes API的稳定版本,包含很多核心对象:pod、service等。

2) kind

kind指定这个资源对象的类型,如pod、deployment、statefulset、job、cronjob、Endpoints service

  • Endpoints :可以把外部的链接到k8s系统中
  • service:部署一个内部的IP,其他deployment可以链接
  • deployment:部署一个pod,内部只能链接service,无法互相连接。

3) metadata

metadata常用的配置项有name:显示的名字,namespace:归属的命名空间。

4) spec

一个嵌套字典与列表的配置项,也是主要的配置项,支持的子项非常多,根据资源对象的不同,子项会有不同的配置。
如一个pod的spec配置:

apiVersion: v1  	#必选 版本号
kind: Pod       	#必选
metadata:			#必选 元数据
  name: nginx		#必选 Pod名称
  labels:			#自定义标签
    app: nginx		#自定义标签名称
spec:				#必选 Pod中容器的详细定义
  containers:		#必选 Pod中容器列表,一个pod里会有多个容器
    - name:nginx 	#必选 容器名称
      image:nginx 	#必选 容器的镜像名称
      imagePullPolicy:IfNotPresent # [Always | Never | IfNotPresent] 获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像 
  	  ports: #需要暴露的端口库号列表
  	  - containerPort:80 # 容器需要监听的端口号
 restartPolicy: Always # [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod 

如一个service的spec配置:

apiVersion: v1  	#必选 版本号
kind: Service       #必选
metadata:			#必选 元数据
  name: service-hello		#必选 Pod名称
  labels:			#自定义标签
    name: service-hello #自定义标签名称
spec:				#必选 Pod中容器的详细定义
  type:	NodePort	#这里代表是NodePort类型的,另外还有ingress,LoadBalancer 
  ports: 
  - port:80 #这里的端口和clusterIP(kubectl describe service service-hello中的IP的port)对应,即在集群中所有机器上curl clusterIP:80可访问发布的应用服务
  	targetPort:8080 #端口一定要和contrainer暴露出来的端口对应,nodejs暴露出来的端口是8080
  	protocol: TCP
  	nodePort: 31111 #所有的节点都会开发此端口30000~32767,此端口供外部调用
  selector:
  	run:hello  #这里选择器一定要选择容器的标签

5) nodeName

nodeName用于将Pod调度到指定的Node名称上。

# SchedulePolicy-nodeName.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: busybox
  name: busyboxnn
  namespace: default
spec:
  nodeName: k8s-node1
  containers:
  - image: busybox
    name: bs
    command:
    - "ping"
    - "baidu.com"

6) nodeSelector

nodeSelector用于将Pod调度到匹配Label的Node上,先给规划node用途,然后打标签,例如将两台node划分给不同的团队使用:

$ kubectl label nodes k8s-node1 team=a
$ kubectl label nodes k8s-node2 team=b

7) taint(污点)与tolerations(容忍)

  • 污点:节点独占,例如具有特殊硬件设备的节点,如GPU
    设置污点的命令:kubectl taint node [node name] key=value[effect]
    去掉污点:kubectl taint node k8s-node1 abc=123:NoSchedule
    其中[effect]值为:
    NoSchedule :一定不能被调度。
    PreferNoSchedule:尽量不要调度。
    NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。
  • 再创建pod只有声明了容忍污点(tolerations),才允许被调度到abc=123污点节点上,如果不配置容忍污点,则永远不会调度到k8s-node1
  • master节点默认是打了污点标记,不调度的,去掉污点标记
#添加 尽量不调度 PreferNoSchedule 
kubectl taint nodes k8s-master node-role.kubernetes.io/master:PreferNoSchedule
#去除污点NoSchedule,最后一个"-"代表删除
kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-
# SchedulePolicy-tolerations.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: busybox
  name: busybox3
  namespace: default
spec:
  tolerations:
  - key: "abc"
    operator: "Equal"
    value: "123"
    effect: "NoSchedule"
  containers:
  - image: busybox
    name: bs
    command:
    - "ping"
    - "baidu.com"

2.port详解

  • port:是k8s集群内部访问service的端口,即通过clusterIP:port可以访问到某个service
  • nodePort:是外部访问k8s集群中service的端口,通过nodeIP:nodePort可以从外部访问到某个service。
  • targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器
  • containerPort:是pod的内部端口,targetPort映射到containerPort。

3.Label与Selector

1)Label是k8s系列中另外一个核心概念。是一组绑定到k8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一,label可以附加到各种资源对象上,如Node,Pod,Service,RC等。通过给指定的资源对象捆绑一个或多个不同的label来实现对维度的资源分组管理功能,以便于灵活,方便地进行资源分配、调度、配置、部署等管理工作

  • 版本标签:“release” : “stable” , “release” : “canary”…
  • 环境标签:“environment” : “dev” , “environment” : “production”
  • 架构标签:“tier” : “frontend” , “tier” : “backend” , “tier” : “middleware”
  • 分区标签:“partition” : “customerA” , “partition” : “customerB”…
  • 质量管控标签:“track” : “daily” , “track” : “weekly”

2)Selector
label selector是k8s核心分组机制,通过label selector客户端/用户能够识别一组有共同特征或属性的资源对象。符合这个标签的pod会做为这个service的backend。

apiVersion: v1
kind: Service
metadata:
  name: hello
  labels:
    app: hello
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: hello

4.kubectl create与apply区别

  1. kubectl create:可创建新资源,因此如果重复运行该命令,则会报错,因为资源名称在名称空间中是唯一的。
  2. kubectl apply:将配置应用于资源,如果资源不在,那么它将被创建。如果资源在,做更新操作。此命令可以多次运行,因为它只是应用于资源。

5.Pod其他状态详细说明

状态 描述
ContainerCreating 容器创建中
PodInitializing pod 初始化中
CrashLoopBackOff 容器曾经启动了,但可能又异常退出了,kubelet正在将它重启
InvalidImageName 无法解析镜像名称
ImageInspectError 无法校验镜像
ErrImageNeverPull 策略禁止拉取镜像
ImagePullBackOff 正在重试拉取
RegistryUnavailable 连接不到镜像中心
ErrImagePull 通用的拉取镜像出错
CreateContainerConfigError 不能创建kubelet使用的容器配置
CreateContainerError 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError 启动容器失败
PostStartHookError
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值