【K3s】在 AWS EC2 上运行生产 K3s 集群
推荐超级课程:
本文将介绍如何在 AWS EC2 上运行 K3s。您将创建一个 EC2 实例并在 AWS 上运行单节点 K3s 集群。
自托管的 K3s 允许您在裸金属上运行 Kubernetes,并应用较小、低资源工作负载的原则。哦,你还可以控制你的控制平面。这有点像逃离托管 Kubernetes 的黑匣子。K3s 让一个小公司开发产品的服务器成本更合理。
设置 K3s AWS EC2 实例
EC2 就像是托管在云端的典型计算机。第一步是选择您擅长使用的操作系统发行版。本演示使用 Ubuntu 机器。按照以下步骤操作:
使用 Ubuntu 创建您的实例。记得始终检查是否使用了符合免费套餐资格的服务;在这种情况下,t2.micro
和 t3.micro
服务器类型将很好:
为了通过安全的 SSH 客户端访问实例,请创建一个 SSH 密钥并将其分配给这个 EC2:
您计划将这个 EC2 暴露给公众,并主要使用域名来访问运行在 AWS 上的 K3s 集群吗?设置您的网络,以便集群可以允许来自互联网的 HTTP 和 HTTPS 流量:
如果您准备好了这些设置,启动您的实例。
创建一个永久 K3S AWS EC2 IP 地址
您的 EC2 将暴露给互联网。如果它重新启动,将会被分配一个新的 IP 地址。您不想发生这种情况。流量必须指向一个稳定的 IP 地址。
前往 弹性 IP:
按照以下步骤 配置 Elastic IP 地址:
您无需进一步编辑这些设置。点击 Allocate 继续创建 Elastic IP 地址。
您的实例将被分配到这个 IP。但您需要 选择这个 IP,在 操作(Action) 中选择 关联 Elastic IP 地址。
您将选择您的实例和私有 IP 地址最后 关联 这个 IP。
实例已经运行并准备配置 K3s AWS EC2:
使用 SSH 访问 AWS EC2
要在 AWS EC2 上设置 K3s,您必须在终端中访问 EC2 实例以运行设置 K3s 的命令。
一种方法是使用通过 FTP 生成的密钥对来使用 SSH 访问实例。如果您知道如何使用这个选项,请继续使用。
然而,为了简化操作,您可以使用在线 AWS SSH 客户端,如下:
- 选择您的实例并导航至 连接:
- 选择使用 EC2 实例连接:
- 浏览器将启动一个终端,您可以在其中运行命令:
在 AWS EC2 上安装 K3s
使用单个命令即可快速启动 K3s。以下是在 K3s 文档中提供的基本安装命令 K3s :
curl -sfL https://get.k3s.io | sh -
现在运行以下命令检查 K3s 服务器是否正在运行:
kubectl get nodes
# 或者
kubectl cluster-info
如果您遇到错误,例如:
前往本指南并学习 解决 WARN\[0003\] 无法读取 /etc/rancher/k3s/k3s.yaml 错误 。
顺便说一句,以下命令是解决此错误的最佳命令:
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
关于 k3s AWS EC2 的一个快速注释:如果您从生产目的运行此设置,我已包含了以下命令。我添加了一个
--tls-san
作为配置值 来为 K3s 安装添加主机名或 IPv4/IPv6 地址。这不是必须使用的设置。但是,如果您想使用 TLS 证书,您需要使用您的 IPv4 地址作为your_server_ip
值来安装 K3s 在以下命令中:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--tls-san your_server_ip" sh -
在 AWS EC2 上运行 K3s Kubernetes 集群
就安装 K3s 所需的来说,这就是您所需要的。现在让我们在此服务器上运行一个应用程序。
为了简化操作,我创建了一个简单的静态网页应用程序,使用 React 并将其制作为 DockerHub 中的镜像。
这是我如何创建一个经过 dockerize 处理后的 DockerHub 镜像。如果要跟随 React,请确保您的本地计算机已设置 Node.js 。
首先,创建您的应用程序。使用以下命令安装应用程序:
npx create-react-app my-react-app
现在将目录更改为创建的应用程序目录:
cd my-react-app
我将继续编辑这里的一个文件。导航至 /src/App.js
文件并添加以下一行:
<p>
欢迎访问运行在 AWS EC2 上的 K3 Kubernetes 集群
</p>
使用以下命令启动 React:
npm start
在浏览器上使用 http://localhost:3000/
打开应用程序。您将在浏览器上接收到运行在 AWS EC2 上的 K3s 集群中的相同应用程序:
Dockerize 应用程序
现在,您必须确保有一个 Dockerfile 为您的特定应用程序构建一个镜像。
在您的 my-react-app
目录中,创建一个 Dockerfile
并添加以下指令:
FROM node:19-alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
RUN npm install
COPY ./ ./
CMD ["npm", "start"]
注意:您可以创建比这个更好的 Dockerfile。这个例子是为了演示让您启动一个应用程序。因此,请为一个准备投入生产的 Dockerfile 进行优化。
K3s 在 AWS EC2 上将访问此镜像。简单来说,AWS EC2 是一项云服务。要访问您的镜像,您还必须将其托管在互联网上。DockerHub 就是这样做的好地方。
让我们构建镜像并将其存储在 DockerHub 中的存储器中:
在您的 Dockerfile
根目录中,运行以下命令:
- 登录到 Docker Hub:
docker login
添加 DockerHub 用户名和密码。如果您没有,前往 DockerHub 创建一个帐户。
- 使用 DockerHub 用户名构建您的镜像
docker build -t your_dockerhub_username/my-react-app .
- 推送并发布镜像到 DockerHub:
docker push your_dockerhub_username/my-react-app:latest
在 AWS EC2 上创建 K3s Kubernetes 集群
为了运行此应用程序,在 AWS EC2 上创建 K3s Kubernetes 集群。
在您的 EC2 SSH 终端中,创建一个 Kubernetes 部署文件:
nano deployment.yml
并将以下 K3s 部署配置添加到这个 deployment.yml
文件中并保存:
apiVersion: apps/v1
kind: Deployment
metadata:
name: react-deployment
labels:
app: react-app
spec:
replicas: 1
selector:
matchLabels:
app: react-app
template:
metadata:
labels:
app: react-app
spec:
containers:
- name: react-app
image: your_dockerhub_username/my-react-app
imagePullPolicy: Always
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
labels:
app: react-app-service
name: react-app-service
namespace: default
spec:
ports:
- name: 3000-3000
port: 3000
protocol: TCP
targetPort: 3000
selector:
app: react-app
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: react-app-ingress
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: react-app-service
port:
number: 3000
在这个 deployment.yml
文件中:
- 您有将应用程序镜像运行在
image: your_dockerhub_username/my-react-app
上的部署。因此,请确保your_dockerhub_username
反映了您的 DockerHub 用户名。 - 将应用程序暴露在
ClusterIP
上的服务 - Traefik 以负载均衡器的形式运行 Ingress,将流量路由到服务并暴露应用程序。
部署 K3s AWS EC2 集群
现在您已经准备好所有文件。让我们启动集群。执行以下命令:
kubectl apply -f deployment.yml
要确认集群正在运行,请检查其 Pod 状态:
kubectl get pods
如果您在这里遇到错误,例如 无法连接到服务器: net/http: TLS 握手超时。这意味着您的 AWS EC2 实例没有足够的资源。考虑使用更大的实例类型创建您的实例。但是,请记住,如果您用于测试目的,请删除它以避免额外的 AWS 费用。
Pod 正在运行。要测试此部署,打开浏览器并输入您的 EC2 弹性 IP 地址。例如,在这里,我使用的是 44.212.229.204。这将在浏览器上为我提供以下应用程序: