4、.Net项目发布到K8S集群
全部文章导航
1、环境准备
1、在Harbor管理后台创建用户、添加到项目
1、登录Harbor管理后台,新建用户: 用户名: free4 密码: Hello123456
2、授权: 在free-test项目下新建成员free4。
2、修改k8s集群每个Node(free1、free2、free3)的docker认证仓库配置信息
vim /etc/docker/daemon.json
# 内容
{
"insecure-registries":["192.168.110.104:9999"]
}
# 然后重新启动Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
3、主节点(free1)创建仓库认证secret
由于harbor采用了用户名密码认证,所以在镜像下载时需要配置sercet
#创建
sudo kubectl create secret docker-registry registry-secret --namespace=default \
--docker-server={仓库地址} \
--docker-username={用户名} \
--docker-password={密码}
#示例
#kubectl create secret docker-registry registry-secret --namespace=default \
#--docker-server=192.168.110.104:9999 \
#--docker-username=free4 \
#--docker-password=Hello123456
#查看secret -See
sudo kubectl get secret
# output:
#NAME TYPE DATA AGE
#default-token-gdwgn kubernetes.io/service-account-token 3 2d18h
#registry-secret kubernetes.io/dockerconfigjson 1 116s
4、本地物理机安装Docker Desktop
参考官方安装文档: https://docs.docker.com/desktop/windows/install/
添加私有仓库地址:
2、服务发布
1、拉取.Net Demo代码:
拉取代码:
git clone https://gitee.com/RiverBied/k8-score-demo.git
使用visual studio打开并编译代码,项目结构如下,存在可运行项目Order.Api、Payment.Api。
2、发布计划
计划将order.api、payment.api服务发布到k8s集群
服务 | 组件 | 提供接口 |
---|---|---|
order.api | order-api-deployment、order-api-service | api/v1/Orders/Info: 访问Order服务接口信息 |
payment.api | payment-api-deployment、payment-api-service | api/v1/Payment/Info: 访问Payment服务接口信息 api/v1/Payment/CallOrderApiInfo: 通过Payment服务调用Order服务返回信息 |
拓扑图:
连通性验证:
-
在物理机访问http://192.168.110.100:32600/api/v1/Orders/Info验证order.api服务连通性。
-
访问http://192.168.110.100:32620/api/v1/Payment/CallOrderApiInfo验证两个服务内部调用的连通性。
3、Docker镜像打包上传Harbor
物理机执行登录私有仓库
# 登录私有仓库
docker login -u {用户名} -p {密码} {仓库地址}
# 示例: docker login -u free4 -p Hello123456 192.168.110.104:9999
设置powershell执行策略
# 以管理员身份运行powershell;
set-ExecutionPolicy RemoteSigned
get-ExecutionPolicy # 显示RemoteSigned
切换到k8-score-demo项目deploy目录,执行Docker镜像打包上传Harbor
# 1、打包上传order.api镜像
powershell .\buildPushImages.ps1 -serviceName 'order.api' -serviceVersion '{版本号}' -serviceDockerFilePath '../src/Services/Order.Api/Dockerfile' -registryHost '{仓库地址/项目名称}'
# 示例powershell .\buildPushImages.ps1 -serviceName 'order.api' -serviceVersion '1.0.0' -serviceDockerFilePath '../src/Services/Order.Api/Dockerfile' -registryHost '192.168.110.104:9999/free-test'
# 2、打包上传payment.api镜像
powershell .\buildPushImages.ps1 -serviceName 'payment.api' -serviceVersion '{版本号}' -serviceDockerFilePath '../src/Services/Payment.Api/Dockerfile' -registryHost '{仓库地址/项目名称}'
# 示例 powershell .\buildPushImages.ps1 -serviceName 'payment.api' -serviceVersion '1.0.0' -serviceDockerFilePath '../src/Services/Payment.Api/Dockerfile' -registryHost '192.168.110.104:9999/free-test'
可看到如图信息:
4、发布到k8s集群
- 主节点(free1)创建namespace
# 创建namespace
sudo kubectl create ns free
- 发布order-api-deployment
# 创建目录
sudo mkdir -p /home/deploy/order
# 创建order-api-deployment.yaml
sudo vi /home/deploy/order/order-api-deployment.yaml
order-api-deployment.yaml内容如下,需要自己修改镜像地址。
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-api-deployment
namespace: free # namespace
labels:
appname: order-api
version: 1.0.0 # 版本号标记
spec:
replicas: 2 # 一个实例
selector:
matchLabels:
appname: order-api
template:
metadata:
labels:
appname: order-api
spec:
containers:
- name: order-api
image: 192.168.110.104:9999/free-test/order.api:1.0.0 # 镜像地址
ports:
- containerPort: 5000
env:
- name: ASPNETCORE_ENVIRONMENT
value: Development # 设置运行环境
- name: ASPNETCORE_URLS
value: "http://+:5000" # 设置服务监听端口
imagePullSecrets: #使用的secret
- name: registry-secret
执行发布:
sudo kubectl apply -f /home/deploy/order/order-api-service.yaml
- 发布order-api-service
# 创建目录
sudo mkdir -p /home/deploy/order
# 创建order-api-service.yaml
sudo vi /home/deploy/order/order-api-service.yaml
order-api-service.yaml内容如下
apiVersion: v1
kind: Service
metadata:
name: order-api-service #Service 的名称
namespace: free
labels: #Service 自己的标签
appname: order-api-service #为该 Service 设置 key 为 appname,value 为SERVICE_SERVICE_NAME 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
appname: order-api #选择包含标签 appname 的 Pod
ports:
- name: order-api-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 5000 #集群内的其他容器组可通过 5000 端口访问 Service
nodePort: 32600 #通过任意节点的 SERVICE_SERVICE_NODE_PORT 端口访问 Service
targetPort: 5000 #将请求转发到匹配 Pod 的 5000 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
执行发布:
sudo kubectl apply -f /home/deploy/order/order-api-service.yaml
- 发布payment-api-deployment
# 创建目录
sudo mkdir -p /home/deploy/payment
# 创建payment-api-deployment
sudo vi /home/deploy/payment/payment-api-deployment.yaml
payment-api-deployment.yaml内容如下,需要自己修改镜像地址。
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-api-deployment
namespace: free
labels:
appname: payment-api
version: 1.0.0
spec:
replicas: 2 # 一个实例
selector:
matchLabels:
appname: payment-api
template:
metadata:
labels:
appname: payment-api
spec:
containers:
- name: payment-api
image: 192.168.110.104:9999/free-test/payment.api:1.0.0 # 镜像地址
ports:
- containerPort: 5000
env:
- name: ASPNETCORE_ENVIRONMENT
value: Development # 设置运行环境
- name: ASPNETCORE_URLS
value: "http://+:5000" # 设置服务监听端口
imagePullSecrets: #使用的secret
- name: registry-secret
执行发布:
sudo kubectl apply -f /home/deploy/payment/payment-api-deployment.yaml
- 发布payment-api-service
# 创建目录
sudo mkdir -p /home/deploy/payment
# 创建payment-api-service.yaml
sudo vi /home/deploy/payment/payment-api-service.yaml
payment-api-service.yaml内容如下
apiVersion: v1
kind: Service
metadata:
name: order-api-service #Service 的名称
namespace: free
labels: #Service 自己的标签
appname: order-api-service #为该 Service 设置 key 为 appname,value 为SERVICE_SERVICE_NAME 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
appname: order-api #选择包含标签 appname 的 Pod
ports:
- name: order-api-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 5000 #集群内的其他容器组可通过 5000 端口访问 Service
nodePort: 32600 #通过任意节点的 SERVICE_SERVICE_NODE_PORT 端口访问 Service
targetPort: 5000 #将请求转发到匹配 Pod 的 5000 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
执行发布:
sudo kubectl apply -f /home/deploy/payment/payment-api-service.yaml
5、验证发布结果
查看工作负载、容器组、服务运行情况:
登录Kuboard管理后台进行查看:
访问服务接口验证(Ip自行更改)
验证订单服务访问地址: http://192.168.110.100:32600/api/v1/Orders/Info
http返回结果: 'ServiceName:order.api EnvironmentName:Development RequestUrl: http://192.168.110.100:32600/api/v1/Orders/Info'
验证支付服务访问地址: http://192.168.110.100:32620/api/v1/Payment/Info
http返回结果: 'ServiceName:payment.api EnvironmentName:Development'
验证支付服务通过service调用订单服务的访问地址: http://192.168.110.100:32620/api/v1/Payment/CallOrderApiInfo
http返回结果: 'CallResult: ServiceName:order.api EnvironmentName:Development RequestUrl: http://order-api-service:5000/api/v1/Orders/Info'
3、通过脚本直接发布
1、脚本发布说明
由于发布操作步骤较为繁琐,使用powershell脚本+sh脚本简化了一下整个操作过程,原本需要在物理机和集群进行切换操作,且发布文件修改不方便。简化后可选择服务、环境、版本号、实例数量进行发布,且只需要在物理机上执行,当然会增加一次性的前置工作。
2、配置物理机到Master(free1),支持ssh免密登录
参考https://blog.csdn.net/tuzixini/article/details/82013230 设置Windows ssh免密登录。
物理机打开powershell,输入 'ssh root@192.168.110.100'命令验证免密登录:
3、确认Master(free1)是否存在工具envsubst、dos2unix
envsubst --version
dos2unix --version
# 如果没有则需要进行安装
4、执行发布
-
配置Deploy/env.ps1中$registryHost、$k8sMasterSSHUserIp信息
-
切换到k8-score-demo项目deploy目录执行cmd
-
执行发布帮助命令:
powershell ./deployAll.ps1 -h
由输出结果可知: 脚本发布可选择发布服务、环境变量、版本号、实例数量。
发布服务
powershell ./deployAll.ps1 -rps 3
输入'order',按回车:
输入'y',按回车,可看到发布执行结果信息。