暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

RancherLabs 2021-04-20
623

本周四晚上8点,Rancher携手JFrog在线直播啦!

来自Rancher的客户技术经理和来自JFrog的中国首席架构师将围绕DevOps分别和你聊聊如何基于K3s落地DevOps流水线以及如何利用Artifactory 提升Docker 应用发布的效率。


点击【阅读原文】,或访问以下链接即可报名:

http://z-mz.cn/16O0Y


简  介


本文将介绍在高可用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/en-us/free/

  • 访问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,身份验证变得十分容易,并且可以“开箱即用”地使用我们所需的所有工具。


                                                                            推荐阅读

                                                                            Kubernetes Ingress简单入门

                                                                            轻松扩展机器学习能力:如何在Rancher上安装Kubeflow

                                                                            8大DevOps自动化工具,提升IT部署效率!



                                                                            本周四晚上8点,Rancher携手JFrog在线直播啦!来自Rancher的客户技术经理和来自JFrog的中国首席架构师将围绕DevOps分别和你聊聊如何基于K3s落地DevOps流水线以及如何利用Artifactory 提升Docker 应用发布的效率。点击【阅读原文】即可报名咯!



                                                                            About Rancher Labs


                                                                            Rancher Labs由CloudStack之父梁胜创建。旗舰产品Rancher是一个开源的企业级Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理。Rancher一向因操作体验的直观、极简备受用户青睐,被Forrester评为2018年全球容器管理平台领导厂商,被Gartner评为2017年全球最酷的云基础设施供应商。


                                                                            目前Rancher在全球拥有超过三亿的核心镜像下载量,并拥有包括CCTV、中国联通、华为、中国平安、中国人寿、厦门航空、上汽集团、丰田、中联重科、迪斯尼、IBM、Cisco、Nvidia、辉瑞制药等全球著名企业在内的共40000家企业客户。


                                                                            Rancher已于2020年2月完成了中国本土化和国产化,从2020年3月1日开始,Rancher在中国大陆及港澳台地区的业务,均由全中资公司云澈信息技术(深圳)有限公司承载,并面向中国企业客户提供中国企业版Rancher产品和基于K3s的“软件定义边缘”解决方案。



                                                                            点击阅读原文,了解DevOps的新玩法!

                                                                            ↓↓↓
                                                                            文章转载自RancherLabs,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                            评论