练习 - 将微服务容器部署到 Kubernetes
Kubernetes 为你运行容器。 描述希望 Kubernetes 通过 YAML 文件执行的作。 本练习将指导你创建文件,以便可以在 Kubernetes 上部署和运行 后端 服务。
重要
在继续作之前,必须确保已安装 Kubernetes 实现。 我们将使用在代码空间中运行的 k3d 实现。 我们将通过安装此实现来启动实验室。
安装 Kubernetes 工具和实现
我们需要同时安装 kubectl 工具和 k3d Kubernetes 实现:
在代码空间中,切换到 “终端 ”选项卡,然后运行以下命令以安装必备组件:
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl接下来,若要下载 Kubernetes 包存储库的签名密钥,请运行以下命令:
sudo mkdir /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg如果收到目录已存在的错误,请单独运行
curl该命令。将 Kubernetes 存储库添加到 apt 配置:
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list现在,可以安装 kubectl 工具:
sudo apt-get update sudo apt-get install -y kubectl最后,安装 Kubernetes 的 k3d 实现并创建群集:
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash k3d cluster create devcluster --config k3d.yml
为后端服务创建部署文件
可以使用 YAML 文件创建文件管理容器部署到 Kubernetes 中。 让我们创建一个文件来部署后端服务。
在名为 backend-deploy.yml 的 codespace 的 donet-kubernetes 文件夹中创建新文件。
将以下文本复制到文件中,然后将其保存。
--- apiVersion: apps/v1 kind: Deployment metadata: name: productsbackend spec: replicas: 1 template: metadata: labels: app: productsbackend spec: containers: - name: productsbackend image: [YOUR DOCKER USER NAME]/productservice:latest ports: - containerPort: 80 env: - name: ASPNETCORE_URLS value: http://*:80 selector: matchLabels: app: productsbackend --- apiVersion: v1 kind: Service metadata: name: productsbackend spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 32001 selector: app: productsbackend将占位符
[YOUR DOCKER USER NAME]替换为实际的 Docker 用户名。
此文件执行几个作。
第一部分定义要部署到 Kubernetes 中的容器的部署规范。 它指定一个副本,在其中查找容器映像,在容器上打开哪些端口,并设置一些环境变量。 第一部分还定义了可用于引用容器和规范的标签和名称。
然后,第二部分将定义容器作为 Kubernetes NodePort 服务运行。 对于本模块,无需了解 NodePorts 的所有细节。 但是,应该知道,这种类型的服务公开外部 IP 地址,以便可以从群集外部测试服务。
部署并运行后端微服务
接下来,让我们部署并运行微服务。
在 “终端 ”选项卡中运行以下命令:
kubectl apply -f backend-deploy.yml此命令告知 Kubernetes 运行我们创建的文件。 它从 Docker 中心下载映像并创建容器。
该
kubectl apply命令会快速返回。 但容器创建可能需要一段时间。 若要查看进度,请使用以下代码。kubectl get pods在生成的输出中,有一行包含 productsbackend ,后跟 NAME 列下的一串随机字符。 一切准备就绪后,“就绪”列下有 1/1,“状态”列下有1/1。
若要测试服务,请切换到“ 端口 ”选项卡,靠近 后端 端口的本地地址,选择地球图标。 浏览器在该地址处打开一个新选项卡。
若要查询某些产品,请将地址追加 到 /api/product, 然后按 Enter。 应会看到 JSON 格式列出的一些产品信息。
[ { "id": 1, "name": "Solar Powered Flashlight", "description": "A fantastic product for outdoor enthusiasts", "price": 19.99, "imageUrl": "product1.png" }, { "id": 2, "name": "Hiking Poles", "description": "Ideal for camping and hiking trips", "price": 24.99, "imageUrl": "product2.png" }, { "id": 3, "name": "Outdoor Rain Jacket", "description": "This product will keep you warm and dry in all weathers", "price": 49.99, "imageUrl": "product3.png" }, ...
创建部署文件并运行前端服务
与后端服务非常类似,我们还需要前端的部署文件。
在名为 frontend-deploy.yml 的 donet-kubernetes 文件夹中创建新文件
将以下代码粘贴到文件中:
--- apiVersion: apps/v1 kind: Deployment metadata: name: storefrontend spec: replicas: 1 template: metadata: labels: app: storefrontend spec: containers: - name: storefrontend image: [YOUR DOCKER USER NAME]/storeimage:latest ports: - containerPort: 80 env: - name: ASPNETCORE_URLS value: http://*:80 - name: ProductEndpoint value: http://productsbackend selector: matchLabels: app: storefrontend --- apiVersion: v1 kind: Service metadata: name: storefrontend spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 32000 selector: app: storefrontend将占位符
[YOUR DOCKER USERNAME]替换为实际的 Docker 用户名。请注意,此文件类似于我们为后端微服务创建的文件。 有两种差异:
- 我们正在指定要在部署
spec.template.spec.containers.image值下运行的其他容器。 - 节下
spec.template.spec.containers.env有一个新的环境变量。 店面应用程序中的代码调用后端,但由于我们没有指定完全限定的域名(FQDN),因此我们不知道后端微服务的DeploymentIP 地址,因此我们使用我们在节点下metadata.name指定的名称。 Kubernetes 负责其余部分。
- 我们正在指定要在部署
使用以下命令将容器部署到 Kubernetes:
kubectl apply -f frontend-deploy.yml再次可用于
kubectl get pods查看部署的状态。 店面行显示“状态”列下“正在运行”后,所有内容都已准备就绪。为测试前端服务,请切换到“端口”选项卡,然后在“前端”端口的本地地址右侧,选择地球图标。 随即浏览器显示主页。
选择 “产品”。 该目录显示 Contoso 的商品。
在本练习中,你创建了一个部署文件,该文件准确描述了容器在 Kubernetes 中运行的方式。 然后,Kubernetes 从 Docker 中心下载映像并启动容器。