基于kubernetes+docker+jenkins的DevOps实践

6次阅读

共计 4352 个字符,预计需要花费 11 分钟才能阅读完成。

基于 kubernetes+docker+jenkins 的 DevOps 实践
之前自己的项目开发就搭了个 cicd 的环境,那时候是在本就小的可怜的服务器上搭了一套 jenkins + docker registry + docker 见之前的笔记 docker 学习下面 总的差不多这样:
之后对 kubernetes 的接触后,就在之前的基础上加入 kubernetes, 其实也就是在服务器拉取镜像 docker run 的时候改变为通知 kubernetes 的 apiServer 对提前配置好的项目配置文件 xx.yaml 进行更新 kubectl appply -f xx.yaml,它会对配置里的镜像拉取在多个 pod 里运行,当然还需要对应的 service,如果需要暴露给外部还可以添个 ingress。
一个小服务器加本地一个闲置从机撑进去这么多东西很显然爆了,于是把 jenkins , docker registry 拆出来,用上了公共的 ali 云服务 CodePipeline, 容器镜像服务。这里记录一下。
docker 搭建
ubuntu 安装 docker 官方教程
kubernetes 搭建
之前写的 kubernetes 学习下面有
使用 ali 云 CodePipeline 替代 jenkins 创建任务
配置 -> 项目名称:最好为 github 上代码的 demo 项目名称, 这里以 bootshiro 为例
配置 -> 源码管理 ->Git:URL 为 github 上的项目 clone url, 下面默认 master 分支
配置 -> 构建触发器 -> 填写代码分支:eg:master 点击生成触发器地址留下备用(github webhook 配置会用到)

配置 -> 构建项目类型可选 maven 项目 node python 等(按自己需求改编译打包册测试脚本)
eg: maven 项目 编译打包: mvn package -B -DskipTests 用例测试: mvn test

配置 -> 镜像构建和发布: 这里使用 ali 云的免费 docker 镜像仓库
镜像版本号最好用 jenkins 环境变量标记,registry 地址证书等就是自己开通的 ali 云 registry 地址和账户,docker 路径是相对于当前代码仓库的 Dcokerfile 文件路径, 用这个 Dockefile 文件来生成镜像。
eg: bootshiro 的 Dockefile
#VERSION 1.1.0
#基础镜像为 openjdk:12-alpine

FROM openjdk:12-alpine

# 签名
MAINTAINER tomsun28 “tomsun28@outlook.com”

RUN rm -rf /opt/running/bootshiro*
ADD ./target/bootshiro.jar /opt/running/bootshiro.jar

EXPOSE 8080
WORKDIR /opt/running/

CMD [“java”, “-jar”, “bootshiro.jar”,”–spring.profiles.active=prod”]

配置 -> 部署 Kubernetes(新): 这里配置对搭建好的 k8s 环境的 apiServer 连接, 之后好使用 apiServer 对 kubernetes 操作
认证方式:选择认证证书
API 服务器地址:为 apiServer 通讯地址
证书:使用 docker 授权模式, 客户端 Key(key.pem)和客户端证书 (cert.pem) 在 /etc/kubernetes/admin.conf, 服务端 CA 证书 (ca.pem) 在 /etc/kubernetes/pki/ca.crt
部署配置文件:为 k8s 部署这个项目的配置文件位置,也是以当前项目代码仓库为相对路径,eg :bootshiro.yaml

# ———————-bootshiro——————— #

# ——bootshiro deployment—— #
kind: Deployment
apiVersion: apps/v1beta2
metadata:
name: bootshiro-deployment
labels:
app: bootshiro
spec:
replicas: 1
selector:
matchLabels:
app: bootshiro
template:
metadata:
labels:
app: bootshiro
spec:
containers:
– name: nginx
image: registry.cn-hangzhou.aliyuncs.com/tomsun28/bootshiro:${BUILD_NUMBER}
ports:
– containerPort: 8080

# ——-nginx-service——— #
apiVersion: v1
kind: Service
metadata:
name: bootshiro-service
spec:
# type: NodePort
ports:
– name: server
port: 8080
targetPort: 8080
selector:
app: bootshiro

# !———————-bootshiro——————— #

这里配置部署文件创建了一个 pod 实例,创建了与其想对应的 service 在集群内部暴露服务。
如果部署的应用需要对集群外提供服务,这里还要创建对应的暴露服务的方式,如 ingress, nodeport 等


到此 cicd 就差不多了,我们开发代码 push 到 github 仓库上,跟着 DevOps 流程走,最后项目就会自己运行到 kubernetes 集群里面了,pod 挂了或者从机挂了,k8s 会重新启保证设定数量的 pod。
使用 ingress 对集群外暴露服务
这里使用的是 traefik-ingress, 在 kubernetes 中部署 traefik 有官方部署手册,基本按着走一遍就能部署上去了。
整合部署的 traefik.yaml:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress-controller
rules:
– apiGroups:
– “”
resources:
– services
– endpoints
– secrets
verbs:
– get
– list
– watch
– apiGroups:
– extensions
resources:
– ingresses
verbs:
– get
– list
– watch

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik-ingress-controller
subjects:
– kind: ServiceAccount
name: traefik-ingress-controller
namespace: kube-system

apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
namespace: kube-system

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: traefik-ingress-controller
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
– image: traefik
name: traefik-ingress-lb
ports:
– name: http
containerPort: 80
hostPort: 80
– name: admin
containerPort: 8080
securityContext:
capabilities:
drop:
– ALL
add:
– NET_BIND_SERVICE
args:
– –api
– –kubernetes
– –logLevel=INFO

apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
– name: web
port: 80
targetPort: 8080

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: kube-system
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip

spec:
rules:
– host: tom.usthe.com
http:
paths:
– path: /ingress
backend:
serviceName: traefik-web-ui
servicePort: web
使用 traefik 来暴露 service:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: chess
namespace: default
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
– host: tom.usthe.com
http:
paths:
– path: /usthe
backend:
serviceName: usthe-service
servicePort: http
– path: /nginx
backend:
serviceName: nginx
servicePort: http

转载请注明 from tomsun28

正文完
 0