Minikube-创建集群

简介

学习和复现一些小练习,从最基础的开始捏。从最基本的使用 K8S 开始,通过使用 Minikube 创建集群。
学习地址链接:https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/

Kubernetes 集群

Kubernetes 协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。 Kubernetes 中的抽象允许你将容器化的应用部署到集群,而无需将它们绑定到某个特定的独立计算机。为了使用这种新的部署模型,应用需要以将应用与单个主机分离的方式打包:它们需要被容器化。与过去的那种应用直接以包的方式深度与主机集成的部署模型相比,容器化应用更灵活、更可用。 Kubernetes 以更高效的方式跨集群自动分发和调度应用容器。 Kubernetes 是一个开源平台,并且可应用于生产环境。

一个 Kubernetes 集群包含两种类型的资源:

  • Control Plane 调度整个集群
  • Nodes 负责运行应用

集群图

Control Plane 负责管理整个集群。 Control Plane 协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。

Node 是一个虚拟机或者物理机,它在 Kubernetes 集群中充当工作机器的角色。每个Node都有 Kubelet , 它管理 Node 而且是 Node 与 Control Plane 通信的代理。 Node 还应该具有用于​​处理容器操作的工具,例如 Docker 或 rkt 。处理生产级流量的 Kubernetes 集群至少应具有三个 Node,因为如果一个 Node 出现故障其对应的 etcd 成员和控制平面实例都会丢失,并且冗余会受到影响。 你可以通过添加更多控制平面节点来降低这种风险 。

Control Plane 管理集群,Node 用于托管正在运行的应用。

在 Kubernetes 上部署应用时,你告诉 Control Plane 启动应用容器。 Control Plane 就编排容器在集群的 Node 上运行。 Node 使用 Control Plane 暴露的 Kubernetes API 与 Control Plane 通信。终端用户也可以使用 Kubernetes API 与集群交互。

Kubernetes 既可以部署在物理机上也可以部署在虚拟机上。你可以使用 Minikube 开始部署 Kubernetes 集群。 Minikube 是一种轻量级的 Kubernetes 实现,可在本地计算机上创建 VM 并部署仅包含一个节点的简单集群。 Minikube 可用于 Linux , macOS 和 Windows 系统。Minikube CLI 提供了用于引导集群工作的多种操作,包括启动、停止、查看状态和删除。

Minikube

  • 目标:将一个示例应用部署到 Minikube。运行应用程序。查看应用日志。
  • 环境:Ubuntu 20.04,自用笔记本

安装

下载安装 minikube,链接:https://minikube.sigs.k8s.io/docs/start/

1
2
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb

安装完成过后,尝试启动一个集群。在 root 权限下执行:

1
minikube start

如果不出意外的话,这个时候会出现没有 driver 的报错,这个时候可以按照链接里边儿的说明进行修复。这个地方,我准备采用 docker 来作为底层的 driver。链接:https://minikube.sigs.k8s.io/docs/drivers/docker/

安装 docker

链接:https://docs.docker.com/engine/install/ubuntu/

删除之前存在的一些依赖,包括 containerd、runc 等,执行以下命令:

1
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

然后我们使用 apt repo 来进行安装,便于后续的更新。首先安装一些辅助的工具:

1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

添加 docker official GPG key:

1
2
3
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

添加 docker 仓库:

1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 docker engine,并且运行验证,更新 docker 的时候也使用这些命令。可能会出现下载比较缓慢的情况,最好是有 ipv6,兴许会下载较快。

1
2
3
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world

继续

使用 docker 作为 driver 启动,或者可以设置 docker 作为默认 driver。

1
2
minikube start --driver=docker  
minikube config set driver docker

然后这个时候,如果在 sudo su 模式下当做 minikube 的 driver,会提示报错;但是如果直接运行,又会使用 unix:///var/run/docker.sock 的权限不够,因此需要将本机的用户添加到 docker 组:

1
sudo usermod -aG docker $USER && newgrp docker

如果不出意外的话,应该是可以运行起来了,而且会下载一些个相关的镜像,我只能说网速是真的慢。

运行

链接:https://minikube.sigs.k8s.io/docs/start/

  • 启动集群:
1
minikube start --driver=docker
  • 集群交互,通过 kubectl 与集群进行交互。
1
2
3
minikube kubectl -- get po -A
minikube kubectl -- get pods -A
minikube dashboard

部署应用

通过三种不同的方式来创建和部署应用。

service

创建一个简单的服务,并进行部署,将端口暴露到8080:

1
2
minikube kubectl -- create deployment hello-minikube --image=kicbase/echo-server:1.0
minikube kubectl -- expose deployment hello-minikube --type=NodePort --port=8080

稍等一会儿,然后观察部署情况:

1
minikube kubectl -- get services hello-minikube

可以让 minikube 启动一个浏览器来观察:

1
minikube service hello-minikube

可以使用 kubectl 来转发端口:

1
minikube kubectl -- port-forward service/hello-minikube 7080:8080

这个时候,刚刚部署的这个服务,可以在 http://localhost:7080/ 上访问到了。

LoadBalancer

创建一个 LoadBalancer 负载均衡器,并且将其路由到集群外部可访问。

1
2
minikube kubectl -- create deployment balanced --image=kicbase/echo-server:1.0
minikube kubectl -- expose deployment balanced --type=LoadBalancer --port=8080

在另外一个 shell 窗口中,开起 tunnel 来为已部署的实例进行负载 IP 的路由。

1
minikube tunnel

可以通过下列命令找到,已经可以路由访问的外部 IP 地址。

1
minikube kubectl get services balanced

现在该服务可以在 <external=ip>:8080 中访问到。

Ingress

开起 ingress addon 机制测试。

1
minikube addons enable ingress

下边给出一个例子,创建一个 echo-server 服务并且一个 ingress 路由到这个服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
kind: Pod
apiVersion: v1
metadata:
name: foo-app
labels:
app: foo
spec:
containers:
- name: foo-app
image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
name: foo-service
spec:
selector:
app: foo
ports:
- port: 8080
---
kind: Pod
apiVersion: v1
metadata:
name: bar-app
labels:
app: bar
spec:
containers:
- name: bar-app
image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
name: bar-service
spec:
selector:
app: bar
ports:
- port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /foo
backend:
service:
name: foo-service
port:
number: 8080
- pathType: Prefix
path: /bar
backend:
service:
name: bar-service
port:
number: 8080
---

Minikube-创建集群
https://www.bencorn.com/2023/06/06/Minikube-创建集群/
作者
Bencorn
发布于
2023年6月6日
许可协议