本文介绍了一些基本的 Kubernetes(K8S)概念和组件,并提供了一些简单的部署和管理示例。
由于篇幅有限,且 K8S 是一个非常庞大和复杂的系统,本文仅介绍了一些基础功能,并忽略了部分细节。
Kubernetes (K8S) 是什么
它是一个开源的,工业级的容器编排引擎,用来对容器化应用在集群中进行自动化部署、扩缩容和管理。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。主要特性有高可用、方便的伸缩扩展、提供负载均衡等。
容器是一种把应用程序和它所需要的所有东西打包在一起的技术,这样就可以在不同的环境中运行,而不用担心出现各种问题。
为什么需要 K8S
当应用只需要在单台机器上运行时,使用 docker 和 docker-compose 就可以轻松实现部署和管理。但是,当应用的规模不断扩大,需要在成百上千台机器上运行时,使用传统的管理方式会变得非常繁琐和复杂,而 K8S 可以提供集中式的管理,轻松实现高可用、高性能、高扩展等目标。
K8S 基础知识
基本架构
由两部分组成:控制平面(Control Plane,以前把运行控制平面的节点称为 master)和计算节点(Node,以前又称 worker)。控制平面负责管理集群中的节点和容器,计算节点是运行容器化应用程序的工作机器。
Pod
Pod 是 Kubernetes 的最小调度单元,包含一个或多个的容器。同一个 Pod 里的容器共享运行环境,具有集群内唯一的 IP 地址。每个计算节点上可以运行多个 Pod。
Deployment
当你需要用到多个 Pod 时,直接管理很不方便。而 Deployment 为 Pod 提供声明式的更新能力,只需要描述 Deployment 中的目标状态并定义 Pod 模板,控制器就会自动维持集群内实际状态与期望状态一致,同时还可以配置滚动更新等策略。在 Deployment 中,所有 Pod 都是相互等价且可被替换的。
除了 Deployment 外,K8S 还提供 StatefulSet、DaemonSet、Job 等工作负载资源,用于管理满足不同需求的 Pod。
Service
前面说到,Deployment 中的 Pod 是相互等价且可被替换的,当 Pod 重建时,其 IP 会发生变化。而 Service 可以通过 label 关联对应的 Pod,其 IP 不会因为 Pod 重新创建而改变,可对集群外部提供服务,同时还提供负载均衡等能力。
Ingress
Ingress 是对反向代理的抽象,提供应用层流量的路由能力,功能类似 Nginx。
ConfigMap & Secret
对于应用程序的配置文件,我们可以使用 ConfigMap 进行管理。
Secret 类似于 ConfigMap 但专门用于保存机密数据,需要注意的是,默认情况下 K8S Secret 未加密地保存在服务器中。
PV & PVC
Pod 的生命周期是短暂的,当我们需要持久化数据时,可以挂载数据卷。PV(Persistent Volume)描述了已有数据卷的具体信息,例如磁盘大小等。PVC(Persistent Volume Claim)描述了 Pod 希望使用的 PV 属性,Controller 会根据它寻找适合的 PV。
Label & Annotation
我们可以使用标签(Label)和注解(Annotation)为资源添加额外的信息,通常来说标签定义的是 K8S 对象的元数据,可以被标签选择器所使用,注解定义的是用户附加的信息,如构建信息等,也用于一些 Controller 的功能扩展。
除了上面提到的以外,K8S 还有命名空间、污点与容忍等等功能,也有 Helm 这样的工具用于快速在集群中安装一些软件,功能和生态都非常丰富~
Kubectl
Kubectl 是管理 K8S 集群的命令行工具,部分常用的命令如下:
kubectl get <类型> <名称> -n <空间> -o <格式> # 查看资源详情
kubectl apply –f <文件/文件夹> # 应用指定的文件/文件夹中的资源
kubectl delete <类型> <名称> -n <命名空间> # 删除指定的资源
kubectl api-resouces # 查看集群内支持资源列表
kubectl explain <资源>.<字段> # 查看资源说明,快速查文档
kubectl exec # 在 pod 中对应容器执行命令
K8S 部署应用
接下来我们将尝试使用 K8S 部署一个简单的 Web 应用(以 Nginx 为例),首先编写我们需要的 yaml 文件:
# _namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: k8s-test
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
namespace: k8s-test
spec:
selector:
matchLabels:
app: k8s-test
template:
metadata:
labels:
app: k8s-test
spec:
containers:
- name: app
image: nginx:1.14.2
ports:
- name: http
containerPort: 80
# service.yaml
kind: Service
apiVersion: v1
metadata:
name: app
namespace: k8s-test
spec:
selector:
app: k8s-test
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
namespace: k8s-test
spec:
rules:
- host: <your host>
http:
paths:
- pathType: Prefix
path: /k8s-test
backend:
service:
name: app
port:
number: 80
然后,只要kubectl apply -f <文件名>
一下,我们的应用就会被创建并部署啦~
总结
K8S 可以管理大量的容器化应用,确实是非常强大的工具。如果你对后端运维、云原生技术感兴趣,请一定不要错过它!如果你只是想简单体验,可以使用各大云厂商提供的 K8S 集群服务,用起来也是非常的方便!