声明式管理方法
- 适合于对资源的修改操作
- 声明式资源管理方法依赖于资源配置清单文件对资源进行管理。资源配置清单文件有两种格式:
- yaml(人性化,易读)
- json(易于api接口解析)
- 对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
- 语法格式:
kubectl create/apply/delete -f xxxx.yaml
资源配置清单的管理
资源清单的编写管理,都是基于yaml编写的格式,yaml文件的编写,在Docker-compose - 掘金 (juejin.cn)文章中已讲述过。
查看资源配置清单
查看资源配置清单:kubectl get deployment nginx -o yaml
解释资源配置清单
解释资源配置清单:kubectl explain 资源类型.一级字段.二级字段.三级字段...
修改资源配置清单并应用
离线修改
修改yaml文件,并用kubectl apply -f xxxx.yaml 文件使之生效
注意:当apply不生效时,先使用delete清除资源,再apply创建资源
离线修改的操作过程
- 首先将配置资源导入通过重定向符号导入到yaml文件中
- 通过vim编辑器进行yaml配置文件,删除多余的选项,修改配置项,进行保存
- 通过apply -f 该yaml 文件 或者是先删再创的方法来实现声明式离线修改资源清单的配置
create与apply的区别:
- create和apply都能运用于资源模板的创建,但是create创建资源模板属于固定式的资源配置,一旦创建,后期想要修改时,就只能通过先delete删除资源模板,再进行create创建,达到资源更新的效果。
- 而apply属于一种实时更新使用的创建模板方式,后期对资源模板的配置文件进行修改时,只需要先修改配置文件,再使用apply -f 指定配置文件即可。
- 但是apply并不是什么情况下都能生效使用。如果你发现配置并不生效,而且与书写格式无关,则可以先delete -f 该配置文件,再create -f 该配置文件
kubectl get service nginx-service -o yaml > nginx-svc.yaml
vim nginx-svc.yaml #修改port:8080
kubectl delete -f nginx-svc.yaml #删除yaml文件
kubectl apply -f nginx-svc.yaml #应用yaml文件
kubectl get svc
在线修改
直接使用kubectl edit service nginx-service
在线编辑资源配置清单并保存退出即时生效( 如port: 9090)
此修改方式不会对yaml文件内容修改。
但有些配置通过edit修改不会生效,还是得用离线修改。
因为这属于在线编辑,直接在原配置中进行调整。
而导出的yaml文件则像是一个模板,通过命令来替换原有的配置。
删除资源配置清单
陈述式删除:
Kubernetes 支持YAML和JSON格式管理资源对象
JSON 格式:主要用于api接口之间消息的传递
YAML格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
kubectl delete pods nginx
声明式删除
kubectl delete -f nginx-svc.yaml
自主编写资源清单
资源清单中svc的重要配置项
Service yaml文件详解
apiVersion: v1
kind: Service
matadata: #元数据
name: string #service的名称
namespace: string #命名空间
labels: #自定义标签属性列表
- name: string
annotations: #自定义注解属性列表
- name: string
spec: #详细描述
selector: [] #label selector配置,将选择具有label标签的Pod作为管理
#范围
type: string #service的类型,指定service的访问方式,默认为
#clusterIp
clusterIP: string #虚拟服务地址
sessionAffinity: string #是否支持session
ports: #service需要暴露的端口列表
- name: string #端口名称
protocol: string #端口协议,支持TCP和UDP,默认TCP
port: int #服务监听的端口号
targetPort: int #需要转发到后端Pod的端口号
nodePort: int #当type = NodePort时,指定映射到物理机的端口号
status: #当spce.type=LoadBalancer时,设置外部负载均衡器的地址
loadBalancer: #外部负载均衡器
ingress: #外部负载均衡器
ip: string #外部负载均衡器的Ip地址值
hostname: string #外部负载均衡器的主机名
手动编写 svc资源配置
#编写service服务的资源清单
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: default
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: nginx
#创建资源对象
kubectl create -f nginx-service.yaml
#查看创建的service
kubectl get svc
补充:
详解k8s中的port
●port
port是k8s集群内部访问service的端口,即通过clusterIP: port可以从Pod所在的Node. 上访问到service
●nodePort
nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort 可以从外部访问到某个service。
●targetPort
targetPort是Pod的端口,从port或nodePort来的流量经过kube-proxy 反向代理负载均衡转发到后端Pod的targetPort上,最后进入容器。
●containerPort
containerPort是Pod内部容器的端口,targetPort映射到containerPort
生成模板,再编写资源清单
生成模板
用--dry-run命令生成yaml资源清单
kubectl run --dry-run 打印相应的 API 对象试运行而不执行创建
#空跑测试
kubectl run nginx-svc2 --image=nginx:1.17 --port=80 --dry-run=client
#空跑测试的输出结果
kubectl run nginx-svc2 --image=nginx:1.17 --port=80 --dry-run=client -o yaml
#生成模板
kubectl run nginx-svc2 --image=nginx:1.17 --port=80 --dry-run=client -o yaml > nginx-svc2.yaml
#例:如果创建service,用
kubectl expose deployment nginx --port=8000 --target-port=80 --type=NodePort --dry-run=client -o yaml > nginx-svc.yaml
即可
修改并编写模板
vim nginx-svc2.yaml
kubectl apply -f nginx-svc2.yaml
kubectl get pods