k8s从入门到实践
介绍
Kubernetes(简称k8s)和Docker Swarm是两个流行的容器编排工具,它们都可以帮助用户管理和部署分布式应用,尤其是基于容器的应用。以下是两者的主要特点和对比:
- Kubernetes (k8s):
- 开源项目:由Google发起,现在由Cloud Native Computing Foundation (CNCF)管理。
成熟度与社区支持:拥有庞大的开发者社区和生态系统,高度活跃且持续更新迭代,支持众多云服务提供商以及企业内部部署。 - 功能丰富:提供了丰富的特性集,包括服务发现、自动伸缩、滚动更新、故障恢复、存储卷管理、网络策略、资源调度等。
- 复杂性:因为其强大的功能和设计目标,Kubernetes的架构和配置相对复杂,对初学者而言学习曲线较陡峭。
- 可扩展性:可通过CRDs(自定义资源定义)进行扩展,支持各种第三方插件和API以适应更复杂的场景需求。
- 开源项目:由Google发起,现在由Cloud Native Computing Foundation (CNCF)管理。
- Docker Swarm:
- 原生集成:作为Docker官方开发的集群解决方案,与Docker Engine紧密集成,使用标准的Docker API,对熟悉Docker的用户更为友好。
- 易用性:相比Kubernetes,Swarm在设置和操作上相对简单,适合轻量级和中小规模的部署场景。
- 功能范围:虽然也提供基本的服务发现、负载均衡、节点管理等功能,但整体功能集相较于Kubernetes略显简化。
- 自动化能力:Swarm支持服务复制、滚动更新等基础的自动化运维功能,但在高级调度策略和弹性伸缩方面不如Kubernetes灵活强大。
- 总结起来,Kubernetes适用于需要大规模、复杂环境和高度自动化运维的企业级应用场景,而Docker Swarm则更适合快速搭建和管理小型或中型容器化应用集群的团队。随着技术发展,虽然Swarm仍然在维护,但Kubernetes因其广泛接受度和丰富生态,在行业中的采用率更高。
基本概念
在Kubernetes(k8s)部署工作流程中,涉及多个核心概念和组件。以下是一些基本概念的详解:
- Pod:
Pod是Kubernetes中运行容器的基本单元,它代表集群中能够运行应用或服务的一个抽象。一个Pod可以包含一个或多个紧密相关的容器,这些容器共享存储卷、网络命名空间和其他资源。 - Deployment:
Deployment是一种声明式更新策略对象,用于管理Pod副本集及其滚动更新、回滚等生命周期操作。通过创建Deployment,你可以指定期望的Pod数量以及Pod的模板定义。 - 副本集(ReplicaSet):
副本集中的Pod是无状态的,每个Pod实例之间可以互换。ReplicaSet由Deployment控制,确保任何时刻都有指定数量的Pod副本处于Running状态。当Pod由于各种原因终止时,ReplicaSet会自动创建新的Pod以保持预期的副本数量。 - 状态集(StatefulSet):
状态集适用于需要持久化存储和稳定网络标识的有状态应用,如数据库集群、分布式文件系统等。状态集中的Pod是有状态的,每个Pod都有唯一的网络标识符(hostname),并且拥有持久化的存储卷。 - Service:
Kubernetes Service是一个抽象层,它定义了一种访问Pod的方式,即使Pod可能会动态地创建或销毁。它提供了负载均衡功能,并且可以通过标签选择器来找到关联的Pod提供服务。 - ConfigMap & Secret:
ConfigMap用来存储非敏感的应用配置数据,而Secret则用于保存敏感信息如密码、密钥等。两者都可以挂载到Pod中作为环境变量或者文件使用,使得应用程序的配置与代码分离,便于管理和更新。 - Volume:
Volume是持久化存储的一种方式,它可以将主机的目录或云存储系统映射到Pod内的容器中,使得容器的数据可以在容器重启后得以保留。 - Label & Selector:
Label是对Kubernetes对象(如Pod、Service等)进行分类和标识的关键字/值对。Selector则是根据特定的label来查找匹配的对象,例如Deployment使用selector来确定应该管理哪些Pod,Service使用selector来决定将请求路由给哪些Pod。 - Namespace:
Namespace为Kubernetes集群内部提供了逻辑上的隔离,允许在一个物理集群内运行多个独立的虚拟集群,每个namespace都有自己的资源分配和名称空间。 - Horizontal Pod Autoscaler (HPA):
HPA可以根据CPU使用率或自定义度量指标自动调整Pod的数量,以满足资源需求的变化。 - Ingress Controller:
Ingress是集群对外暴露HTTP/HTTPS服务的一种方式,它定义了如何将外部请求路由到集群内部的服务。Ingress Controller负责实现Ingress规则并提供负载均衡功能。
部署流程示例
整个部署工作流程通常包括编写YAML文件定义上述资源,然后使用kubectl apply命令将资源配置应用到集群,最后监控和维护这些资源的状态。
- 编写YAML/JSON资源定义文件
# MySQL数据库Deployment和Service
---
apiVersion: apps/v1
kind: Deployment # Deployment是一种声明式更新策略对象,用于管理Pod副本集及其滚动更新、回滚等生命周期操作。通过创建Deployment,你可以指定期望的Pod数量以及Pod的模板定义。
metadata:
name: mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-persistent-storage
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
clusterI