记一次aspnetcore发布部署流程初次使用k8s
主题:
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: 2
selector:
matchLabels:
app: {deployName}
template:
metadata:
labels:
app: {deployName}
spec:
nodeSelector:
group: web
containers:
- name: {containerName}
image: {imageRegistry}/{imageName}:{imageTag}
volumeMounts:
- name: config-volume
mountPath: /app/appsettings.Production.json
subPath: appsettings.Production.json
env:
- name: ASPNETCORE_ENVIRONMENT
value: Production
ports:
- containerPort: 5000
volumes:
- name: config-volume
configMap:
name: autopubtest-config
imagePullSecrets:
- name: docker-secret
--- kind: Service
apiVersion: v1
metadata:
name: {serviceName}
labels:
app: {serviceName}
namespace: default
spec:
selector:
app: {deployName}
ports:
- name: {serviceName}
port: 5000
protocol: TCP
targetPort: 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:latest
container_name: gitlab
ports:
- "80:80"
networks:
- my-network gitlab-runner:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- my-network networks:
my-network:
driver: bridge
只要在项目中新增.gitlab-ci.yml,再把类似jenkins的shell操作放到文件中就可以了。这里有一个测试的文件,tags很重要,注册runner的时候指定需要的,再在文件中配置了,就会按照流程。
stages: # List of stages for jobs, and their order of execution
- build
- test
- deploy build-job: # This job runs in the build stage, which runs first.
stage: build
tags: # Add the tags here
- docker
- linux
script:
- 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
- linux
script:
- 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
- fast
script:
- 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
- fast
environment: production
script:
- echo "Deploying application..."
- echo "Application successfully deployed."
上面仅仅只是一个测试完整流程文件,不涉及docker打包操作,需要docker打包的话runner就需要安装,安装模式有几种,自行查资料。
下面介绍jenkins的操作
这里提一提,通过git拉取代码,需要在jenkins的容器内部生成.ssh的公钥私钥,公钥添加到gitlab的ssh中,私钥就放到jenkins的全局变量中,Credentials就可以选择你的验证方式了。
下面的选择会影响你拉取代码,第一个设置你有可能需要在jenkins容器内部拉取一次代码,最后一个设置可以通过http拉。
下面继续:
这里我有三个步骤,编译,发布,K8S拉取镜像
第一部分 #!/bin/bash echo "========== 当前 Branch: $GIT_BRANCH =========="
echo "========== Commit Hash: $GIT_COMMIT ==========" cd $WORKSPACE/src/autopubtest/
dotnet restore if [ -d $WORKSPACE/publish ]; then
rm -rf $WORKSPACE/publish
fi dotnet publish -c Release -o $WORKSPACE/publish --no-restore if [ $? -ne 0 ]; then
echo "!!!!!!!!!!编译失败!!!!!!!!!!"
exit 1
else
echo "<<<<<<<<<<编译成功>>>>>>>>>>"
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 ]; then
echo "!!!!!!!!!!镜像构建失败!!!!!!!!!!"
exit 1
else
echo "<<<<<<<<<<镜像构建成功 $imageName:$imageTag>>>>>>>>>>"
fi docker tag $imageName:$imageTag $pushRegistry/$imageName:$imageTag
docker push $pushRegistry/$imageName:$imageTag if [ $? -ne 0 ]; then
echo "!!!!!!!!!!镜像发布失败!!!!!!!!!!"
exit 1
else
echo "<<<<<<<<<<镜像发布成功 $imageName:$imageTag>>>>>>>>>>"
fi docker 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.value kubectl apply -f $WORKSPACE/docker/k8s.value
if [ $? -ne 0 ]; then
echo "!!!!!!!!!!更新失败,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
新建下面的服务
下面就能正常使用接口了
记一次aspnetcore发布部署流程初次使用k8s的更多相关文章
- 服务端技术进阶(一)web项目的部署(发布)流程
web项目的部署(发布)流程 在myeclipse下新建web工程abc.系统设置默认如下: 项目保存位置:workspace目录\abc.Source文件夹:src,保存所有的java类文件(.ja ...
- VS2019发布至远程IIS部署流程
服务器部署 传统的开发将项目发布至本地桌面之后,复制至站点目录或通过FTP上传站点目录,有点小麻烦,通过开发工具VS2019本身集成的功能,可以一步到发布到远程IIS站点. 条件: VS系列发工具,例 ...
- OpenStack Keystone安装部署流程
之前介绍了OpenStack Swift的安装部署,采用的都是tempauth认证模式,今天就来介绍一个新的组件,名为Keystone. 1. 简介 本文将详细描述Keystone的安装部署流程,并给 ...
- Kent Beck揭秘Facebook开发部署流程
http://www.infoq.com/cn/news/2013/10/facebook-development-deployment Facebook是世界上最大的社交网站,有超过10亿用户每月至 ...
- jBPM学习之部署流程定义
也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...
- git开发部署流程
git的分支操作 https://blog.csdn.net/QH_JAVA/article/details/77853605 Git 开发部署流程 采用业界成熟方案 Git Flow 分支方式进行开 ...
- Openshift部署流程介绍
背景 Openshift是一个开源容器云平台,是一个基于主流的容器技术Docker和Kubernetes构建的云平台.Openshift底层以Docker作为容器引擎驱动,以Kubernetes 作为 ...
- Gogs的Docker容器化部署流程遇到的问题
Gogs的Docker容器化部署流程遇到的问题 最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...
- Azure DevOps 中 Dapr项目自动部署流程实践
注:本文中主要讨论 .NET6.0项目在 k8s 中运行的 Dapr 的持续集成流程, 但实际上不是Dapr的项目部署到K8s也是相同流程,只是k8s的yaml配置文件有所不同 流程选择 基于 Dap ...
- MVC3在IIS7.5发布(部署)报403.14错误的解决办法
MVC3在IIS7.5发布(部署)报403.14错误的解决办法 错误现象: 报403.14 forbidden错误 web服务器被配置为不列出此目录的内容. 解决办法: 检查站点的处理程序映射 ...
随机推荐
- HTML link标签中preload,prefetch,dns-prefetch,preconnect,prerender
Preload 在我们的浏览器加载资源的时候,对于每一个资源都有其自身的默认优先级,倘若我们能修改每一个资源的默认优先级,那我们几乎可以按照我们的预期加载想要加载的资源. 以谷歌浏览器为例,我们打开控 ...
- 80x86汇编—指令系统
文章目录 MOV 非法传送 XCHG XLAT 堆栈指令 push 和 pop 标志寄存器指令 重点理解CF与OF与SF实际应用中的关系 运算指令 控制转移类指令(重点) 条件转移指令 顺序是按照我们 ...
- C数据结构:循环队列的顺序存储结构
顺序队列目录 队列的定义 定义 假溢出 空间浪费的缺点 如何解决 循环队列的缺点 *==主要的算法思想(重要)==* 如何理解循环队列(必看) 结构体代码 两种实现方法 **①循环队列,队头和队尾指针 ...
- vue3 如何在 jsx中使用 component 组件
component 组件不像其它的内置组件(tansition.transitionGroup),可以直接从 vue 中直接导出,所有要在 jsx 使用component就要使用 h 函数 使用 vu ...
- linux源码编译安装软件原理
目录 一.关于软件包 二.软件编译过程 三.编译安装常用参数 四.源码编译出错的解决思路 五.各种软件安装方法的特点 一.关于软件包 在linux中安装软件是需要安装包的,软件的安装包有各种类型: ...
- Java静态变量在静态方法内部无法改变值
一.如何解决"Java静态变量在静态方法内部无法改变值"的问题 在Java中,静态变量(也称为类变量)属于类本身,而不是类的任何特定实例.它们可以在没有创建类的实例的情况下访问和修 ...
- NumPy 二项分布生成与 Seaborn 可视化技巧
二项分布 简介 二项分布是一种离散概率分布,用于描述在固定次数的独立试验中,事件"成功"的次数的概率分布.它通常用于分析诸如抛硬币.做选择题等具有两个结果(成功或失败)的事件. 参 ...
- Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验
TOPIAM 企业数字身份管控平台, 是一个开源的IDaas/IAM平台.用于管理账号.权限.身份认证.应用访问,帮助整合部署在本地或云端的内部办公系统.业务系统及三方 SaaS 系统的所有身份,实现 ...
- vim 多文件编辑
使用vim打开多个文件 vim可以同时打开好几个文件同时进行编辑 [root@localhost opt]# vim ip.txt time.txt 2 files to edit ens32: fl ...
- ansible 报错 "changed": false, "msg": "Failed to connect to the host
报错: "changed": false, "msg": "Failed to connect to the host via ssh: root@n ...