本文转自Rancher Labsnode
本文将介绍在高可用K3s Kubernetes集群上安装Rancher 2.4的过程并针对MySQL利用Microsoft Azure数据库的优点,该数据库消除了对etcd的依赖,并为咱们提供了Azure在这一服务中的全部其余功能。mysql
在本文中,你将了解到只使用Azure Cloud Shell如何部署基础架构以支持此方式。使用Cloud Shell的好处是零基础架构便可上手——仅需访问Azure门户便可。而且许多所需的CLI功能已经预先安装好,从而大大减小了完成安装所需的工做量。git
你部署完成基础架构后,你将了解如何使用K3s在一个Kubernetes集群上部署Rancher 2.4。在Rancher 2.4中,咱们已经添加了新的部署支持模式:在两个节点上的Rancher 2.4运行带有外部数据库的K3s。使用这一模式的好处之一是咱们能够将节点视为短暂的。因为K3s支持外部MySQL数据库,所以咱们能够作到这一点。github
K3s是一个轻量的Kubernetes发行版,它比Rancher Kubernetes Engine(RKE)更先进,而且具备如下加强功能:sql
嵌入式SQLite数据库替换了etcd,成为默认的数据存储,它还支持外部数据存储,例如PostgreSQL、MySQL和etcd。(本文中咱们将使用MySQL)docker
咱们添加了简单但功能强大的“开箱即用”的功能,例如本地存储程序、服务负载均衡器、Helm controller以及Traefik controller。shell
全部Kubernetes控制平面组件的操做都封装在单个二进制文件和进程中。这使K3s能够自动化和管理复杂的集群操做,例如分发证书。数据库
咱们移除了in-tree云提供程序和存储插件ubuntu
咱们已将外部依赖性降到最低(仅须要现代内核和cgroup挂载)。K3s软件包须要依赖项,包括:Containerd、Flannel、CoreDNS和主机实用程序(iptables、socat等)缓存
若是你是第一次尝试使用Rancher,能够考虑这种部署模式。这颇有可能在以后成为部署Rancher的首选方法,提早了解老是好的——尤为是在Azure运行数据中心时。
为了完成如下内容,你须要提早准备:
Microsoft帐号:Microsoft的登陆凭证。能够是你的Azure Active Directory凭据,也能够是普通的Outlook帐户。
访问一个Azure订阅:能够是免费试用/随用随付/也能够是企业订阅(https://azure.microsoft.com/en-us/free/ )
访问Azure门户(https://portal.azure.com/#home )
如下图片展现了将要在Azure中建立的资源:
这两个节点将放在单个子网(subnet)中的本身的vNet上。这些将在Azure负载平衡器的前面。MySQL数据库将从外部的vNet提供,vNet由Microsoft托管。而后经过链接到子网的单个网络安全组(NSG)保护节点。
咱们将只使用Azure Cloud Shell来配置在Azure中的K3s上运行Rancher所需的全部元素。在门户中,单击右上角的“Azure Cloud Shell”按钮。该图标中有大于符号和下划线。
在Azure中,全部资源须要归属于某个资源组,因此咱们得先建立资源组。咱们将设置默认区域和资源组,以确保咱们全部的资源都会被建立到正确的位置。
请注意:我使用eastus2做为个人区域,但你能够根据自身须要进行更改。
az group create -l eastus2 -n RancherK3sResourceGroup az configure --defaults location=eastus2 group=RancherK3sResourceGroup
这些命令完成后,将在资源组内部建立网络组件。其中包括带有默认子网的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."
咱们在两个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
使用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
接下来,咱们将建立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
做为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内容。使用如下命令将内容输出到屏幕,而后将其复制到剪贴板。
sudo cat /etc/rancher/k3s/k3s.yaml
将其粘贴到文本编辑器中,以便咱们能够进行更改,而后再将其添加到咱们正在处理的Azure Cloud Shell会话中。
更新server
:使用负载均衡器的外部URL。你可使用xip.io服务为你提供可解析的彻底限定域名。请参见下面的屏幕截图。
例如:
https://rancher.
注意:须要将截屏中的示例替换为你的负载均衡器的公共IP。
如今,在/.kube
文件夹中建立一个名为config
的文件,并将更新的内容粘贴到该文件中。
首先,从node1开始解除链接。
exit
如今建立新的目录并编辑文件,粘贴到已经更新的内容中。
mkdir ~/.kube vi ~/.kube/config
检查kubectl是否正在工做并可否与集群交互。如今Kubectl和Helm已经在Azure Cloud Shell中安装完毕。
kubectl get pods --all-namespaces
添加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,身份验证变得十分容易,而且能够“开箱即用”地使用咱们所需的全部工具。