k8s:yaml文件详解和部署简单nginx

文章目录

  • 一、yaml文件详解
    • 1.yaml常见语法
      • 1) apiVersion
      • 2) kind
      • 3) metadata
      • 4) spec
      • 5) nodeName
      • 6) nodeSelector
      • 7) taint(污点)与tolerations(容忍)
    • 2.port详解
    • 3.Label与Selector
    • 4.kubectl create与apply区别
    • 5.Pod其他状态详细说明
    • 6.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 执行hook报错
ContainersNotInitialized 容器没有初始化完毕
ContainersNotRead 容器没有准备完毕
DockerDaemonNotReady docker还没有完全启动
NetworkPluginNotReady 网络插件还没有完全启动

6.k8s常用命令

二、创建应用

1、创建命名空间

kubectl create namespace test #创建一个名叫test的命名空间

2、编辑nginx-deployment.yaml文件
yaml转json的网站,用于验证yaml文件格式是否正确
https://www.json2yaml.com/convert-yaml-to-json

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: test
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              protocol: TCP
              containerPort: 80
          resources:
            limits:
              cpu: "1.0"
              memory: 512Mi
            requests:
              cpu: "0.5"
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  annotations:
  name: nginx-test-service
  namespace: test
spec:
  ports:
    - port: 80
      targetPort: 80
      nodePort: 32001
      protocol: TCP
  selector:
    app: nginx
  sessionAffinity: None
  type: NodePort

3、发布nginx的应用

kubectl create -f nginx-deployment.yaml

4、查看发布的pods

kubectl get pods -n test # -n :指定命名空间  -A:不指定,即所有的命名空间
kubectl get pods -n test -owide  # 部署节点的node详细信息

kubectl get pods,svc -n test -o wide
在这里插入图片描述
如上图:nginx的端口是32001,访问页面
k8s:yaml文件详解和部署简单nginx_第1张图片

你可能感兴趣的:(Docker,nginx,kubernetes,运维)