目录
一.k8s集群资源管理方式分类
1.陈述式资源管理方式
- 增删查比较方便,但是改非常不方便
- 使用一条kubectl命令和参数选项来实现资源对象管理操作
2.声明式资源管理方式
- yaml文件管理
- 使用yaml配置文件里定义的配置,实现资源对象的管理操作
二.陈述式资源管理方法
- kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口
- kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径
- kubectl 的命令大全:kubectl --help
- k8s中文文档:http://docs.kubernetes.org.cn/683.html
- 对资源的增、删、查操作比较方便,但对改的操作就不容易了
三.kubectl命令
查看版本信息
kubectl version
查看资源对象简写
kubectl api-resources
查看集群信息
kubectl cluster-info
kubectl get cs
kubectl get nodes
配置kubectl自动补全
source <(kubectl completion bash)
vim /etc/bashrc #可添加到该文件的末尾
bash切换环境即可
node节点查看日志
journalctl -u kubelet -f
kubectl get <resource> [-o wide|json|yaml] [-n namespace]
获取资源的相关信息,-n 指定命令空间,-o 指定输出格式
resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all(仅展示几种核心资源,并不完整)
--all-namespaces 或 -A :表示显示所有命名空间,
--show-labels :显示所有标签
-l app :仅显示标签为app的资源
-l app=nginx :仅显示包含app标签,且值为nginx的资源
wide:显示详细信息
kubectl get -n kube-flannel pods #查看命名空间kube-flannel下的所有pod资源
kubectl get -n kube-flannel pods kube-flannel-ds-c5zqz #-n指定具体命名空间查看指定的kube-flannel-ds-c5zqz资源
kubectl get -n kube-flannel pods kube-flannel-ds-c5zqz -o wide #显示kube-flannel-ds-c5zqz资源的详细信息
kubectl get -n kube-system pods --show-labels # --show-labels 查看指定命名空间下资源的标签
kubectl get -n kube-system pods --show-labels -l k8s-app #通过-l筛选k8s-app 标签的资源
kubectl get -n kube-system pods --show-labels -l k8s-app=kube-dns #进一步筛选k8s-app标签值等于kube-dns的资源
kubectl get -n kubernetes-dashboard all #all选项会列出指定命名空间下pod、service、控制器资源
kubectl get -n kubernetes-dashboard pods
kubectl get -n kubernetes-dashboard pods,service
kubectl get -n kubernetes-dashboard pods,service,deploy
#想提示查看多个资源,可在资源中间以,分隔
kubectl get -n kubernetes-dashboard all #查看所有资源
查看 master 节点状态
kubectl get componentstatuses
kubectl get cs
查看命名空间
kubectl get namespace
kubectl get ns
命令空间的作用:用于允许不同 命名空间 的 相同类型 的资源 重名的
查看default命名空间的所有资源
kubectl get all [-n default]
创建命名空间
kubectl get ns
kubectl create namespace xy101
kubectl create deployment nginx1 --image=nginx -r 3 --port=80 -n xy101 #即可指定命名空间创建资源,不可在同一个命名空间中创建相同名称的同种资源
kubectl get -n xy101 all
查看某个资源的详细信息
kubectl describe -n xy101 deployments.apps nginx1 #deployments.apps资源的名称
查看命名空间xy101 中的pod 信息
kubectl describe -n <命名空间> <资源类型> <资源名称>
kubectl describe -n xy101 pod nginx1-794dd8cb7b-fcxnx
删除pod
kubectl delete -n <命名空间> <资源类型> <资源名称>
kubectl delete -n xy101 pod nginx1-794dd8cb7b-bc6cv #此种方法创建的pod资源若直接删除pod,无法删除由于设置了副本数,删除一个会自动再创建一个
创建pod资源方法2(此种方法创建的pod是独立存在的,没有控制器管理)
kubectl run -n xy101 nginx2 --image=nginx --port=80 #此种方法创建的pod无控制器进行管理,可直接删除
kubectl delete -n xy101 pod nginx2 #此种方法创建的pod可直接删除
kubectl exec可以跨主机登录容器,docker exec 只能在容器所在主机上登录
kubectl exec -n <命名空间> -it <Pod资源名称> [-c 容器名称] -- sh|bash|命令
kubectl exec -it -n xy101 pod/nginx1-794dd8cb7b-cbdjd -- sh
exec -it -n xy101 pod/nginx1-794dd8cb7b-cbdjd -- ls -l #在不进入容器的前提下查看其中内容
当一个pod中存在多个容器,可使用-c指定登录的容器
kubectl describe -n xy101 pod/nginx1-794dd8cb7b-cbdjd #查看资源下的容器
kubectl exec -it -n xy101 -c nginx pod/nginx1-794dd8cb7b-cbdjd -- sh #使用-c指定登录的容器
查看Pod中容器日志
kubectl logs -n <命名空间> <Pod资源名称> [-c 容器名称] [-f] [-p] #-p表示查看Pod容器重启前的日志
kubectl logs -n xy101 nginx1-794dd8cb7b-cbdjd -c nginx
扩缩容
kubectl scale -n <命名空间> <Pod控制器资源类型> <资源名称> --replicas=副本数
deployment|statefulset
kubectl scale -n xy101 deployment nginx1 --replicas=3
删除副本控制器
kubectl get -n xy101 all
kubectl delete -n xy101 deployments.apps nginx2
删除(重启)pod资源,由于存在deployment/rc之类的副本控制器,删除pod也会重新拉起,若pod无法删除,总是处于terminate状态,则要强行删除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示过渡存活期,默认30s,在删除pod之前允许pod慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod
kubectl delete -n xy101 pod nginx1-794dd8cb7b-lmjls --force --grace-period=0
kubectl get -n xy101 all
删除全部pod资源进行重建
kubectl delete -n xy101 pods --all
kubectl get -n xy101 all
删除命名空间
kubectl delete ns 网络空间
kubectl delete ns xy101
查看service关联的Pod端点
kubectl describe -n <命名空间> <资源类型> <资源名称>
kubectl describe -n xy101 svc svc-nginx1
kubectl get -n xy101 endpoints <资源名称> #直接查看关联端点
#以上两种方法可以查看端点不多的情况,若端点比较多就无法详细查看到
kubectl describe -n <命名空间> endpoints <资源名称>
kubectl describe -n xy101 endpoints svc-nginx1
如何修改标签选择器的值
#创建service
kubectl create -n <命名空间> service <svc资源类型> <资源名称> --tcp=<clusterIP的端口>:<容器端口>
kubectl create -n xy101 service nodeport svc-1 --tcp=8080:80
修改service标签选择器
kubectl set -n <命名空间> selector <资源类型> <资源名称> '标签key=value'
kubectl set -n xy101 selector svc svc-1 'app=nginx1'
四.项目生命周期
项目的生命周期:创建-->发布-->更新-->回滚-->删除
1.创建 kubectl create命令
- 创建并运行一个或多个容器镜像
- 创建一个deployment 或job 来管理容器
kubectl create ns xy101 #创建命名空间
kubectl create -n xy101 deployment nginx1 --image=nginx --port=80 --replicas=3 #创建资源
2.发布 kubectl expose命令
- 将资源暴露为新的 Service
为deployment的nginx创建service,并通过Service的8080端口转发至容器的80端口上,Service的名称为
nginx-service,类型为NodePort
kubectl expose deployment nginx --port=8080 --target-port=80 --name=nginx-service --type=NodePort
kubectl create service nodeport nginx-service --tcp=8080:80
service 的 type 类型
- ClusterIP(默认类型):分配一个集群内部的虚拟 IP 地址,仅在集群内部可访问。例如Pod和Pod之间的通信,如果是Kubernetes集群外的请求访问是不行的。
- NodePort:宿主机上开启一个特定端口(默认范围 30000-32767),直接与Pod的端口相连,实现访问宿主机IP:端口能够直接访问到Pod。用途:允许外部访问,但通常用于开发或测试。
- LoadBalancer:使用外接负载均衡器完成到服务的负载分发,此模式需要使用云提供商的负载均衡器,将请求分发到所有的Node上,再结合kube-proxy实现流量接入:外部客户端 -> 云负载均衡器 -> Kubernetes 节点 -> kube-proxy -> Pod
- LoadBalancer和NodePort很相似,目的都是向外部暴露一个端口,区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备,而这个设备需要外部云环境支持的,外部服务发送到这个设备上的请求,会被设备负载均衡转发到K8S集群中
- externalName:将外部服务映射到集群内部,并以DNS的形式用于Pod中服务对外部服务访问
创建service方法1
kubectl expose -n <命名空间> <Pod控制器资源类型> <资源名称> --name=<svc资源名称> --tpye=<svc类型> --port=<clusterIP的端口> --targetPort=<容器端口>
kubectl expose -n xy101 deployment nginx1 --name=svc-nginx1 --port=8080 --target-port=80 --type=ClusterIP #创建类型为ClusterIP的service
所有节点服务器即可通过访问http://clusterIP:port访问service
curl http://10.96.194.137:8080
kubectl expose -n xy101 deployment nginx1 --name=svc-nginx2 --port=8080 --target-port=80 --type=NodePort #创建service类型为NodePort
kubectl get -n xy101 svc
netstat -lntp | grep :31373 #在每个节点都可监听到这个端口, K8S集群外部/内部用户都可以通过nodeIP:nodePort来访问service
3.更新 kubectl set
重新创建一个service做测试
kubectl create -n xy101 deployment myapp-test01 --image=soscscs/myapp:v1 --port=80 --replicas=2 #创建pod资源
kubectl expose -n xy101 deployment myapp-test01 --name=test02 --port=8080 --target-port=80 --type=NodePort #创建service,类型选择NodePort
外部服务器即可通过nodeip:nodeport访问关联的pod
kubectl set image -n <命名空间> <Pod控制器资源类型> <资源名称> <容器名=镜像名:标签>
kubectl set image -n xy101 deployment myapp-test01 myapp=soscscs/myapp:v2
kubectl describe -n xy101 deployments.apps myapp-test01
4.回滚 kubectl rollout
kubectl rollout history -n <命名空间> <Pod控制器资源类型> <资源名称>
kubectl rollout undo -n <命名空间> <Pod控制器资源类型> <资源名称> [--to-revision=N]
kubectl rollout status -n <命名空间> <Pod控制器资源类型> <资源名称>
kubectl rollout history -n xy101 deployment myapp-test01 #查看历史回滚记录
kubectl rollout undo -n xy101 deployment myapp-test01 #撤销上一次的 rollout
kubectl rollout undo -n xy101 deployment myapp-test01 --to-revision=5 #指定回滚版本
kubectl rollout status -n xy101 deployment myapp-test01 #查看回滚状态
5.删除 kubectl delete
kubectl delete -n xy101 deployments.apps myapp-test01 #删除控制器
kubectl delete -n xy101 service test02 #删除service