学习分享|Kubernetes快速上手,快速了解及开始使用
最近感觉 K8s 挺火的,也许是时下比较热门的技术栈了,学习过程比较曲折复杂,分享一下自己的学习过程,从快速入门,到一些深入的使用
<!--more-->简要介绍
Kubernetes 简介
Kubernetes,通常简称为 “k8s”,是一个开源平台,用于自动化部署、扩展和管理容器化应用程序。它允许您在一个计算机集群中管理容器化应用程序,提供部署、维护和扩展的机制。
听说过一个说法,docker 的图标是载满集装箱的鲸鱼,而 k8s 的图标是一个带有舵轮的蓝色八边形,代表着它在容器编排领域的导航和控制作用,象征着 Kubernetes 能够帮助用户高效地管理和指导容器化应用程序的部署和运行,驾驶着驶向远方(中二 ing)。
docker 更多用于将应用程序及其依赖项打包到一个轻量级、可移植的容器中,解决的是配置环境和实现容器化,而 Kubernetes 提供了高可用性、负载均衡、自动扩展和滚动更新等功能,适用于生产环境,使管理大规模容器化应用程序变得更加高效和可靠。Kubernetes 适用于需要自动化管理、扩展和部署多个容器的复杂应用场景。
与 docker-compose 的比较
-
集群管理和多节点支持
Kubernetes:设计用于管理一个跨多个节点(机器)的容器集群。它可以自动分配和调度容器到集群中的不同节点上,确保高可用性和资源的最佳利用。
Docker Compose:主要用于单个节点上的容器编排。虽然可以通过 Swarm 模式在多个节点上运行,但其功能和扩展性不如 Kubernetes 强大。 -
自动化和自我修复
Kubernetes:提供了自动化的容器部署、扩展和自我修复能力。它可以自动重新启动失败的容器、替换被损坏的节点、自动扩展应用实例数量等。
Docker Compose:缺乏自动化的修复和扩展机制。需要手动管理容器的状态和扩展。 -
服务发现和负载均衡
Kubernetes:内置了强大的服务发现和负载均衡功能。服务可以通过 DNS 名称互相访问,Kubernetes 会自动在各个 Pod 之间进行负载均衡。
Docker Compose:服务发现和负载均衡功能较为基础,需要依赖外部工具或手动配置。 -
持久化存储和卷管理
Kubernetes:提供了丰富的持久化存储选项和卷管理功能,包括 PersistentVolume 和 PersistentVolumeClaim,支持多种存储后端(如 NFS、Ceph、AWS EBS 等)。
Docker Compose:支持卷的基本功能,但管理持久化存储的功能较为简单,且不具备 Kubernetes 那样的存储抽象和集成能力。 -
安全性和访问控制
Kubernetes:提供了强大的安全和访问控制机制,包括基于角色的访问控制(RBAC)、网络策略、Pod 安全策略等,可以细粒度地管理用户和应用的权限。
Docker Compose:安全性和访问控制较为基础,需要依赖外部工具或额外的配置来实现类似的功能。 -
扩展性和生态系统
Kubernetes:具有丰富的扩展性和庞大的生态系统,支持 Helm Charts(包管理)、Operator(运维自动化)、CRD(自定义资源)等,可以轻松集成各种第三方工具和插件。
Docker Compose:相对简单,功能较为有限,扩展性不如 Kubernetes 强大。 -
社区和支持
Kubernetes:由 CNCF(Cloud Native Computing Foundation)维护,拥有庞大的社区支持和活跃的开发生态。广泛应用于生产环境,得到了各大云服务商的全面支持。
Docker Compose:主要由 Docker 社区维护,虽然也有不少用户,但在生产环境中的应用和支持程度不如 Kubernetes。
安装与快速上手
这里为了在本地演示方便,使用的是本地的 Archlinux
安装
首先安装必要的组件
这里要注意,进行下一步之前,由于 k8s 不支持 swap(为了保证容器运行),需要关闭 swap,以下命令适用于临时关闭,如果不再使用 swap,在 /etc/fstab
注释掉对应行即可
随后启动服务,当然也可以设置开机启动(enable)
Kubernetes 需要一个容器运行时来实际运行容器。最常用的选择是 containerd
和 CRI-O
。这里我们选择使用 containerd
。
系统配置
Kubernetes 需要一些特定的内核模块和系统参数来正常工作。
-
加载必要的内核模块:
overlay
和br_netfilter
是两个内核模块,分别用于文件系统层和网络层。- 创建文件
/etc/modules-load.d/k8s.conf
系统启动时将会自动加载这些模块
overlay br_netfilter
- 然后手动加载这些模块:
-
设置 sysctl 参数:
-
Kubernetes 需要一些特定的网络配置
-
创建文件
/etc/sysctl.d/k8s.conf
前两个是使得桥接的流量(例如虚拟机或容器之间的流量)可以被 iptables 的规则所处理
最后一个是启用 IPv4 在接口之间的转发
net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1
- 然后应用这些参数:
sudo sysctl --system
-
集群配置
- 初始化控制平面:
控制平面是 Kubernetes 集群的核心部分,负责管理所有集群活动。使用以下命令初始化控制平面:
--pod-network-cidr
参数指定 Pod 网络的 CIDR(Classless Inter-Domain Routing,无类别域间路由)。这里我们使用 10.244.0.0/16。
为什么选这个地址?
- 大多数人使用的习惯
- 选择 10.244.0.0/16 范围,旨在最小化与集群节点可能连接的其他网络的 IP 地址冲突的风险。10.0.0.0/8 的私有网络空间很大,允许灵活选择不太可能与组织现有网络配置重叠的子网。(比如我所在学校的校园网的内网网段就有冲突部分,10.244.xxx 更不容易冲突)
这个命令完成需要一些时间哦
该命令完成后会输出一个 kubeadm join 命令,用于将工作节点加入集群。
-
为用户配置 kubectl:
按照上一步的提示创建 .kube 目录并复制配置文件:
-
安装 Pod 网络插件
Pod 网络插件使得 Pod 之间可以通信。我们选择使用
Flannel
作为网络插件。
-
将工作节点加入集群
在每个工作节点上运行在 kubeadm init 步骤中输出的 kubeadm join 命令。
一些常用命令
-
查看所有节点的状态:
-
查看所有命名空间中的 Pod 状态:
-
查看特定 Pod 的日志:
实际演练
让我们搞一个简单的示例项目来实际应用一下叭~
这个例子包含一个前端( Nginx 提供静态文件)和一个后端( Flask 提供 API),帮助我们了解如何在 Kubernetes 上部署和管理多组件应用程序。
挖坑,再研究研究之后更新(悲)