Vultr 上快速搭建 kubernetes 集群

上前天获得了 https://www.vultr.com 300 美金的试用金,限期 1 个月。。

这两天一直在琢磨如何把这 300 美金霍霍完,免得过期浪费。于是把之前一些好玩的东西从家里的服务器迁移到了 Vultr 上,前天用 Vultr vps 搭建了一个了一个 WEB IDE, 过程记录在这篇文章里Vultr + Code-server 自建 Cloud IDE

昨天在 Vultr VPS 上使用 wordpress 搭建了一个博客,详情参考这篇文章 Vultr 部署 Wordpress 博客

申请过程参考这篇文章 快速注册 Vultr 账号以及创建 Vultr VPS

今天用在 Vultr 上搭建了一个 k8s 集群,三年前也搭建过一个 k8s 集群, 但是那是在家里的电脑上使用 VMWare 虚拟机搭建的,详情参看这篇文章 创建 kubernetes 集群,当时还是刀耕火种的年代,搭建 k8s 基本靠一条一条名令敲出来的,市面上的公有云搭建 k8s 集群跟手动搭建工作量差不了太多,当时的公有云平台只是搭建好以后,管理 k8s 集群比较直观,但是创建集群的过程还是不够自动化。中间还遇到 google 的一些容器镜像被强的问题,还是手动下载镜像解决得,那叫一个痛苦,不过当时也是为了学习 k8s, 整个搭建过程对 k8s 还是有了很深刻的认识。

今天试验了一下在 vultr 上创建集群,感觉创建集群的过程进步好多。
主要得益于他家的 VKE(Vultr kubernetes Engine), 将整个过程自动化了,安全性方面也做了一些增强。

之前公有云上创建 k8s 集群,价格也老贵,基本是创建完成后,用几天就销毁了。现在在公有云平台上创建 k8s 集群基本是能够负担得起的价格了。

目前试用金,还剩 290 多美刀,后续打算将之前折腾的一个大语言模型搬到 Vultr 上,关注我的博客,鹏叔将利用这波优惠,继续探索一些好玩的东西。

Vultr 试用金余额

1. 申请 Vultr 账号

注册并创建 Vultr 主机可以参考我的文章 快速注册 Vultr 账号以及创建 Vultr VPS,

注意:Vultr 普通注册只会获得 100 美金的试用金,使用活动链接注册可以赠送 300 美金,https://www.vultr.com/?ref=9645837

2. 创建 kubernetes 集群

登录到 Vultr 账号,以访问其控制面板。在 Vultr 控制面板页面,选择 Product,点击 Kubernetes 选项,点击 add cluster 进入 kubernetes 集群创建页面。

Vultr k8s panel

填写 Kubernetes 集群名称、依次选择 Kubernetes 版本和集群位置。

Vultr k8s cluster creation snapshot 1

集群位置,亚洲地区可以选择,首尔、东京、新加坡
Vultr k8s cluster creation snapshot 2

为集群设置标签,选择集群节点数量,选择节点类型;
选择 plan, 这里选择的是 2U2G 的 60G 的一个 plan;
设置完毕后,单击“Deploy Now”立即部署按钮。
Vultr k8s cluster creation snapshot 3

集群创建可能需要 3-5 分钟
Vultr k8s cluster creation snapshot 4

一旦 Kubernetes 集群准备就绪,集群状态会变成 Running,此时点击右边的”…”按钮,然后点击 manage 菜单进入集群管理界面。

Vultr k8s cluster creation snapshot 4

下载配置文件,将其保存到用户目录下的.kube 文件夹下,并将其命名为 config

Vultr k8s cluster creation snapshot 4

kubectl config

启动终端,并运行以下命令查看其状态。

如果电脑没有安装 kubectl ,可以参考这篇文章进行安装如何安装 kubectl 命令行工具

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

$ kubectl get pods -A
# 或者, 如果没有将配置文件命名为config
kubectl –kubeconfig=/path/to/kube_config.yaml get pods -A

NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-68865dfcb6-l2j9g 1/1 Running 0 17m
kube-system calico-node-8xq2l 1/1 Running 0 17m
kube-system calico-node-dhh4l 1/1 Running 0 17m
kube-system calico-node-jfs2z 1/1 Running 0 17m
kube-system calico-node-smgh4 1/1 Running 0 17m
kube-system cluster-autoscaler-74dcd4ff67-ns6jn 1/1 Running 0 16m
kube-system coredns-7ddfc8768d-p89ww 1/1 Running 0 16m
kube-system csi-vultr-controller-0 4/4 Running 0 16m
kube-system csi-vultr-node-cshtd 2/2 Running 0 16m
kube-system csi-vultr-node-fbgsw 2/2 Running 0 16m
kube-system csi-vultr-node-gxvzx 2/2 Running 0 16m
kube-system csi-vultr-node-kbjtb 2/2 Running 0 16m
kube-system konnectivity-agent-fhz4t 1/1 Running 0 16m
kube-system konnectivity-agent-hbgr6 1/1 Running 0 16m
kube-system konnectivity-agent-r6jkx 1/1 Running 0 16m
kube-system konnectivity-agent-s68lv 1/1 Running 0 16m
kube-system kube-proxy-8djsl 1/1 Running 0 16m
kube-system kube-proxy-dxnlj 1/1 Running 0 16m
kube-system kube-proxy-k7dbl 1/1 Running 0 16m
kube-system kube-proxy-n9p9n 1/1 Running 0 16m

3. 部署 Nginx pod

部署 nginx pods 测试 k8s 集群

3.1. 部署一个 nginx deployment

nginx pod 的配置文件 nginx-pod.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80

其中配置项:

image:用于指定 nginx 容器使用的镜像
containerPort:容器内部监听端口,有关 k8s 各种 port 的使用,可以参考 链接
使用命令 kubectl apply 创建 pod:

1
kubectl apply -f nginx-pod.yml

3.2. 创建 NodePort service

使用一个 NodePort 将 nginx 暴露给外部访问。

k8s 使用 service 来实现服务发现,常见配置包括:

spec.selector:用于定义如何选择 pod
spec.ports:用于定义如何暴露端口,其中,nodePort 指定可以在外部访问的端口
完整的 nginx-svc.yml 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30081
type: NodePort

3.3. 查看节点状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-deployment-6c8cb99bb9-fkl4g 1/1 Running 0 15m 10.244.52.1 tutorial-2e0e100e9962 <none> <none>
pod/nginx-deployment-6c8cb99bb9-jnvzh 1/1 Running 0 15m 10.244.37.65 tutorial-c58f596f5e21 <none> <none>
pod/nginx-deployment-6c8cb99bb9-xbgmq 1/1 Running 0 15m 10.244.104.193 tutorial-90e1a52c00d0 <none> <none>

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49m <none>
service/nginx-service NodePort 10.97.60.167 <none> 80:30081/TCP 6m19s app=nginx

NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/nginx-deployment 3/3 3 3 15m nginx nginx:alpine app=nginx

NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-deployment-6c8cb99bb9 3 3 3 15m nginx nginx:alpine app=nginx,pod-template-hash=6c8cb99bb9

可以看出 3 个 nginx pod 运行正常,分别监听在 pod 网络的 10.244.52.1:80, 10.244.37.65:80, 10.244.104.193:80 (Endpoints) 上

nginx-service 创建成功, 将会把来自 10.97.60.167:80 的请求 redirect 到 endpoits,在 cluster 内部可以使用 10.97.60.167:80 访问 nginx 服务。

在集群外部,由于我们创建的是 NodePort 类型的服务,并且 nodePort 为 30081,所有服务还会为每一个 worker node 节点开启 30081 端口。

来自集群外部的请求,如果访问 worker node 的 30081 端口,将被 redirect 到 10.97.60.167:80, 再次被 redirect 到某一个 Endpoint 例如
10.244.52.1:80,而此 endpoint 正好可以被某个 nginx 实例响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ kubectl describe svc nginx-node-service

Name: nginx-node-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.97.60.167
IPs: 10.97.60.167
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30081/TCP
Endpoints: 10.244.52.1:80,10.244.37.65:80,10.244.104.193:80
Session Affinity: None
External Traffic Policy: Cluster
Internal Traffic Policy: Cluster
Events: <none>

3.4. 外部访问 nginx

现在切换到,Vultr computer 视图,我们可以看到所有 worker node 节点的公网 ip.

vult product computer view

打开浏览器,拿任意一个 worker node 的公网 IP, 访问其 30081 端口,就能访问到 nginx 的 index 页面。

ngix service on k8s

4. 创建 Vultr load balancer

在生产环境,我们肯定不会将某一个 worker node 暴露给用户访问,这样某个 worker node 的压力会非常大。

此时我们很自然的会想到,在集群前面加高可用负载均衡器。下面演示一下如何用 Vultr 的 Loadbalancer saas 服务来处理用户请求。

create vultr load balancer

选择与 k8s 集群一致的位置
select vultr LB location

这里选择 3 个节点,做高可用集群; 负载均衡算法可以选择 Round Robin 也可以选择 less connections;
端口转发规则 http 80->30081, 这样 http 访问服务时就不用加端口号了。不过这些在 load balancer 创建后依然可以修改。
configure vultr Load balancer

health check 将端口修改称 30081, 点击“Add Load Balancer”开始创建 Load Balancer
configure vultr Load balancer heathcheck

创建过程大概需要 3-5 分钟
vultr Load balancer creating

首次创建 load balancer 状态是失败的,因为我们还没有添加任何代理节点。点击 load balancer 进入管理页面。
将所有的 k8s 节点添加到 load balancer 中。
vultr Load balancer add instances

最后使用浏览器访问 load balancer 的 80 端口,可以看到,请求被重定向到 k8s 集群内部的 nginx pod 上。
通过LB IP访问k8s pod上的nginx服务

Vultr 上快速搭建 kubernetes 集群

https://pengtech.net/k8s/kubernates_on_vultr.html

作者

鹏叔

发布于

2024-08-31

更新于

2024-09-08

许可协议

评论