k3d - 3分钟创建一个生产级k8s集群
本标题可能有歧义,此集群只用于本地测试,请勿用于生产(我想也没人会这么干)
当我们谈论到容器编排技术时,Kubernetes(简称K8s)无疑是一个家喻户晓的名字。
但是,对于想要学习Kubernetes的人来说,搭建一个本地环境却往往是一件头疼的事情。从安装各种依赖到配置繁琐的集群,这一过程常常让人望而却步。
这个时候,就需要 k3d
闪亮登场啦。k3d可以说是k8s本地环境的”最佳拍档”。它使用了轻量级的k3s发行版,并借助Docker容器技术,让我们仅通过一个命令,就可以拥有一个多节点的k8s集群环境,省去了繁琐的安装和配置过程。
虽然我们也有 Minikube 和 Kind ,但k3d天生支持多节点集群,可以快速启动多master或多worker节点。而 Minikube 和 Kind 就更加麻烦了。
环境
首先我们需要安装好 docker
和 kubectl
。
docker是一种容器运行时环境,k3d会运行在docker之上 ,kubectl是kubernetes的命令行工具
wget -qO- get.docker.com | bash
kubectl的安装教程请参考官网。
安装
这里以
v5.5.2
版本作为演示,最新版本请到 官网 查看
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | TAG=v5.5.2 bash
安装完成后,我们看一下k3d的版本
k3d version
➜ ~ k3d version
k3d version v5.5.2
k3s version v1.27.4-k3s1 (default)
创建集群
由于k3d在非root权限下创建集群总会出现奇奇怪怪的问题,本教程采用root权限创建集群。
创建了一个包含1个服务器节点和2个代理节点的k3d集群,API端口设置为6550,通过8180映射到容器端口80(负载均衡器)
sudo k3d cluster create hello-k3d \
--api-port 6550 \
-p "9080:80@loadbalancer" -p "9443:443@loadbalancer" \
--servers-memory 4g \
--agents-memory 4g \
--servers 1 \
--agents 2
我们查看一下集群信息
sudo kubectl get node
你会看到server-0,agent-0 和 agent-1。这样,我们的第一个k8s集群就已经创建好了,就相当于我们有1台server控制节点,2台agent工作节点了。
关于权限
由于我们使用root权限创建了k3d集群,往后我们的kubectl命令都要添加sudo
,这很麻烦,我们让普通用户也可以执行kubectl。
- 如果你使用root用户,那你可以不用做这个操作。
- 注意,这个操作会覆盖你的
~/.kube/config
配置文件,请确认这个文件不存在再操作。 然后去掉sudo cat /root/.kube/config > ~/.kube/config
sudo
命令查看一下集群节点。kubectl get node
部署第一个应用
创建Deployment
Deployment相当于一个蓝图,它描述了我们想要运行的应用程序长什么样子。比如说,我们要运行3个Tomcat容器,每个容器的版本是10,对外暴露8080端口,这就是我们定义在Deployment里的内容。
集群创建好了,我们部署一个nginx试试。
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:10
ports:
- containerPort: 8080
EOF
查看部署状态,等待部署完成。
kubectl rollout status deployment/tomcat-deployment
查看一下Pod状态,我们应该可以看到启动了3个tomcat
kubectl get pod
将Tomcat服务暴露出来
创建Service
Service是把多个Pod组合在一起,给它们分配一个统一的入口地址。这样,我们就可以通过这个地址访问到任意一个Pod提供的服务了。Service有点像是这些Pod的”代理”和”负载均衡器”。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Service metadata: name: tomcat-svc spec: selector: app: tomcat ports: - protocol: TCP port: 80 targetPort: 8080 EOF
创建Ingress
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tomcat
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat-svc
port:
number: 80
EOF
打开你的浏览器,访问 http://<你的机器ip>:8180/
。
Wow! 熟悉的Tomcat 404界面他来了。
清理
一个命令删除我们的测试集群,纯净无残留~
sudo k3d cluster delete hello-k3d