在虚拟化和云高度发展的今天,容器云已经成了生产现实,那么容器编排技术无疑成了每个必须掌握的技能之一。作为事实上的容器编排标准K8S则是每个人的必修课,今天我们就来给大家补充K8S的这一课。
概述
本文我们也坚持一贯的行文风格那就是理论知识和实践动手操作相结合的方式。为了动手联系相关内容,我们必须要安装一些工具:
Docker Desktop
Kubernetes CLI(kubectl)
一个单节点的Kubernetes集群构建工具
kind
kubectl基础和K8S集群上下文
首先是Kubernetes CLI工具。它是一个单一的二进制文件kubectl。可以使用Linux发行版的软件包管理工具安装:
比如对于CentOS 可以使用:
yum install kubectl
安装成功后,我们就可以使用它对集群运行命令进行管理:
运行kubectl get nodes以列出Kubernetes集群中的所有节点结果类似:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-desktop Ready master 63d v1.16.6-beta.0
Kubernetes使用名为的配置文件config来查找连接到集群所需的信息。该文件位于主机主文件夹的:~/.kube/config。上下文是该配置文件中的一个元素,它包含对集群,名称空间和用户的引用。如果要访问或运行单个群集,则配置文件中将只有一个上下文。我们可以定义多个指向不同群集的上下文。
使用kubectl config命令可以查看这些上下文并在它们之间切换。
可以运行以下current-context命令来查看当前上下文:
kubectl config current-context
docker-desktop
如果没有得到与上述相同的输出,则可以使用use-context命令切换到docker-desktop上下文:
kubectl config use-context docker-desktop
Switched to context "docker-desktop".
还可以运行kubectl config get-contexts以获取所有Kubernetes上下文的列表。
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-desktop docker-desktop docker-desktop
* minikube minikube minikube
chongjk8s chongjk8s clusterUser_mykubecluster_chongjk8s
其中加*号的列表表示当前上下文
还有其它的命令,如use-context,set-context,get-contexts等。
对应kubectl,还有一个更好用的工具kubectx。kubectx可以让我们在不同上下文间快速切换。例如,配置文件中设置了三个集群(上下文),则运行kubectx输出:
kubectx
docker-desktop
peterj-cluster
minikube
运行命令时,当前选中的上下文也会突出显示。要切换到minikube上下文,可以使用:
kubectx minikube
如果使用kubectl则
先要使用kubectl config get-contexts查看所有上下文。
然后用kubectl config use-context minikube切换上下文。
容器编排
随着docker容器越来越多,对其管理就是个问题。为了解决这个问题,业界引入了容器编排的概念。容器编排就是用一系列的工具和统一的界面来自动化和管理容器的部署,包括其节点、网络、调度、存储、监控等等各个方面。容器编排可以帮助我们管理容器的整个生命周期。容器编排系统主要的功能包括:
根据可用资源配置和部署容器;
对各个容器进行监控;
负载平衡和服务发现;
不同容器之间的资源分配;
容器的上下缩放;
常见的容器编排系统有Kubernetes,Marathon,Docker Swarm,我们学习由谷歌开源并且使用最人数最多的Kubernetes,Kubernetes在国内也简称为K8S。
其实中文的的K8S和其发音也类似。
Kubernetes是由谷歌开源项目,是容器集群管理和调度最流行方案之一。使用Kubernetes可以用来运行容器,进行零停机时间部署,以在不影响用户的情况下更新应用程序,以及其他更多的我们后面要介绍的东西。
K8S与Docker
Kubernetes和Docker区别新手遇到的一个困惑的问题。Docker是容器的实现技术之一,还有其他的容器技术比如podman。
K8S是一个容器编排系统,是用来管理容器的工具。Kubernetes使用Pod等更高级别的架构来打包容器并统一管理它们。
K8S与Docker Swarm
和K8S一样,Docker Swarm也是一个容器编排工具,又有Docker公司自己推出的Docker管理工具。使用Swarm,可以将多个Docker主机连接到一个虚拟主机中。然后,用Docker CLI一次与多个主机通信,并在其上运行Docker容器。
K8S架构
K8S集群是运行容器化应用程序所需的一组物理或虚拟机以及其他基础结构资源。K8S集群中的每台机器都被称为一个节点。每个K8S集群中有两种类型的节点:
主节点:承载Kubernetes控制平面并管理集群
工作节点:运行容器化应用程序
主节点
主节点上的主要组件之一是API服务器。当创建K8S资源或管理集群时,API服务器负责和kubectl(工作节点)客户端通讯和对话。
调度器组件用对工作节点的应用程序进行工作负载和调度。还用来管理节点上可用的资源以及工作负载所请求的资源。利用这些资源用来对工作负荷进行调度。
其次控制器管理器,在主节点上运行的控制器管理器有两种类型:
KUBE控制器管理运行多个控制器处理。这些控制器监视群集的状态,并尝试将群集的当前状态(例如"工作负载A运行有5个副本")与所需状态(例如"希望在工作负载A运行10个副本")进行协调。控制器包括节点控制器,复制控制器,端点控制器以及服务帐户和令牌控制器。
云控制器管理运行控制器所特有的云提供商和可以管理资源群集之外。仅当K8S集群在云中运行时,此控制器才运行。如果在计算机上运行K8S集群,则该控制器将不会运行。该控制器的目的是使集群与云提供商进行对话,以管理节点,负载均衡器或路由。
最后,etcd是分布式键值存储数据库,K8S集群和API对象的状态都存储在etcd中。
工作节点
和主节点上一样,工作节点也运行有不同组件。首先是kubelet,该服务在每个工作程序节点上运行,其工作是管理容器。它可以确保容器正常运行,并且可以连接回控制平面。Kubelet与API服务器进行通信,它负责管理运行在其上的节点上的资源。
将新的工作程序节点添加到群集时,kubelet会自我介绍并提供其拥有的资源(例如"我有X CPU和Y内存")。然后,它询问是否需要运行任何容器。可以将kubelet视为工作程序节点管理器。
Kubelet使用容器运行时接口(CRI)与容器运行时进行对话。容器运行时负责使用容器。除了Docker外,Kubernetes还支持其他容器运行时,例如containerd或cri-o。
容器在Pod中运行,由上图中的蓝色矩形表示