实用教程丨使用K3s和MySQL运行Rancher-24

3次阅读

共计 8849 个字符,预计需要花费 23 分钟才能阅读完成。

本文转自 Rancher Labs

简 介

本文将介绍在高可用 K3s Kubernetes 集群上安装 Rancher 2.4 的过程并针对 MySQL 利用 Microsoft Azure 数据库的优势,该数据库消除了对 etcd 的依赖,并为我们提供了 Azure 在这一服务中的所有其他功能。

在本文中,你将了解到只使用 Azure Cloud Shell 如何部署基础架构以支持此方式。使用 Cloud Shell 的好处是零基础架构即可上手——仅需访问 Azure 门户即可。并且许多所需的 CLI 功能已经预先安装好,从而大大减少了完成安装所需的工作量。

你部署完成基础架构后,你将了解如何使用 K3s 在一个 Kubernetes 集群上部署 Rancher 2.4。在 Rancher 2.4 中,我们已经添加了新的部署支持模式:在两个节点上的 Rancher 2.4 运行带有外部数据库的 K3s。使用这一模式的好处之一是我们可以将节点视为短暂的。由于 K3s 支持外部 MySQL 数据库,因此我们可以做到这一点。

K3s 是一个轻量的 Kubernetes 发行版,它比 Rancher Kubernetes Engine(RKE)更先进,并且具有以下增强功能:

  1. 嵌入式 SQLite 数据库替换了 etcd,成为默认的数据存储,它还支持外部数据存储,例如 PostgreSQL、MySQL 和 etcd。(本文中我们将使用 MySQL)
  2. 我们添加了简单但功能强大的“开箱即用”的功能,例如本地存储程序、服务负载均衡器、Helm controller 以及 Traefik controller。
  3. 所有 Kubernetes 控制平面组件的操作都封装在单个二进制文件和进程中。这使 K3s 可以自动化和管理复杂的集群操作,例如分发证书。
  4. 我们移除了 in-tree 云提供程序和存储插件
  5. 我们已将外部依赖性降到最低(仅需要现代内核和 cgroup 挂载)。K3s 软件包需要依赖项,包括:Containerd、Flannel、CoreDNS 和主机实用程序(iptables、socat 等)

如果你是第一次尝试使用 Rancher,可以考虑这种部署模式。这很有可能在之后成为部署 Rancher 的首选方法,提前了解总是好的——尤其是在 Azure 运行数据中心时。

前期准备

为了完成以下内容,你需要提前准备:

  • Microsoft 账号:Microsoft 的登录凭证。可以是你的 Azure Active Directory 凭据,也可以是普通的 Outlook 账户。
  • 访问一个 Azure 订阅:可以是免费试用 / 随用随付 / 也可以是企业订阅(https://azure.microsoft.com/e…)
  • 访问 Azure 门户(https://portal.azure.com/#home)

架 构

以下图片展示了将要在 Azure 中创建的资源:

这两个节点将放在单个子网(subnet)中的自己的 vNet 上。这些将在 Azure 负载平衡器的前面。MySQL 数据库将从外部的 vNet 提供,vNet 由 Microsoft 托管。然后通过连接到子网的单个网络安全组(NSG)保护节点。

Azure Cloud Shell

我们将只使用 Azure Cloud Shell 来配置在 Azure 中的 K3s 上运行 Rancher 所需的所有元素。在门户中,单击右上角的“Azure Cloud Shell”按钮。该图标中有大于符号和下划线。

Azure 网络

资源组

在 Azure 中,所有资源需要归属于某个资源组,所以我们得先创建资源组。我们将设置默认区域和资源组,以确保我们所有的资源都会被创建到正确的位置。

请注意:我使用 eastus2 作为我的区域,但你可以根据自身需要进行更改。

az group create -l eastus2  -n RancherK3sResourceGroup
az configure --defaults location=eastus2 group=RancherK3sResourceGroup

Vnet、公共 IP 和网络安全组(NSG)

这些命令完成后,将在资源组内部创建网络组件。其中包括带有默认子网的 vNet,我们稍后将创建的两个虚拟机(VM)的两个公共 IP,以及一个网络安全组(NSG)。

az network vnet create --resource-group RancherK3sResourceGroup --name RancherK3sVnet --subnet-name RancherK3sSubnet

az network public-ip create --resource-group RancherK3sResourceGroup --name RancherK3sPublicIP1 --sku standard

az network public-ip create --resource-group RancherK3sResourceGroup --name RancherK3sPublicIP2 --sku standard

az network nsg create --resource-group RancherK3sResourceGroup --name RancherK3sNSG1

az network nsg rule create -g RancherK3sResourceGroup --nsg-name RancherK3sNSG1 -n NsgRuleSSH --priority 100 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 22 --access Allow \
--protocol Tcp --description "Allow SSH Access to all VMS."

Azure 负载均衡器

我们在两个 VM 上安装 K3s 之后,我们需要一个负载均衡器来提供弹性并防止 VM 故障。

首先,为负载均衡器创建一个公共 IP

az network public-ip create --resource-group RancherK3sResourceGroup --name RancherLBPublicIP --sku standard

接下来,使用健康的探针(probe)创建负载均衡器

az network lb create \
--resource-group RancherK3sResourceGroup \
--name K3sLoadBalancer \
--sku standard \
--public-ip-address RancherLBPublicIP \
--frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool

az network lb probe create \
--resource-group RancherK3sResourceGroup \
--lb-name K3sLoadBalancer \
--name myHealthProbe \
--protocol tcp \
--port 80

负载均衡器创建完成后,更新 NSG。添加 80 和 443 端口,用于访问 Rancher Server,再添加一个 6443 端口,用于访问 K3s 的 Kubernetes API。

az network nsg rule create \
--resource-group RancherK3sResourceGroup \
--nsg-name RancherK3sNSG1 \
--name myNetworkSecurityGroupRuleHTTP \
--protocol tcp \
--direction inbound \
--source-address-prefix '*' \
--source-port-range '*' \
--destination-address-prefix '*' \
--destination-port-range 80 443 6443 \
--access allow \
--priority 200

现在以三个规则的形式添加负载均衡器配置。你需要一个用于端口 80 的规则和一个用于端口 443 的规则,以分散两个 VM 上 Rancher Server 的负载。第三条规则用于端口 6443,该端口可访问在每个 VM 上运行的 Kubernetes API。

az network lb rule create \
--resource-group RancherK3sResourceGroup \
--lb-name K3sLoadBalancer \
--name myHTTPRule \
--protocol tcp \
--frontend-port 80 \
--backend-port 80 \
--frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool \
--probe-name myHealthProbe

az network lb rule create \
--resource-group RancherK3sResourceGroup \
--lb-name K3sLoadBalancer \
--name myHTTPSRule \
--protocol tcp \
--frontend-port 443 \
--backend-port 443 \
--frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool \
--probe-name myHealthProbe

az network lb rule create \
--resource-group RancherK3sResourceGroup \
--lb-name K3sLoadBalancer \
--name myHTTPS6443Rule \
--protocol tcp \
--frontend-port 6443 \
--backend-port 6443 \
--frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool \
--probe-name myHealthProbe

Azure 数据库即服务(DaaS)

使用 K3s 作为 Kubernetes 发行版的好处之一是它支持 etcd 的替代版本,在本例中,我们将使用 Azure 数据库中的 MySQL 作为数据库。

要创建 MySQL 数据库,请运行以下 CLI 命令。

首先让我们为数据库服务器的名称创建一个变量,这样可以让运行后续命令更加容易。注意数据库服务器的名称在整个 Azure 必须是唯一的,否则你将会在创建时出错。

K3smysqlserver=<unique-myslq-server-name>

创建你的 MySQL 服务器。如果名称不是唯一的,将显示错误。如果是,那么使用新名称更新变量,然后再次运行此命令。

az mysql server create --resource-group RancherK3sResourceGroup --name $K3smysqlserver --admin-user myadmin --admin-password Password1 --sku-name GP_Gen5_2 --version 5.7

创建防火墙规则以允许所有的 Azure IP 可以访问你的数据库服务器。

az mysql server firewall-rule create --resource-group RancherK3sResourceGroup --server $K3smysqlserver --name "AllowAllWindowsAzureIps" --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

为现有的子网添加 service endpoint。

az network vnet subnet update --vnet-name RancherK3sVnet --name RancherK3sSubnet --service-endpoints "Microsoft.Sql"

将 vnet 规则添加到数据库访问。

az mysql server vnet-rule create --server $K3smysqlserver --name MyK3sVNetRule \
-g RancherK3sResourceGroup --subnet RancherK3sSubnet --vnet-name RancherK3sVnet

为数据库通信禁用 TLS

az mysql server update --resource-group RancherK3sResourceGroup --name $K3smysqlserver --ssl-enforcement Disabled

在 Azure Cloud Shell 中已经安装好 MySQL CLI 工具了。下一步是连接到 MySQL 服务器并创建一个数据库。

连接到新的 MySQL 服务器。

mysql --host $K3smysqlserver.mysql.database.azure.com --user myadmin@$K3smysqlserver -p

检查状态,确保 MySQL 正在运行。

status

创建一个空的数据库。

CREATE DATABASE kubernetes;

SHOW DATABASES;

exit

Azure 虚拟机

接下来,我们将创建 2 个虚拟机并在它们上面安装 K3s。

网络接口

创建所有网络元素后,我们可以为 VM 创建网络接口卡(NIC)。

az network nic create --resource-group RancherK3sResourceGroup --name nic1 --vnet-name RancherK3sVnet --subnet RancherK3sSubnet --network-security-group RancherK3sNSG1 --public-ip-address RancherK3sPublicIP1 --lb-name K3sLoadBalancer --lb-address-pools myBackEndPool

az network nic create --resource-group RancherK3sResourceGroup --name nic2 --vnet-name RancherK3sVnet --subnet RancherK3sSubnet --network-security-group RancherK3sNSG1 --public-ip-address RancherK3sPublicIP2 --lb-name K3sLoadBalancer --lb-address-pools myBackEndPool

创建虚拟机

要创建 2 个虚拟机,首先需要使用我们的 cloud-init 配置创建一个文本文件。这将部署 Docker、添加 ubuntu 用户到 docker 组并安装 K3s。

cat << EOF > cloud-init.txt
#cloud-config
package_upgrade: true
packages:
  - curl
output: {all: '| tee -a /var/log/cloud-init-output.log'}
runcmd:
  - curl https://releases.rancher.com/install-docker/18.09.sh | sh
  - sudo usermod -aG docker ubuntu
  - curl -sfL https://get.k3s.io | sh -s - server --datastore-endpoint="mysql://myadmin@$K3smysqlserver:Password1@tcp($K3smysqlserver.mysql.database.azure.com:3306)/kubernetes"
EOF

部署虚拟机。

az vm create \
--resource-group RancherK3sResourceGroup \
--name K3sNode1 \
--image UbuntuLTS \
--nics nic1 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt


az vm create \
--resource-group RancherK3sResourceGroup \
--name K3sNode2 \
--image UbuntuLTS \
--nics nic2 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt

检查 Kubernetes 是否正在运行

作为 VM 配置的一部分,K3s 应该已经安装完毕。让我们连接到第一个 VM 并确认 K3s 是否正在运行。

ssh ubuntu@<publicIPofNode1>

两个 VM 应该都在节点列表上。如果第一次没有成功,那么需要给它几分钟的时间来运行 cloud-init 脚本。它可能需要花费一些时间来部署 Docker 和 K3s。

sudo k3s kubectl get nodes

输出为:

ubuntu@ip-172-31-60-194:~$ sudo k3s kubectl get nodes
NAME               STATUS   ROLES    AGE    VERSION
ip-172-31-60-194   Ready    master   44m    v1.17.2+k3s1
ip-172-31-63-88    Ready    master   6m8s   v1.17.2+k3s1

测试集群 Pod 的健康状态:

sudo k3s kubectl get pods --all-namespaces

保存并开始使用 kubeconfig 文件

在连接到我们其中之一的节点的同时,我们需要获取集群的 kubeconfig 内容。使用以下命令将内容输出到屏幕,然后将其复制到剪贴板。

sudo cat /etc/rancher/k3s/k3s.yaml

将其粘贴到文本编辑器中,以便我们可以进行更改,然后再将其添加到我们正在处理的 Azure Cloud Shell 会话中。

更新server:使用负载均衡器的外部 URL。你可以使用 xip.io 服务为你提供可解析的完全限定域名。请参见下面的屏幕截图。

例如:

https://rancher.<LoadBalancerPublicIP>.xip.io:6443>

注意:需要将截屏中的示例替换为你的负载均衡器的公共 IP。

现在,在 /.kube 文件夹中创建一个名为 config 的文件,并将更新的内容粘贴到该文件中。

首先,从 node1 开始解除连接。

exit

现在创建新的目录并编辑文件,粘贴到已经更新的内容中。

mkdir ~/.kube
vi ~/.kube/config

检查 kubectl 是否正在工作并能否与集群交互。现在 Kubectl 和 Helm 已经在 Azure Cloud Shell 中安装完毕。

kubectl get pods --all-namespaces

安装 Rancher

添加 Rancher Helm Repo

helm repo add rancher-latest https://releases.rancher.com/server-charts/latest

创建 cattle-system 命名空间

kubectl create namespace cattle-system

分别安装 CustomResourceDefinition 资源

kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml

cert-manager 创建命名空间

kubectl create namespace cert-manager

添加 Jetstack Helm 代码库

helm repo add jetstack https://charts.jetstack.io

更新你的本地 Helm chart 代码库缓存

helm repo update

安装 cert-manager Helm chart

helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v0.12.0

检查 Cert-Manager 是否正在运行,确保所有的 pod 都正在运行。

kubectl get pods --namespace cert-manager

使用自签名证书安装 Rancher。确保你使用 Rancher Server 的 URL 设置了主机名。在本文中,我们利用 xip.io 服务。在 Rancher URL 中使用 Azure 负载均衡器的公共 IP 地址。

helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.<LoadBalancerPublicIP>.xip.io

等待 Rancher 部署……

kubectl -n cattle-system rollout status deploy/rancher

三个副本全部 roll out 之后,请点击 Rancher server deployment 的 URL,如下所示:

清 理

在 Azure 中创建资源会产生费用,因此请确保在完成操作后删除资源组。

az group delete --name RancherK3sResourceGroup

结 论

在本文中,我们提供了一种快速简便的方法使用 Rancher 对 Azure 中的容器化工作负载进行多集群管理。通过使用 K3s,我们不仅能够非常快速地启动并运行,而且移除了 etcd 同时避免了在生产环境中运行它会产生的一些麻烦。通过使用 Azure Cloud Shell,身份验证变得十分容易,并且可以“开箱即用”地使用我们所需的所有工具。

正文完
 0