1. 安装 minikube
指定 kubectl 使用的配置文件
kubectl 是基于 HTTP 可以对多个集群进行操作的,因此 kubectl 具体操作哪个集群是需要用户进行一定的配置的。具体的配置文件在 $HOME/.kube
目录下存放。当 minikube 安装完成并启动后,会自动将配置文件改写为指向 minikube,你可以查看 $HOME/.kube/config
文件中的内容,其内容为即为连接 minikube 的配置文件。
执行 minikube start
前的默认配置文件:
1 | apiVersion: v1 |
执行 minikube start
后配置文件被改写为:
1 | apiVersion: v1 |
同理,你也可以通过指定配置文件来访问集群,只需要在操作指令前加上 --kubeconfig
来指定目标配置文件即可,如:
1 | kubectl --kubeconfig kubectl.conf -n test get pod |
2. 部署应用
应用部署行为都是在 master 节点上执行的,目标是为了将多个 pod 部署到 woker 节点上。在部署多个 pod 的过程中,k8s 会自动或按照用户制定的规则,将这些 pod 分配给不同的 worker 节点。``
2.1 使用命令行
可以使用 kubectl
命令行来部署应用:
1 | kubectl run test-cli --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 |
部署完成之后会创建一个 pod,通过 kubectl get pod
可以查看到该 pod:
1 | NAME READY STATUS RESTARTS AGE |
使用
kubectl get pod -o wide
可以参看更详细的信息
2.2 使用 Pod 类型的工作负载文件
此外,可以编写一个 YAML 文件来创建 pod:
1 | # pod.yaml |
使用指令部署该文件:kubectl apply -f ./pod.yaml
创建完成后查看创建的 pod:
1 | NAME READY STATUS RESTARTS AGE |
2.3 使用 Deployment 类型的工作负载
上面的文件只能创建一个 pod,如果你想要创建多个 pod,可以编写一个类型为 Deployment
的文件来创建多个 pod:
1 | # deployment.yaml |
使用指令部署该文件:kubectl apply -f ./deployment.yaml
创建完成后查看创建的 pod:
1 | NAME READY STATUS RESTARTS AGE |
使用 label 的作用是可以定位到所创建的多个 pod 中部署的某一应用:
可以使用 kubectl get deployment
来查看通过 Deployment 方式部署的服务:
1 | NAME READY UP-TO-DATE AVAILABLE AGE |
在此,关于工作负载的类型,k8s 中有以下几个类型定义:
- Deployment
适合无状态应用,所有pod等价,可替代 - StatefulSet
有状态的应用,适合数据库这种类型。 - DaemonSet
在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等 - Job & CronJob
Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。
2.4 更新或回滚 pod
更新
如果需要更新 pod,则只需要修改 deployment 文件的信息,然后再执行 kubectl apply -f ./deployment.yaml
指令对 pod 重新部署,k8s 就会自动将所有的 pod 更新为最新的版本。
在这一过程中,k8s 会逐个将 pod 销毁然后再重新创建,以保证线上服务不会被中断。
此外还可以使用命令行来直接更新 pod 中的某个应用的镜像源:
1 | kubectl set image deployment <deployment name> <container name>=<image> --record |
--record
可以将这次操作写入历史记录,方便后续回滚
如果在修改的过程中你需要执行多个操作,但你并不想每执行一个操作都重新部署一遍,那么可以使用 kubectl rollout pause deployment <deployment name>
指令先暂停部署,修改完成后再使用 kubectl rollout resume deployment <deployment name>
恢复部署。
更新完成后如果你想要获取一份最新的 deployment yaml 文件,可以执行:
1 | kubectl get deployment <deployment name> -o yaml >> new.yaml |
回滚
如果应用在更新后出现了问题,我们需要回滚 pod,则只需执行:
1 | kubectl rollout undo deployment <deployment name> [--to-reversion=<reversion>] |
–to-reversion 可以指定回滚到具体哪个版本,如果不加则自动回滚到上一版本
如果需要查看所有的历史记录,则可以使用该指令:
1 | kubectl rollout history deployment <deployment name> |
1 | deployment.apps/test-deployment |
2.5 关于 pod 的其他指令
kubectl get all
查看所有信息kubectl describe pod <pod name>
可以查看单个 pod 的详细信息kubectl logs [pod/]<pod name> -c <container name> -f
查看单个 pod 的日志- 如果 pod 中只有一个容器应用,则不需要指定容器
kubectl exec -it [pod/]<pod name> -c <container name>
进入到某个 pod 的容器中- 如果 pod 中只有一个容器应用,则不需要指定容器
kubectl scale deployment <deployment name> --replicas=<pod count>
修改某个部署的 pod 数量- 如果指定的新的 pod 数量大于当前的数量,这是一个扩展行为,原有已创建的 pod 还会仍会存在,并不会被销毁
- 如果指定的新的 pod 数量小于当前的数量,这是一个削减行为,会删除掉部分已有的 pod
kubectl rollout restart deployment <delpyment name>
重新部署某个服务kubectl delete pod <pod name>
删除某个 pod,但这个 pod 如果是某个部署的 pod,则会在删除之后重新生成一个kubectl delete deployment <deployment name>
删除某个部署kubectl delete all --all
删除全部资源kubectl port-forward <pod name> <target port>:<container port>
通过端口映射方式访问到指定 pod 中的端口
更多官网关于 Deployment 的介绍
2.6 将 Pod 指定到某个节点运行
将 Pod 指定到某个节点运行:nodeselector
限定 CPU、内存总量:文档
1 | apiVersion: v1 |