资源清单描述方法:
在k8s中,一般使用yaml格式的文件来创建符合我们预期的pod,这样的yaml文件,被称为资源清单
常用的字段有:
apiVersion
这里是指k8s api的版本,目前基本上是v1.可以用以下命令来查看所有的版本,由组名+版本号组成,group/version,如果group省略,则表示核心组的定义,创建任何资源时都需要定义大部分为v1,但v1不支持deployment,用扩展版/v1beta1可支持deployment。
# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
kind
这里指的是yaml文件定义的资源类型和角色,比如:Pod,ngress,Deployment,Service,Namespace等。
metadata
它包含了我们所定义的kind一些信息,namespace
name:
元数据对象的名字,比如pod的name。
namespace:
元数据对象的命名空间,由我们自身定义
Spec
详细定义对象,固定值就写Spec
containers:
list:这里是Spec对象的容器列表定义,是个列表
name:容器的名字
image:要用到的镜像名称
imagePullPolicy:定义镜像拉取策略,有Always(每次都尝试重新拉取镜像),Never(仅使用本地镜像),IfNotPresent(如果本地存在就使用本地镜像,本地不存在就拉取镜像)
command:容器启动的命令,使用数组可以指定多个,不指定则使用镜像打包时使用的
args:容器启动命令参数,
workDir:容器的工作目录
volumeMounts:容器内部的存储卷配置
name:指定可以被容器挂载的存储卷的名称
mountPath:指定可以被容器挂载的存储卷的路径
readOnly:设置存储卷路径的读写模式,true或false,默认为读
ports:指定容器需要使用到的端口列表
name:指定端口的名称
containerPort:指定容器要监听的端口号
hostPort:指定容器所在主机需要监听的端口(默认与containerPort相同)注意设置了 hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突
protocol:指定端口协议,支持tcp和udp,默认tcp
env:指定容器运行前需设的环境变量列表
name:指定环境变量的名称
value:指定环境变量的值
resources:指定资源限制和资源请求的值
limits:指定设置容器运行时资源的运行上限
cpu:cpu限制,单位为core数,将用于运行docker
memory:指定MEM内存的限制,单位为MiB,GiB
requests:容器启动和调度时的限制设置
cpu:cpu请求,容器启动时初始化可用的数量
memory:内存请求,单位为MiB,GiB
restartPolicy:
定义Pod的重启策略,可选值为Always(一旦终止运行,则无论容器时如何终止的,kubelet服务都将重启它),OnFailure(只有pod以非零退出码终止时,kubelet才会重启该容器),Never(Pod终止后,kubelet将退出码报告给Master,不会重启该Pod)
imagePullSecrets:
定义pull镜像时使用secret名称,以name:secretkey格式指定
hostNetwork:
定义是否使用主机网络模式,默认值为False,设置True表示使用宿主机网络,
编写一个简单的yaml文件,创建一个pod
编写文件
[root@k8s-master ~]# cat hello.yml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
spec:
containers:
- name: hello
image: daocloud.io/library/centos:7
command: ["/bin/echo","hello","world"]
查看
[root@k8s-master ~]# kubectl get pod pod-demo
NAME READY STATUS RESTARTS AGE
pod-demo 0/1 CrashLoopBackOff 51 2d19h
编写一个简单的yaml文件,创建一个namespace
编写文件
[root@k8s-master ~]# cat namespace.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-monitor
labels:
name: na-monitor
[root@k8s-master ~]# kubectl apply -f namespace.yaml
namespace/ns-monitor created
查看
[root@k8s-master ~]# kubectl get namespace | grep ns
ns-monitor Active 5m7s
编写一个简单的yaml文件,创建一个deployment
编写文件
[root@k8s-master ~]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-master ~]# cat nginx-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: daocloud.io/library/nginx
ports:
- containerPort: 80
查看
[root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 85s
编写一个简单的yaml文件,创建一个Service
编写文件
[root@k8s-master ~]# vim nginx-service.yaml
[root@k8s-master ~]# kubectl apply -f nginx-service.yaml
service/nginx-service created
[root@k8s-master ~]# cat nginx-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
查看
[root@k8s-master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 3d2h
nginx-service ClusterIP 10.1.162.240 <none> 80/TCP 60s
YAML资源限制
编写文件
[root@k8s-master ~]# vim pod-demo.yaml
[root@k8s-master ~]# cat pod-demo.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
apps: nginx
spec:
containers:
- name: nginx
image: daocloud.io/library/nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
[root@k8s-master ~]# kubectl apply -f pod-demo.yaml
pod/nginx-pod created
查看
[root@k8s-master ~]# kubectl get pod nginx-pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 50s