- 整理自官方新手教程,因此使用的是minikube。
- 官方教程链接: https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/
集群(cluster)
一个 Kubernetes 集群包含两种类型的资源:
- Master 调度整个集群
- Nodes 负责托管正在运行的应用
在 Kubernetes 上部署应用时,你告诉 Master 启动应用容器。 Master 就编排容器在集群的 Node 上运行。
1 集群基础命令
1.1 创建集群
minikube start
1.2 查看kubectl和k8s版本
## client 是kubectl,server是k8s
kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
1.3.查看节点信息
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 4m9s v1.20
2 部署应用
一旦运行了 Kubernetes 集群,就可以在其上部署容器化应用程序。k8s不会直接创建应用,而是通过控制器(controller)。最常用的就是Deployment。创建 Deployment 后,Kubernetes master 将应用程序实例调度到集群中的各个节点上。
创建应用程序实例后,Deployment 控制器会持续监视这些实例。 如果托管实例的节点关闭或被删除,则 Deployment 控制器会将该实例替换为群集中另一个节点上的实例。 这提供了一种自我修复机制来解决机器故障维护问题。
2.1 创建Deployment
kubectl create deployment deployname --image=image_name
2.2 查看Deployment
kubectel get deployments
3 pods和nodes
创建 Deployment 时, Kubernetes 添加了一个 Pod 来托管你的应用实例。
Pod 包括一个或多个应用容器,以及这些容器的一些共享资源。这些资源包括:
- 共享存储,比如volumn
- 网络,每个pod有唯一的集群 IP 地址
- 每个容器如何运行的信息,例如容器镜像版本或要使用的端口号。
节点(nodes)是 Kubernetes 中的参与计算的机器,可以是虚拟机或物理计算机,具体取决于集群。
每个 Kubernetes 节点至少运行:
- Kubelet,负责 Kubernetes 主节点和工作节点之间通信的过程; 它管理 Pod 和机器上运行的容器。
- 容器(如 Docker)负责从仓库中提取容器镜像,解压缩容器以及运行应用程序。
pod和node的关系:pod 必须运行在 节点上。一个节点可以有多个 pod 。
3.1 查看pods列表
kubectl get pods
3.2 查看pods详细信息(控制器、容器、镜像等)
kubectl describe pods
3.3查看pods日志
kubectl logs podname
3.4 在pod里运行命令
3.4.1. 查看环境
kubectl exec podname -- env
3.4.2 进入容器里的命令行环境
kubectl exec podname -- bash
4 访问应用
4.1. 新建service,将容器的8080端口映射到节点的端口
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
4.2 查看新建的service
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19m
kubernetes-bootcamp NodePort 10.103.177.108 <none> 8080:31624/TCP 62s
4.3 使用标签来映射pods
kubectl label pods $POD_NAME version=v1
4.4 查看pods的标签
kubectl describe pods $POD_NAME
4.5 查找特定标签的pods
kubectl get pods -l version=v1
4.6.删除service
kubectl delete service -l app=kubernetes-bootcamp
6 扩缩容
扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到有可用资源的节点上,
6.1 扩容
kubectl scale deployments/deploymentname --replicas=4
6.2 扩容结果
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4/4 4 4 106s
6.3 扩容后的pods名
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-fb5c67579-8whlr 1/1 Running 0 2m22s
kubernetes-bootcamp-fb5c67579-fgflh 1/1 Running 0 107s
kubernetes-bootcamp-fb5c67579-wp8vs 1/1 Running 0 107s
kubernetes-bootcamp-fb5c67579-x2t4q 1/1 Running 0 107s
6.3 缩容 (用同样的命令)
kubectl scale deployments/kubernetes-bootcamp --replicas=2
6.4 查看缩容结果
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 2/2 2 2 4m12s
7 镜像更新和回滚
滚动更新(rolling update)允许以下操作:
- 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
- 回滚到以前的版本
- 持续集成和持续交付应用程序,无需停机
7.1 更新镜像
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=newimage
7.2 查看镜像是否已更新
可以查看pods的镜像名是否已更新
kubectl describe pods
还可以用查看滚动更新的状态命令
$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
7.3 回滚
kubectl rollout undo deployments/kubernetes-bootcamp