【从零开始的 K8s-01】基于 minikube 搭建一个本地 K8s 环境
前言
minikube 可以做到在本地部署 kubernetes (也叫 K8s,后面会用 K8s 指代 kubernetes) 环境、以单节点集群环境运行,非常方便个人测试和学习。个人也打算使用 minikube 来当作练手,在差不多搞清楚 K8s 的运作原理以及各种配置后,再上多台服务器搭建的真正的 K8s 环境。所以希望本文可以帮助更多人以更轻松的方式学习,并初步了解 K8s 究竟是什么东西。
minikube
这里先放上源代码,以及 K8s 的官网
minikube minikube(github) kubenates
正如前面所说,minikube 可以在本地计算机上运行单节点 Kubernetes 集群的工具。易于安装和使用,那么我们首先需要在本地安装 minikube
安装 minikube
PS:请先安装好 docker 再继续下面的步骤,因为 minikube 需要依赖于虚拟化软件来创建和管理虚拟机;本人只有 mac 环境是自己走了一遍,windows 与 linux 仅仅是通过官网给的方法得出的,如果有问题可以联系我~
如果下面执行 minikuber start 发生网络错误,使用阿里云镜像启动⬇️
minikube start –image-mirror-country=’cn’
另外安装 kubectl 命令行工具,可以直接通过命令行来与 Kubernetes 进行交互(下面会包含安装方法)
也可以直接看官网的各平台安装方法:https://kubernetes.io/zh-cn/docs/tasks/tools/
mac(使用 homebrew)
之前 mac 那期我有说如何安装 homebrew,如果没有安装 homebrew 的小伙伴可以点链接空降过去 一台 mac 的开发环境配置
mac 的 kubectl 安装方法:
1 | brew install kubernetes-cli |
继续安装 minikube 并启动
1 | 安装minikube |
展示图下即成功。注意不要前加前缀 sudo 启动,会失败。另外,第一次启动应该会告诉你权限问题,问题很简单,去看下对应的文件夹地址,赋值即可。我这里忘截图了,不过位置在 /users/ 用户名 /.minikube 下。进入用户目录内,使用 sudo chmod -R 777 .minikube 给该文件夹权限即可
windows
windows 的 kubectl 安装方法:
kubelet-windows 进入链接,下载下图的 exe 程序安装即可
下面是 minikube:进入 minikube-windows 链接内,选择好对应的版本,下载 exe 程序安装即可
安装完成后在 cmd 使用 minikube start 启动 minikube
linux
linux 的 kubectl 安装方法:
首先是下载最新的发行版:
x86-64:
1 curl -LO "https://dl.K8s.io/release/$(curl -L -s https://dl.K8s.io/release/stable.txt)/bin/linux/amd64/kubectl"ARM64:
1 curl -LO "https://dl.K8s.io/release/$(curl -L -s https://dl.K8s.io/release/stable.txt)/bin/linux/arm64/kubectl"
之后安装到对应路径,这里默认是 /usr/local/bin/kubectl
1 | sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl |
使用 minikube start 启动 minikube,如果出现权限等问题,可以看下 mac 的最后一步,给对应的文件夹赋值权限即可。
1 | 通过dashboard来开启控制台(注意单独开一个进程来开启控制台,如果ctrl+c的话控制台服务也会停止) |
K8s 概念介绍
这里笼统的我就不陈述了,官方写的肯定比我好得多 K8s 官方文档 这里我就以大白话的方式简单介绍几个重要的组件以及它们之间的关系,下面是官方的 K8s 架构图
K8s 集群是由多个 master 节点和多个 node 节点组成,master 负责整个集群的控制和管理,包括调度、监控、集群状态维护,而 node 节点则运行容器化的应用;本文的 minikube 包括一个 master 节点和一个 node 节点
Pod
Kubernetes 中最基本的调度和管理单元,也是最重要的一个概念,每个 node 节点可以有多个 Pod,一个 Pod 包含一个或多个容器,并且 Pod 内的容器共享相同的网络命名空间、存储卷、IP 地址和端口空间。
depolyment
层级比 Pod 大一级,用来管理 Pod,确保指定 Pod 的数量副本在集群中运行,如果有一个 Pod 挂掉了,那么会自动重新创建一个新的 Pod 来保证集群内的 Pod 数量。
Service
我们知道 Pod 是一个或多个的,如果 Pod 被销毁了就会重新创建,这就导致 Pod 的 IP 频繁变动,为了提供一个稳定的服务,Service 就是做这个的,serivce 定义了一种访问 Pod 的方式,提供一个稳定的网络端点以访问 Pod,将多个 Pod 进行封装,提供了集群内部的服务发现和负载均衡。我们只需要访问 Service 暴露给我们的地址就可以
Ingress
ingress 比较特殊,它是 K8s 的一个 API 对象,提供了一个从外部网络访问到 Service 的入口。也就是说管理外部访问集群的路由。并且可以根据不同的 URL,将不同的请求转发到到对应的 Service。和 Service 的区别有以下几点:1.Service 是集群的内部抽象,直接由 K8s 实现,而 ingress 则需要安装 Ingress 控制器引入;2.Service 主要作用于集群内部、ingress 作用于外部;3.Service 适用于 TCP 和 UDP 流量,而 ingress 则适用于 Http 和 Https。
对于 Service 和 Ingress 可以这样理解:因为 Pod 的 IP 可能会发生变化,Service 就为这些动态 Pod 提供了一个固定的访问点,但是,当我们有许多这样的服务时,ingress 就派上了用场,通过判断请求前缀等信息,将对应请求转发到具体 Service 里
namespace
命名空间,用来隔离应用和服务。使用命名空间可以方便管理
现在配合上面的概念进行下面的实践,会更方便理解
基于 nginx 进行演示
PS:K8s 在创建资源时命名遵循 DNS 标签规范明明,不可以包含大写字符!!!
命名空间的创建
- 首先我们需要创建一个新的命名空间,命名为 nginx,操作如下:
appVersion:声明版本,这个无需特别在意
kind:资源类型,这里声明为 namespace,表示目标是命名空间
metadata:描述创建对象的元信息,这里对命名空间标注上 name 以及标签
创建一个 yaml 的文件(文件名都是可以自定义的,这里以 nginx-namespace.yaml 举例,后面自行替换文件名即可),写入如下信息:
1 | apiVersion: v1 |
之后在控制台使用 kubectl create -f nginx-namespace.yaml 执行命名空间的创建。完成后可以在控制台查看命名空间
1 | 启动可视化控制台(推荐使用新的终端窗口来执行) |
deployment 的创建
- 同样,我们再创建一个 yaml 文件 (这里文件名为 nginx-deployment.yaml),用来创建 deployment
kind:这次资源类型指定为 Deployment
metadata:在信息中设置命名空间,以及 Deployment 的名字
spec:用来定义资源的状态。
replicas 为 Pod 副本数量,这里我们开启 3 个 Pod;
selector 为选择器,指示哪些 Pod 属于该 deployment,这里选择模板类型为 nginx 的 Pod (和下面的模板中的 labels.app 对应)
template 为模板,指定创建 Pod 的模板信息,包含标签和容器信息。
containers 是容器信息,使用 name 指定容器的名称、以及镜像,并且定义对应的监听端口号
1 | apiVersion: apps/v1 |
- 继续使用 kubectl create -f nginx-deployment.yaml 创建 deployment
Service 的创建
- 现在我们的 Pod 就已经创建完成了,可以在工作负载查看目前的工作情况,但我们仍需要访问到 nginx 的主界面才行,上面说了,Service 是提供对外服务访问的,现在来创建一个 Service。
- 同样,我们再创建一个 yaml 文件 (这里文件名为 nginx-service.yaml),用来创建 Service
kind:声明创建类型为 Service
metadata:声明 Service 的名字
spec:
selector 选择器使用 app 为 nginx 的做为后端 (对应 deployment 的 template)
ports 中使用 protocol 指定服务协议,这里使用 TCP 协议;port 是 Service 的对外端口号,targetPort 是监听 Pod 的端口号,相当于将 Service 端口号流量转发到 Pod 的 80 端口。
type:type 的值常用的有三个,分别为 ClusterIP(创建一个仅在集群内部可访问的虚拟 IP)、NodePort(每个节点上绑定一个端口)、LoadBalancer(负载均衡,须使用云平台) 这里我们使用 NodePort 即可
1 | apiVersion: v1 |
- 使用 kubectl -n nginx create -f nginx-service.yaml 创建 Service (这里注意使用 - n 来将 deployment 创建到名为 nginx 的命名空间,deployment 不用 - n 指定命名空间是因为在 metadata 内指定了命名空间)
下面我们就可以到控制台内的 Service 查看情况了
也可以在 deployment 内编辑副本数量,感受容器编排的快感
这里将副本从 3 个增加到 10 个
接下来我们启动 Service 并访问
1 | minikube -n nginx service nginx-service --url |
打开对应的端口,成功访问到 nginx
kubectl 常用命令
1 | 获取Pod信息 |
结束语
本文只是对 K8s 的一个初步的简单了解,后面对 K8s 达到一定程度的理解后,会继续出一期更深度的理解笔记。希望本文可以帮助到想了解 K8s 的同学~