一.方法
1.适合于对资源的修改操作
2.声明式资源管理方法依赖于资源配置清单文件对资源进行管理
资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)
3.对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
4.语法格式:kubectl create/apply/delete -f xxxx.yaml
补充:kubectl create 与kubectl apply之间的区别:
kubectl apply支持后续的更新,而kubectl create 创建的时候不支持更新,并且后期如果需要更新的情况下,要先删除原来的yaml文件,然后再去create创建,才能做到更新。
查看资源配置清单,将现有的资源生成模板导出
kubectl get deployment nginx -o yaml
/解释资源配置清单
kubectl explain deployment.metadata
如果要是查看里面元数据或者容器模板的可以在deployment后面加上.metadata或者.spec
保存到文件中
kubectl get svc nginx-service -o yaml > my-svc.yaml
修改资源配置清单并应用
离线修改:
修改yaml文件,并用 kubectl apply -f xxxx.yaml 文件使之生效
注意:当apply不生效时,先使用delete清除资源,再apply创建资源
kubectl get service nginx -o yaml > nginx-svc.yaml
vim nginx-svc.yaml #修改port: 8080
kubectl delete -f nginx-svc.yaml
kubectl apply -f nginx-svc.yaml
kubectl get svc
举例说明:将svc的8080端口修改为7070
在线修改:
直接使用 kubecktl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改
并不是所有的资源都是可以在线修改的:例如资源名称
修改名字之后报错
删除资源配置清单
陈述式删除:
kubectl delete service nginx
声明式删除:
kubectl delete -f nginx-svc.yaml
总结:
yaml文件如何创建
Kubernetes 支持 YAML 和 JSON 格式管理资源对象
JSON 格式:主要用于 api 接口之间消息的传递
YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
YAML 语法格式
●大小写敏感
●使用缩进表示层级关系
●不支持Tab键制表符缩进,只使用空格缩进
●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
●符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
●“---”表示YAML格式,一个文件的开始,用于分隔文件间
●“#”表示注释
beta:测试版
kubectl api-resources可以查看资源支持使用的版本
k8s资源配置信息
举例说明yaml文件格式
详解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。
手搓一个pod的yaml文件
首先先建立一个demo的目录,随后打开相同的终端利用kubetcl explain pod 查看pod的yaml需要哪些模板
补充:标签中的键值对:
apiVersion: v1
kind: Pod
metadata:
name: pod-demo1
namespace: test01
labels:
appname: myapp
appver: v1
spec:
containers:
- name: myapp
image: soscscs/myapp:v1
ports:
- containerPort: 80
name: http
protocol: TCP
- containerPort: 443
name: https
protocol:TCP
~
随后,查看一下
同一个yaml可以生成多个pod
直接在yaml文件里修改
两个pod创建成功
三 快速写yaml 文件方法
1,用 --dry-run 命令 创建但不执行
创建自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client
创建无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client
2, 查看生成yaml格式
自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml
无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml
3, 查看生成json格式
自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json
无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json
4, 使用yaml格式导出生成模板
并进行修改以及删除一些不必要的参数
自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml
无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml > nginx-deploy.yaml
5, 将现有的资源生成模板导出
kubectl get svc nginx-service -o yaml
6, 保存到文件中
kubectl get svc nginx-service -o yaml > my-svc.yaml
7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息
这个很重要,比如不知道deployment 的yaml 文件怎么写,可以输入 kubectl explain deployment
下面会提示你需要哪些信息
kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers
四 实战演练
1,用yaml 文件 k8s 运行nginx的pod实例
第一步必须先创建实例 ,如果不创建暴露端口就会报错
1.2 创建命名空间
kubectl create ns my-ky35 --dry-run=client -o yaml >nginx.yaml
1.3 创建pod 实例
kubectl run my-nginx-ky35 --image=nginx:1.14 --port=80 --labels=njzb=my-ky35 --dry-run=client -n my-ky35 -o yaml >> nginx.yaml
1.4 创建service
kubectl expose pod my-nginx-ky35 --port=80 --target-port=80 --name=nginx01 --type=NodePort --dry-run=client -n my-ky35 -o yaml >>nginx.yaml
tips: 此步骤 要先有命令空间 和 pod 实例
此步骤只是要 暴露端口的yaml语言
在此处,要把刚刚新建的pod 跟 命名空间删除 因为如果要执行yaml文件会产生pod与命名空间 会重复
1.5 修改得到的yaml 文件
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: my-ky35
spec: {}
status: {}
---
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
njzb: my-ky35
name: my-nginx-ky35
namespace: my-ky35
spec:
containers:
- image: nginx:1.14
name: my-nginx-ky35
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
njzb: my-ky35
name: nginx01
namespace: my-ky35
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
njzb: my-ky35
type: NodePort
status:
loadBalancer: {}
1.6 执行yaml 文件
kubectl apply -f nginx.yaml
进容器 做页面
kubectl exec -it my-nginx-ky35 -n my-ky35 bash
二.用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)
首先必须要有命名空间和deployment实例
随后,用dry-run 导入yaml文件,本质是不创建实例,但是yaml文件里面有
用deployment 控制器创造 redis 实例
kubectl create deployment my-redis-wyq --image=redis:latest --port=6379 --dry-run=client -n my-ky35 -o yaml >> redis.yaml
暴露端口
kubectl expose deployment my-redis-wyq --port=6379 --target-port=6379 --name=redis01 --type=NodePort --dry-run=client -n my-ky35 -o yaml >>redis.yaml
注意:这边是创造的deployment
所以不论暴露端口还是 删除 都是指定deployment 名字
修改yaml 文件
在两个apiVersion: apps/v1 中间加 ---
在暴露端口的那段yaml 文件 指定命名空间
添加nodeport 指定暴露端口
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
name: my-redis-wyq
namespace: my-ky35
spec:
replicas: 1
selector:
matchLabels:
app: my-redis-wyq
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
spec:
containers:
- image: redis:latest
name: redis
ports:
- containerPort: 6379
resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
name: redis01
namespace: my-ky35
spec:
ports:
- port: 6379
protocol: TCP
nodePort: 32333
targetPort: 6379
selector:
app: my-redis-wyq
type: NodePort
status:
loadBalancer: {}
执行yaml 文件
kubectl apply -f redis.yaml
访问 redis
连接redis 测试