学习分享|Kubernetes快速上手,快速了解及开始使用

grtsinry43
6/28/2024
10 views
预计阅读时长 9 分钟

最近感觉 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
1sudo pacman -S kubeadm kubelet kubectl

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

SHELL
1sudo swapoff -a

随后启动服务,当然也可以设置开机启动(enable)

SHELL
1sudo systemctl start kubelet

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

SHELL
1sudo pacman -S containerd
2sudo systemctl start containerd

系统配置

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

  1. 加载必要的内核模块

    • overlaybr_netfilter 是两个内核模块,分别用于文件系统层和网络层。
    • 创建文件 /etc/modules-load.d/k8s.conf 系统启动时将会自动加载这些模块
    overlay
    br_netfilter
    
    • 然后手动加载这些模块:
    SHELL
    1sudo modprobe overlay
    2sudo 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
1sudo 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

  1. 为用户配置 kubectl:

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

SHELL
1mkdir -p $HOME/.kube
2sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 安装 Pod 网络插件

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

SHELL
1kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  1. 将工作节点加入集群
    在每个工作节点上运行在 kubeadm init 步骤中输出的 kubeadm join 命令。

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

image-20240627214438919

一些常用命令

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

    SHELL
    1kubectl get nodes
  2. 查看所有命名空间中的 Pod 状态:

    SHELL
    1kubectl get pods --all-namespaces
  3. 查看特定 Pod 的日志:

    BASH
    1kubectl logs <pod-name>

实际演练

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

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


挖坑,再研究研究之后更新(悲)

相关推荐

B 站直播弹幕的 WebSocket 获取尝试与抽奖程序实现

网上对于 B 站的直播 ws 协议研究已经很多了,但是一是相互 copy 未形成完整的解决方案,二是...

grtsinry43
1/17/2025
99
0
0

2024 年终总结——于血泪中求索,于迷茫中坚守

对我来说,2024 算是充满波折而又有些许收获的一年了,对于前端的正式系统探索从这里开始,这一年从入...

grtsinry43
12/26/2024
203
2
0

利用Vue自定义指令(directives)实现全站动画效果

最近一直在学习 React 高阶知识,因此对于主页的开发再一次停滞了,主要也是一段时间内没有找到什...

grtsinry43
10/13/2024
29
0
0

学习分享|Vue3项目中使用微信SDK开发微信网页

最近在开发一个微信 H5 的项目,采用的是 Vue3+FastAPI,正好学习下微信用户登录,a...

grtsinry43
7/3/2024
161
0
0

用一个月的时间写一个自己的博客系统——Grtblog的技术介绍

终于,历时一个多月的开发 ~~bug~~ 和测试,这个目前问题很多很不成熟很难用的系统终于上线了.....

grtsinry43
12/14/2024
117
4
0
COMMENT 7273217695942840320

发表评论

登录之后评论体验更好哦 ~
支持 Markdown 语法 0 / 3000

在风雨飘摇之中

本站已运行了

一路走来,感谢陪伴与支持

愿我们不负热爱,继续前行

全站通知
更新通知