所谓陈述式管理就是通过命令行管理。
在k8s中陈述式是通过kubectl命令行工具进行管理。
kubectl的优点:90%以上的场景都可以满足。对增、删、查比较方便,但是改不是很友好
缺点:命令比较冗长、复杂、难记
除了陈述式还有声明式和GUI。
声明式:k8s当中的yaml文件来实现资源管理就是声明式资源管理。
GUI:图形化工具
一般操作使用陈述式
部署服务会通过声明式
日常工作使用GUI
如何使用kubectl查看、部署、查看pod情况(详细信息和日志)以及如何发布和回滚呢?
kubectl version
#查看k8s版本信息
kubectl api-resources
#查看所有资源对象的名称
?
kubectl cluster-info
#查看集群信息
kubectl get cs
#查看当前master节点的状态
kubectl get pods
#查看默认命名空间内pod的信息
kubectl get ns
#查看当前集群所有的命名空间
kubectl get pod -n kube-system
#查看指定的命名空间
#-n:声明指定命名空间的名称
kubectl get pod -o wide
#查看默认命名空间内pod的部署情况、详细信息
#-o wide:会打印出来pod在集群内部的IP地址和pod部署在哪个节点上。
kubectl get pod -o wide -n kube-system
#查看指定命名空间内pod的详细情况
kubectl get node
#查看节点信息和状态
kubectl get node -o wide
#查看node节点的详细信息
#-o wide:会打印出来节点的真实IP和使用版本
kubectl describe pod myapp-test-5d94dbb4f
#查看已经部署好的pod详细信息
#可以查看到pod完整的创建信息。
#只要 get pod 可以查看到就可以使用 describe 查看到
kubectl describe pod -n kube-system etcd-master01
#查看不同命名看空间的pod详细信息
kubectl logs myapp-test-5d94dbb4f-5t84v
#查看pod的日志信息
kubectl logs -f myapp-test-5d94dbb4f-5t84v
#-f:动态查看日志
kubectl logs -f -n kube-system etcd-master01
#查看不同命名空间的pod日志信息
kubectl create ns test
#创建命名空间
#需要先声明动作再加上对象的名称
kubectl delete ns test
#删除命名空间
#需要先声明动作再加上对象的名称
kubectl delete pod myapp-test-5d94dbb4f-5t84v
#删除指定pod
#需要先声明动作再加上对象的名称
#如果不是默认命名空间还需要-n声明命名空间
deployment部署pod有两种方式
1、 陈述式:命令行
2、 声明式:yaml文件部署
滚动跟新:不是一次性把所有pod全部部署,而是一个个来。pod的更新时候使用,逐步引入新的pod而不是一次性引入
自我修复:如果有pod节点发生故障,deployment副本控制器,会自动启动新的pod来代替。
回滚:如果更新有问题,deployment会提供还原点。可以手动还原到上一次未更新前的状态。
扩容和缩容:通过deployment可以随时调整pod的数量,已适应流量的变化。
上述功能如果想要实现,必须是基于deployment创建的服务才可以。绝大多都是deployment创建的
kubectl get deployments
#查看默认命名空间使用deployment创建的pod数量
kubectl get deployments -n kube-system
#-n:指定命名空间查看
daemonset:不能通过命令行创建,只能通过yaml文件中点定义的方式创建
daemonset是后台运行创建,会在每个节点上都创建一个相同方式,相同版本的容器运行pod
daemonset一般都是依赖环境和重要组件。一般不会对这些资源进行操作。
kubectl get daemonsets -n kube-system
#daemonset不能通过命令行创建,只能通过yaml文件中点定义的方式创建
kubectl create deployment nginx-zyg --image=nginx
#在默认命名空间内使用deployment部署pod
kubectl create deployment nginx-zyg --image=nginx --replicas=3 -n test
#在指定命名空间内使用deployment的方式部署pod
kubectl delete pod nginx-zyg-5c98c86c57-hpd8j -n test
#删除指定命名空间内的pod
如果是基于deployment方式创建的pod,或者是daemonset方式创建的。是由控制器创建的pod使用delete删除pod是删不掉的。使用delete相当于重启
kubectl delete deployments nginx-zyg -n test
#基于deployment方式创建的pod一旦删除deployment,基于deployment创建的pod都会被删除(慎用)
kubectl run nginx1 --image=nginx
#基于run创建一个nginx
kubectl delete pod nginx1
#不是基于控制器创建的pod,使用delete将会被直接删除。
kubectl exec -it nginx-zyg-5c98c86c57-949t7 bash
#docker的exec只能在本机内部使用,不能跨主机。kubectl的exec可以跨主机进入容器
kubectl exec -it -n test nginx-6799fc88d8-tpl6n bash
#远程进入指定命名空间内的pod节点容器。
kubectl delete pod nginx-zyg-5c98c86c57-949t7 --force --grace-period=0
#--grace-period:过度的存活期。默认是30秒。可以让pod优雅的结束容器内的进程,然后退出pod
#=0:表示立即停止pod。必须要force实现。
主要是用于结束卡在销毁状态的pod
kubectl scale deployment nginx-zyg --replicas=3
#--replicas=3:从1个变成3个
kubectl scale deployment nginx-zyg --replicas=1
#--replicas=1:从3个变成1个
创建pod时即使没有指定副本数,后续也可以对他的副本数进行修改
kubectl get svc
#查看当前命名空间的service的类型
#-n:指定命名空间
kubectl delete svc nginx
#删除当前命名空间的service
#-n:指定命名空间
ClusterIP:创建service的默认类型,提供一个集群内部的虚拟IP地址,通过这个虚拟IP可以直接访问pod的资源。无法对外提供访问
NodePort:会在每一个node节点上都开放一个相同对的端口。外部可以通过node的本机IP地址+端口,访问pod资源。集群外部访问service资源的一种方式。四层代理方式。
nodeip:nodeport
会随机指派,也可以指定。
端口会从30000-32767的固定范围随机指派一个端口,或者可以指定一个这个范围内的端口。
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
#--port=80:声明service集群的端口
#--target-port=80:声明pod内部容器的端口
nginx-service NodePort 10.96.94.66 <none> 80:30386/TCP 9s
#10.96.94.66:集群内部的IP地址,外部不可以访问这个IP地址
#80:对应的是内部的service的端口
#30386:和内部的service的端口做映射
pod内部的容器端口是固定的。
--port是service和容器映射的端口可以自定义
但是--target-port容器内部的端口是固定的不可以自定义
80:30386这里的80是内部容器和service端口做的映射
这里的30386是外部主机和内部的service的端口做的映射
容器内部的端口 --port 先和service做映射。这个端口不能对外访问。如果类型是 NodePort 会在每个node节点上开通一个相同的端口,这个端口就是service和本机端口的映射。所以访问30386就可以访问容器内的服务。
kubectl edit svc nginx1-server
#修改service的默认端口
LoadBalancer:如果service的类型设定为LoadBalancer。地址映射(云平台会提供一个LoadBalancer的地址)这种用法仅用于公有云服务供应商在云平台上设置好的service场景。再通过外部来访问,实现负载均衡访问。(地址需要额外付费)
创建好了service,指定类型为LoadBalancer。
kubectl expose deployment nginx1 --port=8080 --target-port=80 --name=nginx2-server --type=LoadBalancer
ExternalName:DNS映射,给service分配一个域名,通过域名来访问后端pod资源。
使用ExternalName的service的类型,不能提供负载均衡,和 LoadBalancer 类型一样必须要设置一个LoadBalancer的地址才可以实现。
kubectl edit svc nginx1-server
#进入service内直接修改
需要在hosts里做映射
四个类型我都知道
默认类型只对内访问
NodePort类型我配置过可以对外访问
LoadBalancer类型需要花钱
ExternalName类型需要配置域名
项目的生命周期:创建 > 发布 > 更新 > 回滚 > 删除
kubectl set image deployment nginx1 nginx=nginx:1.10
#滚动更新服务的版本
kubectl rollout history deployment nginx1
#查看回滚点信息
#数字的大小决定了距离上次操作的远近。数字越大就是最近的一次操作
kubectl set image deployment nginx1 nginx=nginx:1.15 --record
#滚动更新服务的版本
#--record:可以在回滚点上添加标识
kubectl rollout undo deployment nginx1 --to-revision=1
#指定回滚点还原
kubectl rollout status deployment nginx1
#查看回滚过程
kubectl get pod -w
#动态查看回滚状态
kubectl get all
#查看当前命名空间内部的所有信息。
#-o wide:可以查看到详细信息
#-n:指定命名空间查看
http://docs.kubernetes.org.cn/683.html
#kubctl命令大全