文章目录
我之前按照官方的minikube流程走了一遍,现在是我自己搭建的 k8s 环境,加深一下命令操作的印象和基础操作,反正学习也就是反反复复才能记得牢固
- 现在每天学习的时间慢慢少了,学习的内容也只能一步步来,都是慢慢抽出来的,一边还要工作
我的环境
环境说明
版本信息
- kubectl:v1.21.0
- kubelet:Kubernetes v1.21.0
- 所有 pod 处于
running
状态,就很完美了
基础操作
如何部署一个应用?
在 docker 环境中,我们是通过docker run
来跑一个应用容器的,在 k8s 环境中,也可以直接通过run
进行一个应用容器部署
举个栗子
我们可以使用kubectl run --help
看一下最基本的命令语法:
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
- 一个最简单的
run
:kubectl run my-nginx --image=nginx
- k8s 环境中最小管理单元就是 pod,之前有说过,我们直接查看一下 pod 资源情况:
kubectl get pod
- 我们尝试删除这个通过
run
起来的pod:kubectl delete pod my-nginx
- 删除以后,系统再也不会自动重启这个 pod 了
- 所以通过这个方式直接运行的容器,肯定是没有保障的,一般也不会推荐这种方式运行
Deployment
我们知道,k8s 里面绝大对数都是对象,我们部署一个应用,其实也算是要创建这个对象
- 使用
kubectl create -help
查看创建帮助信息
- 可以看到如果我们要部署一个应用,可以使用
kubectl create deployment
方式
#语法规则
kubectl create deployment NAME --image=image -- [COMMAND] [args...] [options]
- 一个最简单的部署实例
#创建一次部署,使用tomcat:9.0.71-jdk17-temurin-focal镜像,部署名称叫:demo-tomcat
#这个地方我拉取镜像有点问题,我就用的自己的阿里云仓库
kubectl create deployment \
demo-tomcat \
--image=registry.cn-hangzhou.aliyuncs.com/publiclibrary/tomcat:8.5-jdk11-temurin-focal
- 查看一个部署的实例状态(如果是需要拉取镜像,这个时间可能要多等一下子)
kubectl get pod
-
按照之前我们的学习知识来讲,这次部署的大致流程应该是:命令行kubectl发送部署信息给api-server,由api-server保存在etcd中,再经过集群内部的一些调度分析,最终决定在哪个节点运行的信息上报给了api-server,其他node节点的kubelet一直监听着这个上报信息,k8s-02这台node节点发现是在自己主机上运行,就接受到了这个任务,就跑起来了
-
我们每次都是通过
kubectl get pod
去查看我们一次部署后的资源启动情况,所以在 k8s 环境中,一次部署就意味着启动了一个 Pod,而 Pod 里面才是具体跑的容器,而且不止一个容器 -
我们尝试下如果删除一个正在运行的 Pod ,k8s 具不具备自动拉取自愈机制
#删除一个Pod
kubectl delete pod demo-tomcat-7bcd448cb8-v7tdd
#查看Pod状态
kubectl get pod
- 通过实验我们发现,Pod 在删除以后,会自动再进行拉取一个新的 Pod,也就是说在
deployment
下的Pod
是具有自愈能力的
总结一下:
- k8s 环境中,通过部署操作
deployment
,可以创建一个应用程序 deployment
创建的应用程序就不再是一个容器了,而是 k8s 集群中最小的管理单元Pod
- 一个 Pod 不止一个容器,而是一个容器组
- 通过
deployment
创建的程序,k8s 会一直监听它的状态,并且提供了一种自我修复的机制来解决相关故障 deployment
处于Master
节点上,通过部署操作deployment
,Master
节点会选择合适的worker
节点创建container
,container
会被包含在Pod
中
关于 Pod
上面我们知道了,deployment
操作后,k8s 创建的是一个 Pod,这个Pod
里面用来跑应用容器
Pod
是一个容器组,用来绑定一组容器进程- 一个
Pod
下,里面的容器都是共享资源的(包括存储、网络、容器的基本信息等)
常用命令
kubectl get
显示资源列表
#获取所有资源类型为deployment的信息
kubectl get deployments
#获取所有资源类型为Pod的信息
kubectl get pods
#获取所有资源类型为node的信息
kubectl get nodes
##选项-n可以指定命名空间
#获取所有的命名空间信息
kubectl get namespaces
#查看指定命名空间的资源信息
kubectl get deployments -n kube-system
kubectl get pods -n kube-system
#查看所有命名空间的资源信息
kubectl get deployments -A
kubectl get pods -A
#如何查看所需要查询的资源是否在命名空间里面呢?
#查询资源不在命名空间的资源
kubectl api-resources --namespaced=false
#查询资源在命名空间的资源
kubectl api-resources --namespaced=true
kubectl describe
显示资源的详细信息
#语法规则:kubectl describe 资源类型 资源名称
kubectl describe deployment demo-tomcat
kubectl describe pod demo-tomcat-7bcd448cb8-6m52x
kubectl logs
查看 pod 中的容器日志(类似于 docker logs
)
#查看pod日志
kubectl logs demo-tomcat-7bcd448cb8-6m52x
#实时持续查看pod日志
kubectl logs -f demo-tomcat-7bcd448cb8-6m52x
kubectl exec
在 pod 中的容器环境下执行命令(类似于 docker exec
)
#先尝试用类似于docker exec 的方式
kubectl exec -it demo-tomcat-7bcd448cb8-6m52x sh
上述操作可以进入容器内部,但是 k8s 给出了另一种方式,上面这种方式应该会舍弃的吧
##试试官网的推荐方式:kubectl exec [POD] -- [COMMAND]
kubectl exec -it demo-tomcat-7bcd448cb8-6m52x -- sh
kubectl run
可以单独跑一个最小的单元Pod
- 这种方式一般不用
#最开始我就尝试过了
kubectl run my-nginx --image=nginx