练习 - 将微服务容器部署到 Kubernetes
Kubernetes 会为你运行容器。 你需要通过 YAML 文件描述希望 Kubernetes 执行的操作。 本练习将逐步指导你完成文件创建过程,让你在 Kubernetes 上部署和运行后端服务。
重要
在继续操作之前,必须确保已安装 Kubernetes 实现。 我们将使用在 codespace 中运行的 k3d 实现。 作为此实验室的第一步,我们将安装此实现。
安装 Kubernetes 工具和实现
我们需要同时安装 kubectl 工具和 k3d Kubernetes 实现:
在 codespace 中,切换到“终端”选项卡,然后运行以下命令以安装必备组件:
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 的文件管理容器部署。 我们将创建一个文件来部署后端服务。
在 codespace 的 donet-kubernetes 文件夹中创建一个名为 backend-deploy.yml 的新文件。
将以下文本复制到该文件,然后保存文件。
--- 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 Hub 下载映像并创建容器。
kubectl apply
命令会快速返回。 但容器创建可能需要一段时间。 若要查看进度,请使用以下代码。kubectl get pods
在生成的输出中,你将在“名称”列下看到包含“productsbackend”并后跟一个随机字符串的行。 一切就绪后,“就绪”列下会显示“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" }, ...
创建部署文件并运行前端服务
与后端服务很类似,我们的前端也需要一个部署文件。
在 donet-kubernetes 文件夹中创建一个名为 frontend-deploy.yml 的新文件
将以下代码粘贴到文件中:
--- 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
部分下有一个新的环境变量。 storefrontend 应用程序中的代码会调用后端,但由于我们没有指定完全限定的域名 (FQDN),也不知道后端微服务的 IP 地址,因此我们使用在Deployment
的metadata.name
节点下指定的名称。 Kubernetes 负责其余部分。
- 我们指定了一个不同的容器在部署的
通过以下命令将容器部署到 Kubernetes:
kubectl apply -f frontend-deploy.yml
同样,可以使用
kubectl get pods
来查看部署状态。 一旦 storefrontend 所在的行在“状态”列下显示“正在运行”,就说明一切准备就绪。为测试前端服务,切换到“端口”选项卡,然后在“前端”端口的本地地址右侧,选择地球图标。 随即浏览器显示主页。
选择“产品”。 该目录显示 Contoso 的商品。
在本练习中,你创建了一个部署文件,该文件准确描述了你希望容器在 Kubernetes 中的运行方式。 然后,你让 Kubernetes 从 Docker Hub 下载了映像并启动了容器。