k3d - 3分钟创建一个生产级k8s集群

本标题可能有歧义,此集群只用于本地测试,请勿用于生产(我想也没人会这么干)

当我们谈论到容器编排技术时,Kubernetes(简称K8s)无疑是一个家喻户晓的名字。

但是,对于想要学习Kubernetes的人来说,搭建一个本地环境却往往是一件头疼的事情。从安装各种依赖到配置繁琐的集群,这一过程常常让人望而却步。

这个时候,就需要 k3d 闪亮登场啦。k3d可以说是k8s本地环境的”最佳拍档”。它使用了轻量级的k3s发行版,并借助Docker容器技术,让我们仅通过一个命令,就可以拥有一个多节点的k8s集群环境,省去了繁琐的安装和配置过程。

虽然我们也有 Minikube 和 Kind ,但k3d天生支持多节点集群,可以快速启动多master或多worker节点。而 Minikube 和 Kind 就更加麻烦了。

环境

首先我们需要安装好 dockerkubectl
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服务暴露出来

  1. 创建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
  2. 创建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

k3d - 3分钟创建一个生产级k8s集群
https://coding.gs/2024/04/03/k3d/getting-started-with-k3d/
作者
K
发布于
2024年4月3日
许可协议