K8s使用YAML文件创建资源

由于K8s技术的火爆,导致现在大大小小的企业都在使用,虽然没有普及,但本人相信时迟早的事情,所以抓紧时间多学习一下吧!

在K8s中创建资源的方式有两种:命令行和YAML文件,本次博文主要介绍使用YAML文件的方式,如需使用命令行创建资源请参考K8s资源对象的基本管理

Kubernetes中的YAML文件与配置清单是一样的,根据个人习惯。本次博文统称为YAML文件!

一、YAML文件基础

YAML是专门用来配置文件的语言,非常简洁和强大。与了解的properties、XML、json等数据格式,习惯之后就会发现越来越好用。其实YAML就是结合了大部分的标记语言的特性,整合新开发的。

YAML文件的特点:

  • 层次分明、结构清晰;
  • 使用简单、上手容易;
  • 功能强大、语义丰富;
    需要特别注意的是:
  • 大小写敏感;
  • 严格要求缩进;

二、YAML文件使用

1)YAML文件的组成

Kubernetes中的YAML文件主要由五个一级字段组成,分别是:

  • apiVersion:api版本信息;
  • kind:指定创建资源对象的类型;
  • metadata:元数据内部的嵌套字段,定义了资源对象的名称、名称空间等;
  • spec:规范定义资源应该拥有什么样的特性,依靠控制器确保性能可以满足,满足用户期望的状态。
  • status:显示资源的当前状态,K8s就是确保当前状态向目标状态无限靠近从而满足用户期望。代表资源当前的状态;

2)获取编写YAML文件的帮助

虽然知道了YAML文件中的一级字段都是什么,但是还是不知道应该怎么写。可以借助以下命令来获取一些帮助信息。

[[email protected] ~]# kubectl api-versions
//获取当前集群支持的 apiserver版本
[[email protected] ~]# kubectl api-resources
//获取全部的api资源对象
[[email protected] ~]# kubectl explain deployment
//查看k8s某个对象的配置清单格式,应该包含哪些字段及使用方法
[[email protected] ~]# kubectl explain deployment.spec
//这个命令是非常重要的,它可以一级一级来获取帮助

3)YAML文件的基本格式

[[email protected] ~]# cat web.yaml
kind: Deployment                    //指定要创建的资源对象
apiVersion: extensions/v1beta1        //指定deployment所对应的API版本信息
metadata:
  name: web                  //定义deployment的名称
spec:
  replicas: 2                  //指定副本数量
  template:
    metadata:
      labels:                        //指定pod的标签
        app: web_server
    spec:
      containers:
      - name: nginx           //指定pod运行的容器的名称
        image: nginx          //指定运行容器所需的镜像

4)apply创建或更新

[[email protected] ~]# kubectl apply -f web.yaml
//使用“-f”来指定yaml文件,根据yaml文件中定义的内容生成所需的资源

apply可以指定多次,如果发现文件不同,则更新

5)delete删除

[[email protected] ~]# kubectl delete -f web.yaml
//删除yaml文件中定义的资源

6)验证

[[email protected] ~]# kubectl get deployments. web
//查看web控制器所产生的pod
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    2/2     2            2           5m50s
[[email protected] ~]# kubectl describe deployments. web
//查看web控制器的详细信息

返回的结果如下:

这样一来,Kubernetes已经根据YAML文件生成了我们所需的pod资源!

[[email protected] ~]# kubectl get pod -o wide          //查看pod的详细信息
NAME                  READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
web-d6ff6c799-7jtvd   1/1     Running   0          17m   10.244.2.2   node02   <none>           <none>
web-d6ff6c799-7tpdc   1/1     Running   0          17m   10.244.1.2   node01   <none>           <none>

K8s集群内部测试访问:

三、创建YAML文件使K8s中pod的服务能够被外部访问

[[email protected] ~]# cat web-svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: web-svc
spec:
  type: NodePort           //指定类型为NodePort,可以让外部访问,否则默认情况下是cluster IP,仅限集群内部访问
  selector:
    app: web_server             //必须与deployment资源对象的标签进行关联
  ports:
  - protocol: TCP
    port: 80                          //指定要映射到的Cluster  IP的端口
    targetPort: 80                //指定的是要映射pod中的端口
    nodePort: 31000           //指定映射到宿主机的端口,范围是30000~32767
[[email protected] ~]# kubectl apply -f web-svc.yaml
//生成service的控制文件(yaml中已经定义其名称为web-svc)
[[email protected] ~]# kubectl get svc web-svc     //查看service控制器
NAME      TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
web-svc   NodePort   10.99.32.22   <none>        80:31000/TCP   12m
//TYPE:为NodePort,可以使外部访问;
//PORT:映射出的端口与我们定义的一样

测试访问:

注意:是访问群集中任意节点都可以访问k8s集群中pod所提供的服务!

四、底层负载均衡实现原理

[[email protected] ~]# kubectl describe svc web-svc
//查看service的详细信息

返回的信息如下:

既然说到,Endpoints指定的是后端pod的IP地址,那么下面进行验证:

[[email protected] ~]# kubectl get pod -o wide | awk ‘{print $6}‘
//提取后端pod的IP地址
IP
10.244.2.2
10.244.1.2
//与上述查询的结果一样!

我们知道service是有负载均衡的能力,那么是怎么实现的?

其实,背后的原理并没有那么高大上,kube-proxy通过iptables的转发机制来实现负载均衡的效果的,先定义目标IP是service提供的群集IP,然后使用“-j”选项转发到其他iptables规则,接下来验证一下:

[[email protected] ~]# kubectl get svc web-svc | awk ‘{print $3}‘
//首先查看service的群集IP地址
CLUSTER-IP
10.99.32.22
[[email protected] ~]# iptables-save | grep 10.99.32.22
//查看iptables规则中与群集IP地址相关的内容
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.99.32.22/32 -p tcp -m comment --comment "default/web-svc: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.99.32.22/32 -p tcp -m comment --comment "default/web-svc: cluster IP" -m tcp --dport 80 -j KUBE-SVC-3RBUQ3B6P3MTQ3S7
从上述结果中可以看出,当目标地址是群集IP时,就会转发到KUBE-SVC-3RBUQ3B6P3MTQ3S7规则中
[[email protected] ~]# iptables-save | grep KUBE-SVC-3RBUQ3B6P3MTQ3S7
:KUBE-SVC-3RBUQ3B6P3MTQ3S7 - [0:0]
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/web-svc:" -m tcp --dport 31000 -j KUBE-SVC-3RBUQ3B6P3MTQ3S7
-A KUBE-SERVICES -d 10.99.32.22/32 -p tcp -m comment --comment "default/web-svc: cluster IP" -m tcp --dport 80 -j KUBE-SVC-3RBUQ3B6P3MTQ3S7
-A KUBE-SVC-3RBUQ3B6P3MTQ3S7 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-E3SP5QDRAUFB55IC
-A KUBE-SVC-3RBUQ3B6P3MTQ3S7 -j KUBE-SEP-3T3LUFAKMOTS5BKN
//从查询结果中可以看出其负载均衡的效果,因为后端只创建了两个pod,所以其概率为0.5

有关K8s的详细介绍还是建议参考K8s中文文档

————————本文到此为止,感谢阅读————————

原文地址:https://blog.51cto.com/14157628/2464964

时间: 2024-08-30 05:23:11

K8s使用YAML文件创建资源的相关文章

K8S 通过 yaml 文件创建资源

创建 pod cd ~ vi pod-demo.yaml # 内容如下 apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: ikubernetes/myapp:v1 - name: busybox image: busybox:latest command: - "/

k8s之yaml详解

k8s之yaml详解 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: web04-pod #资源的名字,在同一个namespace中必须唯一 labels: #设定资源的标签 k8s-app: apache version: v1 kubernetes.io/cluster-service: "true" annotations: #自

k8s之yaml文件基本格式及底层负载均衡实现原理

本文只是自己的精简后的总结,若需要详细的资料,请绕步. 注:yaml文件严格要求缩进,默认不同层次等级是两个空格的缩进. 1.使用httpd镜像创建一个Deployment资源对象 [[email protected] ~]# vim lvjianzhao.yaml #编写yaml文件 kind: Deployment #指定要创建的资源对象类型 apiVersion: extensions/v1beta1 #指定deployment所对应的API版本 metadata: name: lvjia

k8s的yaml说明

k8s yaml # yaml格式的pod定义文件完整内容: apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,Pod metadata: #必选,元数据 name: string #必选,Pod名称 namespace: string #必选,Pod所属的命名空间 labels: #自定义标签 - name: string #自定义标签名字 annotations: #自定义注释列表 - name: string spec: #必选,Pod中容器的详细定义 c

k8s的 Job/CronJob资源对象及添加api版本

Job资源对象 服务类的Pod容器:RC.RS.DS.Deployment 工作类的Pod容器:Job--->执行一次,或者批量执行处理程序,完成之后退出容器. 注意: 如果容器内执行任务有误,会根据容器的重启策略操作容器,不过这里的容器重启策略只能是: Never和 OnFailure. 概念 在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了.在这种场景下,创建pod就显得不那么合适.于是就是了Job,Job指的就是那些一次性任务.通过Job运行一

K8s之YAML文件

Kubernetes支持YAML和JSON格式创建资源对象 1,JSON格式用于接口之间消息的传递2,YAML格式用于配置和管理3,YAML是一种简洁的非标记性语言 语法格式: 缩进标识层级关系不支持制表符(tab)缩进,使用空格缩进通常开头缩进两个空格字符后缩进一个空格,如冒号,逗号等"---"表示YAML格式,一个文件的开始"#"表示注释 `查看应用名称` [[email protected] ~]# kubectl api-versions admission

.net core i上 K8S(三)Yaml文件运行.netcore程序

上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以去网上搜一下示例. apiVersion: apps/v1beta2 #指定版本,支持的版本可以通过kubectl api-versions查询 kind: Deployment #指定类型,这一次我们要创建一个Deployment metadata: #元数据 name: cys-netcore #de

k8s Metrics Server 获取资源指标与 hpa 部署

使用 helm 部署 Metrics Server helm repo add bitnami https://charts.bitnami.com/bitnami helm install bitnami/metrics-server 会有报错,执行以下命令 helm upgrade loopy-saola bitnami/metrics-server --set apiService.create=true $ kubectl get pod 查看节点 loopy-saola-metrics

k8s中node节点资源不足

节点资源耗尽状态 1.查看节点组件的状态 2.查看节点上pod的状态 查看日志内容发现如下内容: 1.Node emay-CMPP01 status is now: NodeHasDiskPressure 2.Warning: "EvictionThresholdMet Attempting to reclaim nodefs" 从以上内容大致可以判断出node3处于磁盘空间不足的状态下,并且该node上的kubelet daemon判断达到了Eviction阀值,试图回收磁盘空间(通