zoukankan      html  css  js  c++  java
  • Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

         前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行。当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for desktop中启用就可以了。但是我发现,启用了k8s后,Docker for desktop会消耗大量的系统资源,导致系统变得很慢。据说windows 上的WSL 2 性能不错,这次我尝试在WSL Linux上安装K8s并部署我们的微服务,看看还会不会出现系统资源消耗过大的情况。

         关于网络:我用的是外企公司的VPN关于系统:我用的是Windows 11 1000.22000.168.0

    1         在WSL上安装k8s集群

    1.1         从微软商店安装“Windows Terminal”

    Windows Terminal用来连接管理WSL中的Linux Ubuntu。

     

    1.2         在本地电脑安装“Lens”

    Lens用来连接管理k8s集群,启动界面如下:

     

    1.3         启用Windows功能“虚拟机平台”

    启用虚拟机平台是安装WSL 2 的必要条件

     

    1.4         从微软商店安装“Ubuntu”

    安装WSL兼容的Linux Ubuntu

     

    安装完成后,从开始菜单打开Ubuntu应用(命令窗口),提示用户输入用户和密码,设置好后,我们需要设置root用户的密码,命令为:

    sudo passwd root

    1.5         安装Docker for desktop 并启用WSL集成

    为了更好的性能和程序开发方便,微软不建议在 WSL Ubuntu 中直接安装Docker,而是通过Docker for desktop与WSL 互操作的方式在Ubuntu中使用Docker。安装地址:Docker Desktop for Mac and Windows | Docker

     

     

    1.6         在Ubuntu 中安装Kind

    通过Windows terminal 连接 Ubuntu

     

    通过su命令切换到root用户,然后执行更新apt工具命令:

    apt update && apt upgrade -y

    安装Kind最新版本,需要依次执行如下命令:

    # 下载 KinD 二进制文件
    
    curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.11.1/kind-$(uname)-amd64
    
    # 标记为可执行文件
    
    chmod +x ./kind
    
    # 移动到 PATH 目录下去
    
    mv ./kind /usr/local/bin/
    
    #查看kind版本
    
    kind version
    
    #输出:kind v0.11.1 go1.16.4 linux/amd64

    1.7         在Ubuntu 中安装 Kubectl 工具

    本步骤可选,因为我们也可以从本地电脑kubectl工具或者lens来管理k8s集群.

    安装步骤如下(和Kind的安装步骤类似):

    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
    
    chmod +x ./kubectl
    
    sudo mv ./kubectl /usr/local/bin/kubectl

    kubectl version

    1.8         在Ubuntu 中用Kind 创建K8s 集群

    首先创建k8s集群创建配置文件(该集群包含一个控制面板节点和一个工作节点)

    # 创建一个2节点集群的配置文件
    
    cat << EOF > kind-3nodes.yaml
    
    apiVersion: kind.x-k8s.io/v1alpha4
    
    kind: Cluster
    
    nodes:
    
    - role: control-plane
    
      extraPortMappings:
    
      - containerPort: 30000
    
        hostPort: 30000
    
        listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    
        protocol: tcp # Optional, defaults to tcp
    
    - role: worker
    
    EOF

    注意文件中“extraPortMappings” 配置节,是用来将Ubuntu上的k8s容器30000端口暴漏给localhost(kind是通过容器来运行k8s 节点), 这样我们就可以通过localhost:30000访问k8s集群中的服务。

    然后根据配置文件创建k8s集群

    # 使用配置文件创建新的集群
    
    kind create cluster --name wslk8s --config ./kind-3nodes.yaml

    创建完成后,我们可用命令kubectl cluster-info 查看集群信息(如果我们在Ubuntu上安装了Kubectl工具的话)。

    1.9         用Lens和本地Kubectl 工具连接k8s集群

    在Ubuntu中打开k8s连接配置文件,并拷贝文件内容。

    cat $HOME/.kube/config

    将文件内容拷贝到本地电脑的C:Users[用户名]/.kube/cofnig 文件。

    然后就可以在本地电脑用kubectl cluster-info 查看集群信息,也可以打开Lens, 看到集群信息。

     

    2         在k8s集群上部署微服务

    2.1         在本地电脑用Dapr cli 安装 Dapr 到K8s 集群

    因为我们的微服务示例程序是基于Dapr的,我们也能够从本地电脑连接到k8s集群,我们需要从本地电脑上通过Dapr Cli 安装Dapr 到 k8s集群。

    Dapr init -k

    2.2         在本地电脑从微服务项目生成镜像

    和以前一样,我们从本地电脑的项目文件中生成镜像,运行

    ./build-docker-images.ps1

    2.3         在Ubuntu 中用Kind将镜像加载到k8s集群

    因为Kind 是把K8s的node放到容器中运行,导致k8s找不到我们自己生成的镜像(错误:ImagePullError),我们需要通过Kind把我们的镜像加载到k8s集群。

    kind load docker-image dapr-test1/blazorweb:3.0 --name wslk8s
    
    kind load docker-image dapr-test1/serviceapi1:3.0 --name wslk8s

    2.4         在本地电脑用Kubectl工具部署微服务

    在项目的Deploy 文件中运行 ./Deploy.ps1命令即可部署我们的微服务到K8s集群/

    容器运行后,可通过http://localhost:30000访问我们的示例微服务。

     

    查看任务管理器,发现通过WSL运行k8s的系统资源消耗比以前用Docker for desktop少了,系统运行也流畅了。

    3         遗留待处理问题

    3.1         Kind 部署K8s的 Nodeport问题

    因为Kind是将K8s节点放到容器中运行,需要通过对localhost暴漏端口的方式来访问微服务,微服务Nodeport配置的暴端口必须和k8s节点的暴漏端口一致才可以访问。但是,如果我们的集群上有多个微服务系统怎么访问呢?目前的想法是微服务通过Ingress的方式提供对外访问,为每个微服务系统配置不同的域名。参考kind – Ingress (k8s.io)Kubernetes ingress same path multiple ports - Stack Overflow

    3.2         公共服务的访问问题。

    我们每个微服务系统都会用到redis,RabbitMQ和zipkin等,没有必要每个微服务系统都配置这些基础服务容器来运行,计划把这些基础服务以通过Docker容器(暴漏localhost 端口)的方式运行,其它微服务系统通过定义Serivice 和Endpoints的方式来访问这些基础服务。参考mongodb - How to access host's localhost from inside kubernetes cluster - Stack Overflow ,需要测试用域名kubernetes.docker.internal 是否可以从k8s集群内部访问localhost上的容器暴漏端口。

  • 相关阅读:
    自定义udf添加一列
    spark执行命令 监控执行命令
    R链接hive/oracle/mysql
    [Hive_6] Hive 的内置函数应用
    [Hive_add_6] Hive 实现 Word Count
    [Hive_add_5] Hive 的 join 操作
    【爬坑】远程连接 MySQL 失败
    [Hive_add_4] Hive 命令行客户端 Beeline 的使用
    [Hive_5] Hive 的 JDBC 编程
    [Hive_add_3] Hive 进行简单数据处理
  • 原文地址:https://www.cnblogs.com/xiaozhuang/p/15219637.html
Copyright © 2011-2022 走看看