# 学习分享｜Kubernetes快速上手，快速了解及开始使用

原文：https://blog.grtsinry43.com/posts/kubernetes-quick-start/

作者：grtsinry43

发布时间：2024-06-27T19:09:46Z

内容更新时间：2024-06-27T19:09:46Z

最近感觉 K8s 挺火的，也许是时下比较热门的技术栈了，学习过程比较曲折复杂，分享一下自己的学习过程，从快速入门，到一些深入的使用

<!--more-->

## 简要介绍

### Kubernetes 简介

Kubernetes，通常简称为 “k8s”，是一个开源平台，用于自动化部署、扩展和管理容器化应用程序。它允许您在一个计算机集群中管理容器化应用程序，提供部署、维护和扩展的机制。

听说过一个说法，docker 的图标是载满集装箱的鲸鱼，而 k8s 的图标是一个带有舵轮的蓝色八边形，代表着它在容器编排领域的导航和控制作用，象征着 Kubernetes 能够帮助用户高效地管理和指导容器化应用程序的部署和运行，驾驶着驶向远方（中二 ing）。

docker 更多用于将应用程序及其依赖项打包到一个轻量级、可移植的容器中，解决的是配置环境和实现容器化，而 Kubernetes 提供了高可用性、负载均衡、自动扩展和滚动更新等功能，适用于生产环境，使管理大规模容器化应用程序变得更加高效和可靠。Kubernetes 适用于需要自动化管理、扩展和部署多个容器的复杂应用场景。

### 与 docker-compose 的比较

1. 集群管理和多节点支持
Kubernetes：设计用于管理一个跨多个节点（机器）的容器集群。它可以自动分配和调度容器到集群中的不同节点上，确保高可用性和资源的最佳利用。
Docker Compose：主要用于单个节点上的容器编排。虽然可以通过 Swarm 模式在多个节点上运行，但其功能和扩展性不如 Kubernetes 强大。

2. 自动化和自我修复
Kubernetes：提供了自动化的容器部署、扩展和自我修复能力。它可以自动重新启动失败的容器、替换被损坏的节点、自动扩展应用实例数量等。
Docker Compose：缺乏自动化的修复和扩展机制。需要手动管理容器的状态和扩展。

3. 服务发现和负载均衡
Kubernetes：内置了强大的服务发现和负载均衡功能。服务可以通过 DNS 名称互相访问，Kubernetes 会自动在各个 Pod 之间进行负载均衡。
Docker Compose：服务发现和负载均衡功能较为基础，需要依赖外部工具或手动配置。

4. 持久化存储和卷管理
Kubernetes：提供了丰富的持久化存储选项和卷管理功能，包括 PersistentVolume 和 PersistentVolumeClaim，支持多种存储后端（如 NFS、Ceph、AWS EBS 等）。
Docker Compose：支持卷的基本功能，但管理持久化存储的功能较为简单，且不具备 Kubernetes 那样的存储抽象和集成能力。

5. 安全性和访问控制
Kubernetes：提供了强大的安全和访问控制机制，包括基于角色的访问控制（RBAC）、网络策略、Pod 安全策略等，可以细粒度地管理用户和应用的权限。
Docker Compose：安全性和访问控制较为基础，需要依赖外部工具或额外的配置来实现类似的功能。

6. 扩展性和生态系统
Kubernetes：具有丰富的扩展性和庞大的生态系统，支持 Helm Charts（包管理）、Operator（运维自动化）、CRD（自定义资源）等，可以轻松集成各种第三方工具和插件。
Docker Compose：相对简单，功能较为有限，扩展性不如 Kubernetes 强大。

7. 社区和支持
Kubernetes：由 CNCF（Cloud Native Computing Foundation）维护，拥有庞大的社区支持和活跃的开发生态。广泛应用于生产环境，得到了各大云服务商的全面支持。
Docker Compose：主要由 Docker 社区维护，虽然也有不少用户，但在生产环境中的应用和支持程度不如 Kubernetes。

## 安装与快速上手

> 这里为了在本地演示方便，使用的是本地的 Archlinux

### 安装

首先安装必要的组件

```shell
sudo pacman -S kubeadm kubelet kubectl
```

这里要注意，进行下一步之前，由于 k8s 不支持 swap（为了保证容器运行），需要关闭 swap，以下命令适用于临时关闭，如果不再使用 swap，在 `/etc/fstab` 注释掉对应行即可

```shell
sudo swapoff -a
```

随后启动服务，当然也可以设置开机启动（enable）

```shell
sudo systemctl start kubelet
```

Kubernetes 需要一个容器运行时来实际运行容器。最常用的选择是 `containerd` 和 `CRI-O`。这里我们选择使用 `containerd`。

```shell
sudo pacman -S containerd
sudo systemctl start containerd
```

### 系统配置

Kubernetes 需要一些特定的内核模块和系统参数来正常工作。

1. **加载必要的内核模块**：

   - `overlay` 和 `br_netfilter` 是两个内核模块，分别用于文件系统层和网络层。
   - 创建文件 `/etc/modules-load.d/k8s.conf` 系统启动时将会自动加载这些模块

   ```
   overlay
   br_netfilter
   ```

   - 然后手动加载这些模块：

   ```shell
   sudo modprobe overlay
   sudo modprobe br_netfilter
   ```

2. **设置 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
   ```

### 集群配置

1.  初始化控制平面：
   控制平面是 Kubernetes 集群的核心部分，负责管理所有集群活动。使用以下命令初始化控制平面：

```shell
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
```

`--pod-network-cidr` 参数指定 Pod 网络的 CIDR（Classless Inter-Domain Routing，无类别域间路由）。这里我们使用 10.244.0.0/16。

> 为什么选这个地址？
>
> 1. 大多数人使用的习惯
> 2. 选择 10.244.0.0/16 范围，旨在最小化与集群节点可能连接的其他网络的 IP 地址冲突的风险。10.0.0.0/8 的私有网络空间很大，允许灵活选择不太可能与组织现有网络配置重叠的子网。（比如我所在学校的校园网的内网网段就有冲突部分，10.244.xxx 更不容易冲突）

这个命令完成需要一些时间哦

该命令完成后会输出一个 kubeadm join 命令，用于将工作节点加入集群。

![image-20240627203321509](https://blog.grtsinry43.com/home/grtsinry43/.config/Typora/typora-user-images/image-20240627203321509.png)

2. 为用户配置 kubectl：

   按照上一步的提示创建 .kube 目录并复制配置文件：

```shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```



3. 安装 Pod 网络插件

   Pod 网络插件使得 Pod 之间可以通信。我们选择使用 ` Flannel ` 作为网络插件。

```shell
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

4. 将工作节点加入集群
   在每个工作节点上运行在 kubeadm init 步骤中输出的 kubeadm join 命令。

   ```shell
   sudo kubeadm join <control-plane-host>: <control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256: <hash>
   ```

![image-20240627214438919](https://blog.grtsinry43.com/home/grtsinry43/.config/Typora/typora-user-images/image-20240627214438919.png)

### 一些常用命令

1. 查看所有节点的状态：

   ```shell
   kubectl get nodes
   ```
2. 查看所有命名空间中的 Pod 状态：
   
   ```shell
   kubectl get pods --all-namespaces
   ```
   
3. 查看特定 Pod 的日志：
   
   ```bash
   kubectl logs <pod-name>
   ```
   
   
   ​      

## 实际演练

让我们搞一个简单的示例项目来实际应用一下叭~

这个例子包含一个前端（ Nginx 提供静态文件）和一个后端（ Flask 提供 API），帮助我们了解如何在 Kubernetes 上部署和管理多组件应用程序。

---

挖坑，再研究研究之后更新（悲）
