4、.Net项目发布到K8S集群

全部文章导航

点此查看K8S、Jenkins持续集成环境搭建全部文章

1、环境准备

1、在Harbor管理后台创建用户、添加到项目

1、登录Harbor管理后台,新建用户: 用户名: free4 密码: Hello123456

image-20210930093230688

2、授权: 在free-test项目下新建成员free4。

image-20210923112504892

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/

添加私有仓库地址:

image-20210916165619577

2、服务发布

1、拉取.Net Demo代码:

拉取代码:

git clone https://gitee.com/RiverBied/k8-score-demo.git

使用visual studio打开并编译代码,项目结构如下,存在可运行项目Order.Api、Payment.Api。

image-20210926114750707

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服务返回信息

拓扑图:

image-20210926112602028

连通性验证:

  • 在物理机访问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'

可看到如图信息:

image-20210926125219168

image-20210926125239352

4、发布到k8s集群

  1. 主节点(free1)创建namespace
# 创建namespace
sudo kubectl create ns free 
  1. 发布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
  1. 发布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
  1. 发布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
  1. 发布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管理后台进行查看:

image-20210926132158043

访问服务接口验证(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脚本简化了一下整个操作过程,原本需要在物理机和集群进行切换操作,且发布文件修改不方便。简化后可选择服务、环境、版本号、实例数量进行发布,且只需要在物理机上执行,当然会增加一次性的前置工作。

image-20210926141137470

2、配置物理机到Master(free1),支持ssh免密登录

参考https://blog.csdn.net/tuzixini/article/details/82013230 设置Windows ssh免密登录。

物理机打开powershell,输入 'ssh root@192.168.110.100'命令验证免密登录:

image-20210926133023753

3、确认Master(free1)是否存在工具envsubst、dos2unix

envsubst --version
dos2unix --version
# 如果没有则需要进行安装

image-20210926133455174

4、执行发布

  1. 配置Deploy/env.ps1中$registryHost、$k8sMasterSSHUserIp信息

    image-20210926134747654

  2. 切换到k8-score-demo项目deploy目录执行cmd

  3. 执行发布帮助命令:

    powershell ./deployAll.ps1 -h
    

    由输出结果可知: 脚本发布可选择发布服务、环境变量、版本号、实例数量。

    image-20210926133907980

    发布服务

    powershell ./deployAll.ps1 -rps 3
    

    输入'order',按回车:

    image-20210926134204740

    输入'y',按回车,可看到发布执行结果信息。

    image-20210926134441829

参考资料

https://blog.csdn.net/tuzixini/article/details/82013230

posted @ 2021-10-15 08:58  江边飞鸟  阅读(672)  评论(0编辑  收藏  举报