Kubernetes是一个开源的容器编排工具,它帮助在不同的开发环境中管理容器化应用。它允许构建由多个容器组成的应用服务,调度这些容器跨集群运行,扩展容器,并随时间管理它们的性能。
考虑微服务架构,每个服务通常都运行在自己的容器中。当构建和运营一个大规模系统时,容器化应用可能包含成百上千个容器。手动管理这些容器将涉及巨大的复杂性。因此,容器编排技术如Kubernetes可以简化开发和运维中的操作复杂性。Kubernetes等容器编排技术能够自动且持续地监控容器集群,并根据需要进行调整,确保生产环境中没有停机时间。例如,如果一个容器失败,另一个容器会自动接管,而最终用户甚至不会注意到。
Docker是一个用于构建容器化应用的特定平台,而Kubernetes是一个容器编排工具,帮助管理容器的生命周期。Docker Swarm是Docker自己的容器编排工具,它允许管理部署在多个主机上的多个容器。
与其他分布式计算平台一样,Kubernetes集群至少有一个主节点和多个计算节点。主节点负责暴露应用程序接口(API),调度部署和管理整个集群。每个工作节点运行一个容器运行时,如Docker,以及一个与主节点通信的代理。节点可以是运行在云中的虚拟机(VM)或运行在数据中心内的物理服务器。
主节点通过API接收来自CLI或UI的输入。这些输入可以是开发者提供给Kubernetes的命令。例如,要运行哪些容器镜像,要暴露哪些端口,以及定义在集群中运行的应用的期望状态参数。
1) API服务器:内部和外部组件都通过同一个API服务器进行通信。
2) 键值存储(etcd):键值存储作为Kubernetes集群中所有组件的单一真实来源。主节点请求etcd以检索节点和容器的状态参数。
3) 控制器:控制器检查集群的状态并进行更改,试图将当前状态移动到期望状态。
4) 调度器:调度器寻找来自API服务器的请求,并负责将它们分配给健康的节点。它评估节点的质量,并将Pod部署到最适合的节点。
工作节点负责执行主节点分配的工作,并报告结果回主节点。
1) Kubelet:每个集群节点都有一个'Kubelet',这是主要的Kubernetes代理。Kubelet监视来自主节点的任务,执行它们,然后将结果报告回主节点。此外,它还监视Pod,并在Pod出现故障时报告回主节点。
2) 容器运行时:容器运行时在节点上执行容器并管理容器镜像。例如,Docker是一个流行的容器运行时。
3) Kube-Proxy:Kube-proxy在每个节点上维护网络规则,并确保每个节点都有一个IP地址。
4) Pod:Pod由一个或多个容器组成,包括共享存储(卷)、IP地址以及如何运行它们的信息。
可以在本地系统上运行Kubernetes,而不是云服务。为此,需要安装两个程序——Minikube和Kubectl。Minikube允许在本地计算机上运行单节点Kubernetes集群。Kubectl是Kubernetes的命令行工具。
Minikube使用因操作系统而异的hypervisor驱动。这个链接有可以使用的驱动列表,用于设置Minikube——
将在这个示例中使用Docker作为hypervisor驱动。hypervisor驱动充当抽象层,将虚拟机与系统硬件分离。
要启动集群,可以在具有管理员权限的终端中运行以下命令:
minikube start
如果Minikube无法启动,可以选择其他适当的驱动来设置兼容的容器或虚拟机管理器。
如输出所示,Minikube在案例中使用了docker驱动。
可以使用kubectl与创建的Kubernetes集群进行交互,运行以下命令:
kubectl get po -A
这会显示所有已创建的Kubernetes集群组件,如etcd-minikube、Kube-apiserver-minikube、Kube-controller-manager-minikube、Kube-scheduler-minikube等。这些组件正如前几节所讨论的那样。
可以使用以下命令创建一个管理Pod的部署。这个Pod管理一个基于提供的Docker镜像的容器。
kubectl create deployment hello-world --image=k8s.gcr.io/echoserver:1.4
可以使用以下命令查看部署:
kubectl get deployments
要查看Pod,可以运行此命令:
kubectl get pods
可以将部署暴露在端口上:
kubectl expose deployment hello-world --type=NodePort --port=8080
kubectl port-forward service/hello-world 7080:8080