记一次aspnetcore发布部署流程初次使用k8s

news/2024/10/6 4:31:46/文章来源:https://www.cnblogs.com/morec/p/18285969

主题:

aspnetcorewebapi项目,提交到gitlab,通过jenkins(gitlab的ci/cd)编译、发布、推送到k8s。

关于gitlab、jenkins、k8s安装,都是使用docker启动服务。

首先新建一个项目,为了方便浏览就把swaggerr非开发环境不展示去掉

 

下面就是需要准备Dockerfile和k8s.yaml文件,这里不应该用net5,过时了。

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
COPY . /app
WORKDIR /app
EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000/
ENV TZ=Asia/Shanghai# Work around for broken dotnet restore
ADD http://ftp.us.debian.org/debian/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb .
RUN dpkg -i ca-certificates_20210119_all.deb# soft link
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN ln -s /lib/x86_64-linux-gnu/libdl-2.24.so /lib/x86_64-linux-gnu/libdl.so# install System.Drawing native dependencies
RUN apt-get update \&& apt-get install -y --allow-unauthenticated \ca-certificates \&& update-ca-certificates \libgdiplus \&& rm -rf /var/lib/apt/lists/*ENTRYPOINT ["dotnet", "autopubtest.dll"]

 

apiVersion: apps/v1
kind: Deployment
metadata:name: {deployName}labels:app: {deployName}namespace: default
spec:replicas: 2selector:matchLabels:app: {deployName}template:metadata:labels:app: {deployName}spec:nodeSelector:group: webcontainers:- name: {containerName}image: {imageRegistry}/{imageName}:{imageTag}volumeMounts:- name: config-volumemountPath: /app/appsettings.Production.jsonsubPath: appsettings.Production.jsonenv:- name: ASPNETCORE_ENVIRONMENTvalue: Productionports:- containerPort: 5000volumes:- name: config-volumeconfigMap:name: autopubtest-configimagePullSecrets:- name: docker-secret
---kind: Service
apiVersion: v1
metadata:name:  {serviceName}labels:app:  {serviceName}namespace: default
spec:selector:app:  {deployName}ports:- name:  {serviceName}port: 5000protocol: TCPtargetPort: 5000

这里需要注意的是configMap的name是我们需要再K8S里面建的appsettings.环境.json文件

  configMap:name: autopubtest-config

  

 一切准备就绪,本地需要有docker环境,就能验证dockerfile是否有报错,我本地是dockerdesktop。

下面就先把代码提交到gitlab,我是用develop自建分支,而且我用的是http

 这里gitlab

v17.1.1

有一个问题就是默认会把容器的id当成请求的ip地址,通过git 的git或者http拉取代码这里都会有问题,进入gitlab的容器内部找到 /etc/gitlab/gitlab.rb找到external_url注释掉的一行,改下你实际的地址和端口就行。

 这里稍微提一下gitlab的ci/cd,本篇主要是jenkins。

gitlab安装完默认密码存放在 /etc/gitlab/initial_root_password ,默认用户root

networks:指定唯一,在服务器中新建一个networks,方便一个网段通信,如果是分开的服务器就是用ip或者其他。
register runner的时候手敲,ip指定gitlab容器的内网ip,查看命令 docker inspect docker容器id,类似这样的,下面提示就是成功注册一个runner
Registering runner... succeeded                     runner=
gitlab-runner register \--url http://gitlab的docker的ip \--registration-token gitlab runners中的token \--executor docker \--description "My Docker Runner" \--docker-image "alpine:latest"
这里是安装gitlab和gitlab-runner的docker-compose.yml 
version: '3.3'
services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabports:- "80:80"networks:- my-networkgitlab-runner:image: gitlab/gitlab-runner:latestcontainer_name: gitlab-runnerrestart: alwaysvolumes:- /var/run/docker.sock:/var/run/docker.socknetworks:- my-networknetworks:my-network:driver: bridge

 

只要在项目中新增.gitlab-ci.yml,再把类似jenkins的shell操作放到文件中就可以了。这里有一个测试的文件,tags很重要,注册runner的时候指定需要的,再在文件中配置了,就会按照流程。

stages:          # List of stages for jobs, and their order of execution- build- test- deploybuild-job:       # This job runs in the build stage, which runs first.stage: buildtags:           # Add the tags here- docker- linuxscript:- echo "Compiling the code..."- echo "Compile complete."unit-test-job:   # This job runs in the test stage.stage: test    # It only starts when the job in the build stage completes successfully.tags:           # Add the tags here- docker- linuxscript:- echo "Running unit tests... This will take about 60 seconds."- sleep 60- echo "Code coverage is 90%"lint-test-job:   # This job also runs in the test stage.stage: test    # It can run at the same time as unit-test-job (in parallel).tags:           # Add the tags here- docker- linux- fastscript:- echo "Linting code... This will take about 10 seconds."- sleep 10- echo "No lint issues found."deploy-job:      # This job runs in the deploy stage.stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.tags:           # Add the tags here- docker- linux- fastenvironment: productionscript:- echo "Deploying application..."- echo "Application successfully deployed."

 

上面仅仅只是一个测试完整流程文件,不涉及docker打包操作,需要docker打包的话runner就需要安装,安装模式有几种,自行查资料。

 

下面介绍jenkins的操作

 

 

 这里提一提,通过git拉取代码,需要在jenkins的容器内部生成.ssh的公钥私钥,公钥添加到gitlab的ssh中,私钥就放到jenkins的全局变量中,Credentials就可以选择你的验证方式了。

下面的选择会影响你拉取代码,第一个设置你有可能需要在jenkins容器内部拉取一次代码,最后一个设置可以通过http拉。

 

 下面继续:

 

 这里我有三个步骤,编译,发布,K8S拉取镜像

第一部分#!/bin/bashecho "==========  当前 Branch: $GIT_BRANCH  =========="
echo "==========  Commit Hash: $GIT_COMMIT  =========="cd $WORKSPACE/src/autopubtest/dotnet restore if [ -d $WORKSPACE/publish ]; thenrm -rf $WORKSPACE/publish
fidotnet publish -c Release -o $WORKSPACE/publish --no-restoreif [ $? -ne 0 ]; thenecho "!!!!!!!!!!编译失败!!!!!!!!!!"exit 1
elseecho "<<<<<<<<<<编译成功>>>>>>>>>>"
fi第二部分#!/bin/bash
ob=`echo $jobName|tr 'A-Z' 'a-z'|cut -d '.' -f 2`
imageName="autopubtest-api"
#imageTag=$TagName
imageTag=`echo "$GIT_COMMIT" | cut -b1-8`
pushRegistry=镜像仓库/项目名echo "==========  开始构建镜像 =========="docker login -u 仓库账号 -p 仓库密码 $pushRegistry
cd $WORKSPACE/publish
docker build --rm -t $imageName:$imageTag -f $WORKSPACE/docker/Dockerfile .if [ $? -ne 0 ]; thenecho "!!!!!!!!!!镜像构建失败!!!!!!!!!!"exit 1
elseecho "<<<<<<<<<<镜像构建成功 $imageName:$imageTag>>>>>>>>>>"
fidocker tag $imageName:$imageTag $pushRegistry/$imageName:$imageTag
docker push $pushRegistry/$imageName:$imageTagif [ $? -ne 0 ]; thenecho "!!!!!!!!!!镜像发布失败!!!!!!!!!!"exit 1
elseecho "<<<<<<<<<<镜像发布成功 $imageName:$imageTag>>>>>>>>>>"
fidocker rmi $imageName:$imageTag
docker rmi $pushRegistry/$imageName:$imageTag第三部分projectName="autopubtest-api"
#imageTag=$TagName
imageTag=`echo "$GIT_COMMIT" | cut -b1-8`
deployName=$projectName
serviceName=$projectName
containerName=$projectName
imageName=$projectName
git_message=`git log --format=format:%s -1 ${GIT_COMMIT}`
pullRegistry=仓库地址/项目名cat $WORKSPACE/docker/k8s.yaml | sed 's|'extensions/v1beta1'|'apps/v1'|g; s|{imageRegistry}|'$pullRegistry'|g; s|{imageName}|'$imageName'|g; s|{imageTag}|'$imageTag'|g; s|{deployName}|'$deployName'|g; s|{serviceName}|'$serviceName'|g; s|{containerName}|'$containerName'|g' > $WORKSPACE/docker/k8s.value
sed -i '/^---/,$d' $WORKSPACE/docker/k8s.valuekubectl      apply -f $WORKSPACE/docker/k8s.value 
if [ $? -ne 0 ]; thenecho "!!!!!!!!!!更新失败,Deployment $deployName 可能不存在,尝试创建该Deployment!!!!!!!!!!"kubectl      create -f $WORKSPACE/docker/k8s.value 
fi

 

构建的日志就略过,这里使用的是harbor仓库,注需要注意,docker login需要登陆harbor的仓库,在harbor主机host通过ip地址映射一个随意取名的域名,不要用ip,否则触发https安全检查。

 jenkins的第三步,会触发k8s去pull仓库镜像。关于jenkins和k8s的关联就是把k8s主机的config文件拷贝到jenkins的 ./var/jenkins_home/root/.kube/config

当K8S拉取镜像后,服务正常启动。

 配置字典里新建autopubtest的appsettings.Production.json文件,该名称需要与k8s。yaml的对应起来autopubtest-config

 

新建下面的服务

 

 

 下面就能正常使用接口了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738799.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬盘数据误删格式化数据恢复

立即停止使用硬盘 在意识到硬盘数据被误删或格式化后,应立即停止使用该硬盘。任何新的数据写入都可能覆盖原始数据,从而降低恢复的可能性。 数据恢复 数据恢复软件是恢复误删或格式化数据的有效手段。以下是一些知名的数据恢复软件及其使用方法: 安装与选择模式:在格式化的…

bev_feature与真实坐标的关系

在生成 BEV feature 时的 scatter: nx = int((point_cloud_range[3]-point_cloud_range[0])/voxel_size[0])# Create the canvas for this sample canvas = torch.zeros(self.in_channels,self.nx * self.ny,dtype=voxel_features.dtype,device=voxel_features.device)# coors[…

【设计模式(六)】结构性模式--代理模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大…

面试必会之事物控制

01- 什么是事务 ? 事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元 02- 事务的特性有哪些 ?原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性…

字节面试 用double,1.0-0.9的结果不是0.1,为什么?

让我详细解释一下为什么 1.0 - 0.9 在二进制中不能精确表示。 1.0 的二进制表示 1.0 在二进制中可以精确表示。它的二进制表示为: 1.0 = 1.0 (二进制)0.9 的二进制表示 0.9 是一个无法在二进制中精确表示的小数。二进制小数是通过求和 1/2, 1/4, 1/8, 1/16, ... 等幂次表示的。…

关于oracle中的undo

一,undo介绍 二,undo视图说明 三,常用脚本说明 四.释放UNDO表空间 五.参考 一,undo介绍 Oracle中 undo的作用主要有两个:第一是回滚事务,第二是产生一致性读。同时也衍生出了一些新的 功能,比如Flashback query。传统的 undo是通过undo segment 来管理的,我们看下面的示…

闪迪U盘数据恢复

一、检查并取消隐藏项目 连接U盘:首先,确保闪迪U盘与电脑稳定连接。 打开U盘目录:在电脑中找到并打开U盘所在的目录。 显示隐藏项目:在文件资源管理器的顶部菜单中,点击“查看”选项,并勾选“显示隐藏的项目”。如果数据只是被隐藏了,这一步应该能够显示出被隐藏的文件。…

移动硬盘坏道修复

一、使用系统自带的磁盘检查工具 如果使用的是Windows系统,可以通过系统自带的磁盘检查工具来尝试修复坏道。 连接移动硬盘:首先,确保移动硬盘已经通过USB线连接到电脑上,并且系统能够识别到它。 打开磁盘属性:在文件资源管理器中,右键点击移动硬盘的图标,选择“属性”。…

MyBatis-Plus-实用的功能自动填充字段

MyBatis-Plus-实用的功能自动填充字段前言: java项目用到了mybatis-plus,在一些类里面需要在更新时候,统一设置,修改人,修改ID,修改时间。新增时候设置 创建人,创建时间等 基础类:@Data public abstract class BaseModel implements Serializable {/*** 逻辑删除*/@Tabl…

BOSHIDA DC/AC电源模块在不同的电源类型之间进行转换

BOSHIDA DC/AC电源模块在不同的电源类型之间进行转换 电力转换是现代社会不可或缺的一部分,它使我们能够在不同的电源类型之间进行转换,从而满足各种设备和应用的需求。DC/AC电源模块是一种用于将直流电转换为交流电的设备,它在电子设备、太阳能系统、电池充电等领域发挥着重…

面试必会之SpringBootSpringCloud

01- 讲一讲SpringBoot自动装配的原理 1.在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication @SpringBootApplication @MapperScan("com.hxx.admin.dao") public class AdminApplication {public static void main(String[] args) {SpringApplication…

在Docker中搭建rabbit MQ集群 (Mac + OrbStack)

我以为用docker搭建一个rabbitMq集群会非常简单,但是结果却出乎意料,我花了差不多两个半天才搞定。这还是依赖了AI的协助,否则难度不敢想象。我的环境是Mac上的OrbStack。用了Kimi + 文心一言 + ChatGPT + Claude,还是Kimi价值最大。back and forth 的过程就不讲了,这里直…