一、K8S配置清单作用

虽然使用kubectl或者dashboard都可以创建Pods,但在实际使用中基本都是使用yaml配置清单来对资源进行一个声明,然后K8S按照声明信息进行创建。对于K8S来说,它会将YAML配置清单中的内容自动转换成JSON格式,然后传送给API Server完成创建。

二、创建YAML配置清单的办法

1、导出已有的Pod为YAML格式

kubectl get deployment nginx-test -o yaml

2、使用dry-run干跑模式导出YAML

kubectl create deployment test --image=nginx:1.7.9 --dry-run -o yaml > nginx.yaml

三、K8S配置清单字段简介

1、一个最简单的配置清单示例:

vi pod-demo.yaml

kind: Pod

metadata:

name: pod-demo

namespace: default

spec"

containers:

name: adminbox

image: ikubernets/admin-box:v1.0

imagePullPolicy: IfNotPresent

command: ["/bin/bash","-c","sleep 3600"]

2、查看导出的deployment配置清单文件,主要有以下五个字段,而需要自己维护的实际只有4个字段:

kubectl get deployment nginx-test -o yaml

·apiserver:定义API组名和版本,如v1。

kubectl api-versions #查看K8S所支持API版本

·kind:定义资源类别,要创建的是POD就写为pod、Deployment、StatefulSet等

kubectl api-resources #查看K8S所有资源类型

·metadata:元数据信息,包含资源名称、namespace等。namespace用于给资源进行分类,默认会有一个default名称空间

kubectl get namespaces #查看namespace

kubectl create namespace myns #创建一个名为myns的namespace

·spec(核心):声明资源的属性状态,也就是说希望deployment是什么样的。它的属性通常应该和status字段一致

·status(核心):资源当前状态,应该与spec接近才对,本字段无需配置,由K8S集群维护。

由于5个字段各有自己的子字段,所以K8S提供了一个explain命令用于查看每个字段支持的子字段

kubectl explain pods.metadata #查看metadata下的子字段,如果带有required是必选字段

3、使用kubectl apply命令应用配置清单创建pod,使用kubectl get pods命令查看资源状态

kubectl apply -f pod-demo.yaml

kubectl get pods #查看容器是否运行,正常情况应该是Running

kubectl get pods -o wide #查看pod详细信息,包含了IP、所属Node等

kubectl get pods -n kube-system #显示指定namespace的pod

4、创建pod后正常状态应该是Running,如果是Error的话使用kubectl describe命令查看出错pod的详细信息

kubectl describe pods pod-demo

5、使用kubectl delete命令删除有问题的pod,然后重新apply配置清单

kubectl delete pods pod-demo

kubectl apply -f pod-demo.yaml

6、YAML文件经过应用后还会自动生成一些字段

四、K8S YAML应用示例

1、编写YAML文件定义容器

vi nginx-test.yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx

annotations: #描述信息,但和lable不同于它不能用于节点选择器,只作为元数据展示,使用kubectl describe时可以看到

linuxe.cn/created-by: "cluster admin"

namespace: web

labels:

app: nginx

version: 1.7.9

spec:

containers: #定义容器

- name: nginx #pod的名称,可以定义多个

image: nginx:1.7.9 #使用仓库的哪个镜像

imagePullPolicy: IfNotPresent #该字段不写的话默认为IfNotPresent,代表镜像不存在才会拉取,Always代表总会拉取。如果镜像使用latest也会去拉取

volumeMounts: #引用共享存储

- name: storage #共享存储名

mountPath: /tmp/storage #共享存储在容器中的路径

ports: #需要容器暴露的端口

- name: http

containerPort: 80 #需要暴露的容器端口,会随机在宿主机中生成一个端口作为映射

protocol: TCP

resources: # 容器资源限制,这里的值会决定服务质量QOS的类型

requests: # 容器请求的资源大小

cpu: 0.5 # 0.5代表500M

memory: 500M

limits: #容器最大能分配的资源,实际资源是在请求的资源和最大资源之间波动

cpu: 1

memory: 1000M

volumes:

- name: storage #定义存储名,上面有调用

emptyDir: {} #数据共享策略,EmptyDir是同Pod中所有容器数据共享,Pod删除后数据也会删除;HostPath是把数据存放在宿主机中共享,删除Pod数据还在;NFS则是网络存储

command: ["nginx"] #nginx镜像运行后所执行的命令,如果没写的话则是镜像默认命令

args: ["-s","reload"] #command命令接收的参数

#nodeSelector: #节点选择器,pod会创建在符合条件的node上,还有一种nodeName可以直接指定某个节点去创建pod而不需要条件。

restartPolicy: #容器停止运行时的重启策略,默认Always=容器一停就进行重启,不管是不是真的需要;OnFailure=容器错误退出就重启;Never=不重启

OnFailure

2、服务质量QOS

主要用于Pod调度和驱逐,优先级越低的QOS越容易被驱逐。不同QOS优先级不同,使用kubectl describe命令可以查看Qos Class:

· BestEffort:尽可能的为Pod分配资源,默认不进行requests设置就是该QOS,优先级最低

· Burstable:资源可波动,requests小于limit的值就是该QOS,推荐

· Guaranteed:完全可保障资源,必须使用requests和limit定义内存和CPU两项资源并且相等,优先级最高

3、设置驱逐指标与系统保留资源

vi /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--kube-reserved=cpu-200m,memory=500Mi --eviction-hard=memory.available<1Gi"

4、应用YAML文件创建资源

kubectl apply -f nginx-test.yaml

5、通过YAML文件删除资源

kubectl delete -f pod-test.yaml #删除YAML文件中定义的资源

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐