目录
首先在/opt目录下创建 mkdir k8s-yaml
cd k8s-yaml/
yaml文件
1.deployment的部署方式
首先 kubectl explain deployment 获取它的类型kind和标签version
vim nginx-deploy.yaml
apiVersion: apps/v1
#定义api版本的标签
kind: Deployment
#定义资源的类型(kind的类型:deployment job ingress service deamonset)或者角色
metadata:
#定义创建资源的元数据信息,包括资源的名称(pod的名称)、命名空间、pod的标签
name: nginx1
#定义资源的名称
# namesapces: xy102
# 定义命名空间
labels:
app: nginx1
#定义标签名就是app=nginx1 注意:上下文要一致
spec:
#spec是用来配置deployment资源需要的参数属性(副本数、匹配的标签以及容器的重启策略)
#这里顶格写就属于全部配置
replicas: 3
#定义该资源pod的数量
selector:
matchLabels:
#selector定义标签的选择器 matchLabels:定义匹配的标签。注意:这里需要上下文保持一致
app: nginx1
#以下都是来定义容器和pod的元数据
template:
#template定义业务模版,deployment定义了3个副本,所有pod的属性都会和template的设置保持一致
metadata:
labels:
app: nginx1
#这里也需要和上下文保持一致
spec:
#这里的spec定义pod内的容器
containers:
- name: nginx
image: nginx:1.22
#这里就是--image=nginx:1.22,这里就是使用的镜像
ports:
- containerPort: 80
#如果nginx的端口是默认的就是80,这里ports可以不写,写了也无法改变容器内的端口。
#如果默认端口不是80,那就需要加上ports声明非默认端口。
#这里的端口就是dockerfile定义的镜像的端口
注:pod里面有容器,但是是镜像定义容器,所以pod不能改变镜像
执行命令:kubectl apply -f nginx-deploy.yaml 如果有配置修改之后重新运行就好了
如果是基于yaml文件定义的资源对象
删除命令:kubectl delete -f nginx-deploy.yaml
2.service的部署方式
首先 kubectl explain service 获取它的类型kind和标签version
vim nginx-service.yaml
apiVersion: v1
#先定义api的标签
kind: Service
metadata:
#定义service的名称和标签
name: nginx1-svc
#service的名称
labels:
app1: nginx1
#service的标签
spec:
#定义service的资源参数(端口映射、service类型、匹配的标签名)
type: NodePort
ports:
- port: 80
#这里是定义service的端口
targetPort: 80
#这里是容器内的端口
nodePort: 30001
selector:
app: nginx1
#匹配标签名
执行命令:kubectl apply -f nginx-service.yaml
删除命令:kubectl delete -f nginx-service.yaml
此时就能对外访问了 访问master本机ip地址和30001即可
3.pod的部署方式
首先 kubectl explain pod 获取它的类型kind和标签version
vim nginx-pod.yaml
apiVersion: v1
#定义api版本的标签
kind: Pod
#定义资源的类型
metadata:
#定义创建资源的元数据信息
name: nginx-pod
labels:
app: nginx-pod
spec:
#声明容器的参数
containers:
- name: nginx
image: nginx:1.22
ports:
- containerPort: 80
#容器的端口
hostPort: 80
#主机端口,直接让主机端口和容器端口做映射(只能在yaml文件当中表示)
#如果这里做了hostport就不需要做service的端口映射
执行命令:kubectl apply -f nginx-pod.yaml
删除命令:kubectl delete -f nginx-pod.yaml
kubectl get pod -o wide 查看pod的部署在哪个节点上
因为hostport对应的是主机端口只是一个,所以对外访问的是这个node节点的本机ip地址
另外,用了hostport是不能轮询的
导出模版
kubectl create deployment nginx-de --image=nginx:1.22 --replicas=3
kubectl get deployment.apps nginx-de -o yaml > /opt/nginx-de.yaml
容器的重启策略和传参
重启的策略
restartPolicy 重启策略:作用就是来声明如果容器遇到问题,它的重启策略是什么
重启的策略有三种
1.Always
表示只要启动失败就会一直重启 指定是容器
以pod为例写一个失败的例子,重启策略应该写在容器里面(就是restartPolicy写在spec下面)
apiVersion: v1
kind: Pod
metadata:
name: centos-pod
labels:
app: centos-pod
spec:
containers:
- name: centos
image: centos:7
restartPolicy: Always
执行 : kubectl apply -f centos-pod.yaml
此时就会出现completed,completed也就是运行过了结束了,然后退出了。
然后过一会就会出现报错
出现了CrashLoopBackOff 就表示容器启动失败
然后 kubectl describe pod centos-pod 查看详情,就会发现它重启次数是三,但是它一会又出现completed,所以always是三次为一停,过一会又重新启动,但是它的状态最后一直会保持CrashLoopBackOff表示启动失败
2.Never
表示从不重启 docker的默认模式是never
3.OnFailure
表示只有容器异常退出时才会重启 ,也就是返回码非0时才会对容器进行重启
总结
如果是deployment,那么容器的重启策略只能写Always,它默认就是Always,可以不写。
基于pod的yaml文件,三种重启策略都可以写。
传参
pod内的传参:command和args
在yaml文件当中command和args只能存在一个。args可以给command传参。
写法一:
执行:kubectl apply -f centos-pod.yaml
如果报以下的错误,可以添加 --force 强制执行
注:只有pod的yaml会有这种重复,就是提示有内容没有发生变化,所以需要加 --force强制执行。
写法二:
执行多个命令:
注:/bin/bash 多个命令必须要加/bin/bash
-c指定输出命令的格式
执行多个命令时必须要加/bin/bash 和 -c
args给command传参
kubectl logs -f centos-pod
总结
command和agrs如果不需要传参只能存在一个,不论是args还是command都会覆盖容器的标准输出(cmd和entrypoint)