19

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

 4 years ago
source link: http://dockone.io/article/10387
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文转自[Rancher Labs]( https://mp.weixin.qq.com/s/dlUqwLs5_mU7ishJPEO0bQ "Rancher Labs")

FVvyYfn.png!web

简 介

本文将介绍在高可用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运行数据中心时。

前期准备

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

架 构

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

2iYNRrB.png!web

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

Azure Cloud Shell

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

rquQnaB.png!web

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.<LoadBalancerPublicI P>.xip.io:6443>

22E7N3Y.png!web

注意:需要将截屏中的示例替换为你的负载均衡器的公共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,如下所示:

BnaaauJ.png!web

清 理

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

az group delete --name RancherK3sResourceGroup

结 论

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK