前言

minikube可以做到在本地部署kubernetes(也叫K8s,后面会用K8s指代kubernetes)环境、以单节点集群环境运行,非常方便个人测试和学习。个人也打算使用minikube来当作练手,在差不多搞清楚K8s的运作原理以及各种配置后,再上多台服务器搭建的真正的K8s环境。所以希望本文可以帮助更多人以更轻松的方式学习,并初步了解K8s究竟是什么东西。

多台服务器的Kubernetes搭建

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
2
3
4
# 安装minikube
brew install minikube
# 启动minikube
minikube start

展示图下即成功。注意不要前加前缀sudo启动,会失败。另外,第一次启动应该会告诉你权限问题,问题很简单,去看下对应的文件夹地址,赋值即可。我这里忘截图了,不过位置在/users/用户名/.minikube下。进入用户目录内,使用sudo chmod -R 777 .minikube给该文件夹权限即可

image-20231204110131506

windows

windows的kubectl安装方法:

kubelet-windows 进入链接,下载下图的exe程序安装即可

image-20231204162221375

下面是minikube:进入minikube-windows 链接内,选择好对应的版本,下载exe程序安装即可

image-20231204162348817

安装完成后在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
2
3
4
5
6
# 通过dashboard来开启控制台(注意单独开一个进程来开启控制台,如果ctrl+c的话控制台服务也会停止)
minikube dashboard
# 停止本地集群:
minikube stop
# 删除本地集群:
minikube delete

K8s概念介绍

这里笼统的我就不陈述了,官方写的肯定比我好得多 K8s官方文档 这里我就以大白话的方式简单介绍几个重要的组件以及它们之间的关系,下面是官方的K8s架构图

image-20231205092349909

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标签规范明明,不可以包含大写字符!!!

image-20240328144821229

命名空间的创建

  1. 首先我们需要创建一个新的命名空间,命名为nginx,操作如下:

appVersion:声明版本,这个无需特别在意

kind:资源类型,这里声明为namespace,表示目标是命名空间

metadata:描述创建对象的元信息,这里对命名空间标注上name以及标签

创建一个yaml的文件(文件名都是可以自定义的,这里以nginx-namespace.yaml举例,后面自行替换文件名即可),写入如下信息:

1
2
3
4
5
6
apiVersion: v1
kind: Namespace
metadata:
name: nginx
labels:
name: nginx

之后在控制台使用 kubectl create -f nginx-namespace.yaml执行命名空间的创建。完成后可以在控制台查看命名空间

1
2
# 启动可视化控制台(推荐使用新的终端窗口来执行)
minikube dashboard

deployment的创建

  1. 同样,我们再创建一个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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: nginx
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.0
ports:
- containerPort: 80
  1. 继续使用kubectl create -f nginx-deployment.yaml创建deployment

image-20231205101621235

Service的创建

  1. 现在我们的Pod就已经创建完成了,可以在工作负载查看目前的工作情况,但我们仍需要访问到nginx的主界面才行,上面说了,Service是提供对外服务访问的,现在来创建一个Service。

image-20231205101705236

  1. 同样,我们再创建一个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
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind:
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 9345
targetPort: 80
type: NodePort
  1. 使用kubectl -n nginx create -f nginx-service.yaml 创建Service (这里注意使用-n 来将deployment创建到名为nginx的命名空间,deployment不用-n指定命名空间是因为在metadata内指定了命名空间

下面我们就可以到控制台内的Service查看情况了

image-20231205103402809

也可以在deployment内编辑副本数量,感受容器编排的快感

image-20231205103528642

这里将副本从3个增加到10个

image-20231205103544671

image-20231205103615797

接下来我们启动Service并访问

1
minikube -n nginx service nginx-service --url

image-20231205133829423

打开对应的端口,成功访问到nginx

kubectl常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 获取Pod信息
kubectl get Pods
# 获取命名空间为nginx的Pod信息
kubectl -n nginx get Pods
# 获取deployment信息
kubectl get deployment
# 获取命名空间为nginx的deployment信息
kubectl -n nginx get deployment
# 获取Services信息(services可以使用svc替换)
kubectl get services
# 获取命名空间为nginx的services信息(services可以使用svc替换)
kubectl -n nginx get services
# 获取所有的命名空间
kubectl get namespaces
# 获取集群节点信息
kubectl get nodes
# 创建资源
kubectl create -f <yaml-file>

结束语

本文只是对K8s的一个初步的简单了解,后面对K8s达到一定程度的理解后,会继续出一期更深度的理解笔记。希望本文可以帮助到想了解K8s的同学~