Kubernetes的基础概念
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。Kubernetes 提供了强大的抽象能力,使得开发者能够专注于应用程序的逻辑,而无需担心底层容器的运行和调度。以下是一些Kubernetes的基础概念:
- Pod:
- Pod 是 Kubernetes 中可以创建和管理的最小部署单元。一个 Pod 可以包含一个或多个紧密相关的容器,这些容器共享存储、网络命名空间和 IPC(进程间通信)等资源。Pod 中的容器总是被一起调度到同一节点上运行。
- Node:
- Node 是 Kubernetes 集群中的工作机器(物理机或虚拟机),可以是虚拟机或物理机。每个 Node 都运行 Kubelet,它是与主节点进行通信的主要“节点代理”。Node 上还可以运行多个 Pod。
- Cluster:
- Cluster 是一组运行 Kubernetes 的节点(Node)的集合,包括至少一个主节点(Master Node)和多个工作节点(Worker Node)。Cluster 提供了计算资源、存储资源和网络资源来运行各种应用。
- Master Node(Control Plane):
- Master Node 是 Kubernetes 集群的控制节点,负责集群的管理。它不运行用户容器,而是运行管理集群的 Kubernetes 控制平面组件,如 API 服务器(API Server)、调度器(Scheduler)、控制器管理器(Controller Manager)和 etcd(一个分布式键值存储系统,用于存储集群的所有状态信息)。
- Namespace:
- Namespace 是对一组资源和对象的抽象集合,用于将集群内部的资源逻辑上隔离。Kubernetes 集群启动时会自动创建几个 Namespace,如 default、kube-system 等。用户也可以根据需要创建自己的 Namespace。
- Service:
- Service 定义了 Pod 的逻辑集合和访问这些 Pod 的策略。Service 使得 Pod 之间可以通过抽象的服务名进行通信,而无需关心 Pod 的实际 IP 地址。Service 提供了负载均衡和发现机制。
- Deployment:
- Deployment 是 Kubernetes 的一种资源对象,用于声明式地更新 Pod 和 ReplicaSet。Deployment 可以描述一个期望的状态,比如运行多少个副本,并且可以自动进行 Pod 的滚动更新和回滚。
- ReplicaSet:
- ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。如果副本数量减少,ReplicaSet 会自动创建新的 Pod。ReplicaSet 通常由 Deployment 自动管理。
- StatefulSet:
- StatefulSet 用于管理有状态的应用,它能够保证 Pod 的启动顺序,并且能够保持 Pod 的稳定网络标识(如主机名和持久存储)。这对于需要稳定持久存储和有序启动的应用非常重要。
- ConfigMap 和 Secrets:
- ConfigMap 用于存储配置信息,如应用的配置参数。
- Secrets 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥。ConfigMap 和 Secrets 可以被 Pod 中的容器作为文件或环境变量访问。
这些基础概念是理解和使用 Kubernetes 的关键。通过组合这些概念,可以构建出复杂而强大的容器化应用程序。
为什么需要Kubernetes
Kubernetes(K8s)之所以成为容器编排领域的核心工具,主要是因为它解决了容器化应用部署和管理中的一系列复杂问题。以下是为什么需要Kubernetes的几个关键原因:
- 自动化部署和扩展:
- Kubernetes 能够自动化地部署应用程序的容器镜像,并根据应用的需求自动扩展或缩减副本数量。这极大地简化了运维工作,使得开发者能够更专注于应用程序本身的开发。
- 高可用性和容错性:
- Kubernetes 通过跨多个节点调度容器,并利用内置的健康检查和自动重启机制,提高了应用的高可用性和容错性。如果某个节点或容器出现故障,Kubernetes 会自动在其他节点上重新创建容器,确保应用的持续运行。
- 资源管理和调度:
- Kubernetes 提供了一个强大的资源管理和调度系统,可以根据集群中节点的资源使用情况(如CPU、内存等)来智能地调度容器。这有助于最大化资源的利用率,并避免资源浪费。
- 服务发现和负载均衡:
- Kubernetes 内置了服务发现和负载均衡功能,使得容器之间的通信变得简单可靠。通过创建Service资源,可以自动为应用提供负载均衡的访问入口,并根据需要自动调整流量分发。
- 声明式配置:
- Kubernetes 使用声明式配置来定义应用的期望状态。用户只需描述他们想要的应用状态,Kubernetes会自动将当前状态调整到期望状态。这种方式简化了配置的复杂性,并提高了配置的准确性。
- 存储和卷管理:
- Kubernetes 支持多种存储后端,包括本地存储、云存储等,并提供了卷(Volume)的概念来管理存储。通过为Pod分配卷,Kubernetes可以确保数据的持久化和可迁移性。
- 社区和生态系统:
- Kubernetes 拥有一个庞大的社区和丰富的生态系统,包括各种插件、工具和集成方案。这些资源使得Kubernetes能够适用于各种场景和需求,同时也为用户提供了强大的支持和帮助。
- 云原生应用的基石:
- 随着云原生概念的兴起,Kubernetes 已成为构建云原生应用的基石。它提供了云原生应用所需的基础设施和平台支持,使得应用能够更好地适应云计算环境的变化和需求。
综上所述,Kubernetes 通过自动化部署、扩展、管理和优化容器化应用,极大地简化了运维工作,提高了应用的可靠性和效率。因此,对于需要构建和管理复杂容器化应用的企业和组织来说,Kubernetes 是不可或缺的工具。
Kubernetes架构解析
Kubernetes(K8s)的架构是一个复杂但高度模块化的系统,旨在自动化容器化应用程序的部署、扩展和管理。以下是对Kubernetes架构的详细解析:
一、整体架构概述
Kubernetes集群主要由两部分组成:控制平面(Control Plane)和工作节点(Worker Nodes)。
- 控制平面:负责集群的管理和控制,包括资源的调度、状态监控、配置管理等。它主要由几个核心组件构成,如API Server、etcd、Scheduler、Controller Manager等。
- 工作节点:负责运行容器化应用程序,它们接收并执行来自控制平面的指令。工作节点上运行的主要组件包括Kubelet、Kube-proxy和容器运行时(如Docker、containerd等)。
二、控制平面组件
- API Server
- 功能:作为Kubernetes集群的入口,处理所有外部请求(如通过kubectl发出的命令),并将这些请求转发到相应的组件。它还负责验证请求的有效性,并将其转换为集群的状态变更,存储在etcd中。
- 通信方式:外部用户和其他集群组件通过HTTP REST API与API Server通信,而内部集群组件(如Scheduler、Controller Manager)则使用gRPC进行通信。
- etcd
- 功能:一个分布式键值存储系统,用于存储整个集群的配置信息、元数据和状态数据。它是Kubernetes集群的数据库,提供一致性和高可用性的数据存储服务。
- 特点:强一致性、分布式、键值存储,使用raft共识算法确保数据的一致性和可用性。
- Scheduler
- 功能:负责根据容器的资源需求和约束条件,将Pod调度到合适的节点上运行。它使用过滤和评分算法来选择最佳节点。
- 工作原理:接收来自API Server的Pod创建请求,通过过滤和评分操作选择最佳节点,并在API Server中创建绑定事件以表示Pod和节点的绑定关系。
- Controller Manager
- 功能:运行各种控制器,每个控制器都是一个独立的控制循环,持续监听集群的状态,并根据期望状态和实际状态的差异进行调整。
- 核心控制器:包括节点控制器、复制控制器、端点控制器、命名空间控制器等,分别负责节点的生命周期管理、Pod副本数量的维护、Service和Pod端点信息的填充以及命名空间的创建和删除等。
三、工作节点组件
- Kubelet
- 功能:工作节点上的核心代理,负责监听来自API Server的指令(如Pod的创建、更新和删除),并管理容器的生命周期。
- 工作原理:根据API Server的指令拉取镜像、启动容器、监控运行状况并处理终止等。
- Kube-proxy
- 功能:实现Kubernetes服务的负载均衡和网络代理。它配置网络规则(如iptables或IPVS),以实现服务的负载均衡和路由。
- 工作原理:维护本地的网络规则,将外部请求正确地路由到集群内的相应容器。
- 容器运行时
- 功能:负责实际的容器操作,如拉取镜像、创建和启动容器、管理容器生命周期等。
- 常见运行时:包括Docker、containerd、CRI-O等,它们通过CRI(容器运行时接口)与Kubelet进行通信。
四、总结
Kubernetes的架构通过高度模块化的设计,实现了对容器化应用程序的自动化部署、扩展和管理。控制平面负责集群的管理和控制,工作节点负责运行容器化应用程序。各个组件之间通过API和gRPC等协议进行通信,共同协作以确保集群的稳定运行和高效管理。
Kubeadm快速安装 Kubernetes集群
Kubeadm 是 Kubernetes 官方提供的开源工具,用于快速搭建 Kubernetes 集群。使用 kubeadm 安装 Kubernetes 集群的步骤可以概括为以下几个主要步骤:
1. 环境准备
1.1 主机配置
- 操作系统:建议使用 CentOS 7 或其他支持的系统。
- 网络配置:确保所有节点的网络可以互通,设置静态 IP(如果使用的是虚拟机)。
- 主机名设置:为每个节点设置一个唯一的名称,并配置
/etc/hosts
文件以便通过主机名访问。
1.2 禁用 SELinux
- 修改
/etc/selinux/config
文件,将SELINUX=enforcing
修改为SELINUX=disabled
。
1.3 禁用 Swap
- 临时禁用:
swapoff -a
- 永久禁用:编辑
/etc/fstab
文件,注释掉包含 swap 的行。
1.4 防火墙设置
- 禁用防火墙:
systemctl disable --now firewalld
1.5 内核参数调整
- 确保 iptables 能够正确处理桥接流量:
1.6 SSH 免密登录
- 在主节点上生成 SSH 密钥,并将公钥分发到其他节点,以便无密码登录。
2. 安装 Docker
- 在所有节点上安装 Docker,并确保 Docker 正常运行。
- 配置 Docker 镜像加速器(可选),以提高镜像下载速度。
3. 安装 kubeadm、kubelet、kubectl
3.1 配置 YUM 源
- 为 Kubernetes 组件配置 YUM 源,例如使用阿里云的 Kubernetes 镜像源。
3.2 安装软件包
- 使用 YUM 安装 kubeadm、kubelet、kubectl,确保版本一致。
yum install -y kubelet-xx.xx.xx kubeadm-xx.xx.xx kubectl-xx.xx.xx --disableexcludes=kubernetes
4. 初始化 Kubernetes 集群
4.1 初始化主节点
- 使用 kubeadm 初始化主节点。
- 根据输出提示,执行必要的后续步骤,如配置 kubeconfig 和安装 Pod 网络插件。
4.2 配置工作节点
- 在工作节点上执行
kubeadm join
命令,将节点加入到集群中。
5. 验证集群状态
- 使用
kubectl get nodes
查看集群中的节点状态。 - 确保所有节点都处于 Ready 状态。
6. 后续步骤
- 根据需要部署 Pod 网络插件(如 Calico、Flannel 等)。
- 部署其他 Kubernetes 组件或应用程序。
注意事项
- 确保所有操作都在 root 用户或具有相应权限的用户下执行。
- 在生产环境中,建议使用更稳定的 Kubernetes 版本和经过验证的 Pod 网络插件。
- 在安装过程中,如果遇到任何问题,请参考 kubeadm 的官方文档或相关社区支持。
通过以上步骤,您可以使用 kubeadm 快速安装并配置一个基本的 Kubernetes 集群。
Metrics-server部署
Metrics-server 的部署主要涉及多个步骤,包括环境准备、配置调整、安装Metrics-server本身以及验证安装结果。以下是一个详细的部署流程:
一、环境准备
- 确认 Kubernetes 集群版本:
- Metrics-server 支持多个 Kubernetes 版本,但不同版本可能需要不同的配置或参数。请确保你的 Kubernetes 集群版本与 Metrics-server 的兼容性。
- 检查 API Aggregator 是否启用:
- Metrics-server 需要通过 Kubernetes 的 API Aggregator 来提供服务。如果尚未启用,你需要在 kube-apiserver 的配置中增加
--enable-aggregator-routing=true
参数,并重启 kube-apiserver 服务。
- Metrics-server 需要通过 Kubernetes 的 API Aggregator 来提供服务。如果尚未启用,你需要在 kube-apiserver 的配置中增加
- 节点网络配置:
- 确保所有节点间的网络可以互通,以便 Metrics-server 能够从各个节点上获取监控数据。
二、配置调整
- 下载 Metrics-server 配置文件:
- 你可以从 Metrics-server 的 GitHub 仓库下载最新的配置文件(如
components.yaml
),或者根据自己的需求创建自定义的配置文件。
- 你可以从 Metrics-server 的 GitHub 仓库下载最新的配置文件(如
- 修改配置文件:
- 修改配置文件中的镜像地址,如果使用非默认镜像仓库,需要将镜像地址替换为你自己的镜像仓库地址。
- 根据需要调整其他配置参数,如
--kubelet-insecure-tls
(跳过 TLS 认证,用于测试环境)、--kubelet-preferred-address-types
(设置 Metrics-server 与 kubelet 通信时使用的地址类型)等。
三、安装 Metrics-server
-
应用配置文件:
- 使用 kubectl 工具将修改后的配置文件应用到 Kubernetes 集群中。
检查 Pod 状态:
- 查看 Metrics-server Pod 的状态,确保它已经成功运行。
四、验证安装结果
-
使用 Kubectl Top 命令:
- 你可以使用
kubectl top
命令来查看集群中的资源使用情况,以验证 Metrics-server 是否正常工作。
- 你可以使用
-
检查 Metrics API:
- 通过 API Server 访问 Metrics API(如
https://<api-server-address>/apis/metrics.k8s.io/v1beta1/nodes
),检查是否能够获取到监控数据。
- 通过 API Server 访问 Metrics API(如
注意事项
- 如果在部署过程中遇到任何问题,如 Pod 无法启动、无法获取监控数据等,请仔细检查日志文件中的错误信息,并根据错误信息进行调整。
- Metrics-server 默认将数据存储在内存中,不会进行持久化存储。如果你需要持久化存储监控数据,可以考虑使用其他工具(如 Prometheus)进行监控数据的收集和存储。
- 在生产环境中,建议使用稳定版本的 Metrics-server,并避免使用跳过 TLS 认证等不安全的配置参数。
通过以上步骤,你应该能够成功地在 Kubernetes 集群中部署 Metrics-server,并使用它来监控集群的资源使用情况。
Dashboard部署
Kubernetes Dashboard 是 Kubernetes 集群的 Web 管理界面,它提供了一个可视化的方式来查看和管理集群中的各种资源,如 Pod、Deployment、Service 等。以下是 Dashboard 部署的一般步骤:
一、准备工作
- 环境要求:
- 确保你的 Kubernetes 集群已经成功部署并运行正常。
- 确保你的机器上安装了 kubectl 命令行工具,并能够与 Kubernetes 集群进行通信。
- 选择部署方式:
- 可以选择从 GitHub、Gitee 等仓库下载 Dashboard 的 YAML 配置文件进行部署。
- 也可以从官方文档或镜像仓库中获取最新的部署指南和镜像。
二、下载并修改 YAML 文件
- 下载 YAML 文件:
- 可以从 GitHub 仓库(如
https://raw.githubusercontent.com/kubernetes/dashboard/vX.Y.Z/aio/deploy/recommended.yaml
,其中X.Y.Z
是 Dashboard 的版本号)下载推荐的部署文件。 - 或者从其他可信的源下载 YAML 文件。
- 可以从 GitHub 仓库(如
- (可选)修改 YAML 文件:
- 根据需要修改 YAML 文件中的配置,如镜像地址、命名空间、Service 类型等。
- 如果想要 Dashboard 能够在外部访问,可以将 Service 的类型修改为
NodePort
或LoadBalancer
,并设置相应的端口。
三、部署 Dashboard
-
应用 YAML 文件:
验证部署:
- 查看 Dashboard Pod 的状态,确保它已经成功运行。
kubectl get pods -n <namespace> # 替换 <namespace> 为你的 Dashboard 所在的命名空间,默认为 kubernetes-dashboard
- 查看 Dashboard Service 的状态,获取访问 Dashboard 的地址和端口。
四、访问 Dashboard
- 通过 kubectl proxy 访问:
- 在本地机器上运行
kubectl proxy
命令,并通过浏览器访问http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
(注意替换 URL 中的端口和命名空间)。 - 这种方式适用于在集群内部或可以通过 kubectl 代理访问集群的场景。
- 在本地机器上运行
- 通过 NodePort 访问:
- 如果 Dashboard Service 的类型为
NodePort
,则可以通过任意集群节点的 IP 地址和配置的 NodePort 端口来访问 Dashboard。 - 访问 URL 格式为
http://<node-ip>:<node-port>
(注意替换<node-ip>
和<node-port>
)。
- 如果 Dashboard Service 的类型为
- 通过 LoadBalancer 访问(如果配置了 LoadBalancer):
- 如果 Dashboard Service 的类型为
LoadBalancer
,则可以通过 LoadBalancer 提供的外部 IP 地址和端口来访问 Dashboard。 - 访问 URL 格式为
http://<loadbalancer-ip>:<port>
(注意替换<loadbalancer-ip>
和<port>
)。
- 如果 Dashboard Service 的类型为
五、配置访问权限
-
创建 ServiceAccount 和 ClusterRoleBinding:
- 创建一个具有集群管理权限的 ServiceAccount,并将其与 ClusterRoleBinding 绑定,以便能够访问 Dashboard。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF
获取 Token:
- 使用 kubectl 命令获取上面创建的 ServiceAccount 的 Token。
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
-
- 将获取到的 Token 复制到 Dashboard 的登录页面进行登录。
通过以上步骤,你应该能够成功部署并访问 Kubernetes Dashboard。请注意,由于 Kubernetes 和 Dashboard 的版本不断更新,具体的部署步骤和参数可能会有所变化,请参考最新的官方文档或相关资源进行操作。