资讯专栏INFORMATION COLUMN

基于kubernetes+docker+jenkins的DevOps实践

zhichangterry / 3218人阅读

摘要:一个小服务器加本地一个闲置从机撑进去这么多东西很显然爆了,于是把拆出来,用上了公共的云服务容器镜像服务。使用对集群外暴露服务这里使用的是在中部署有官方部署手册,基本按着走一遍就能部署上去了。

基于kubernetes+docker+jenkins的DevOps实践

之前自己的项目开发就搭了个cicd的环境,那时候是在本就小的可怜的服务器上搭了一套
jenkins + docker registry + docker
见之前的笔记 docker学习下面
总的差不多这样:



之后对kubernetes的接触后,就在之前的基础上加入kubernetes,其实也就是在服务器拉取镜像docker run的时候改变为通知kubernetesapiServer对提前配置好的项目配置文件xx.yaml进行更新kubectl appply -f xx.yaml,它会对配置里的镜像拉取在多个pod里运行,当然还需要对应的service,如果需要暴露给外部还可以添个ingress



一个小服务器加本地一个闲置从机撑进去这么多东西很显然爆了,于是把jenkins , docker registry拆出来,用上了公共的ali云服务CodePipeline,容器镜像服务
这里记录一下。

docker搭建

ubuntu安装docker官方教程

kubernetes搭建

之前写的kubernetes学习下面有

使用ali云CodePipeline替代jenkins创建任务

</>复制代码

  1. 配置->项目名称:最好为github上代码的demo项目名称,这里以bootshiro为例
  2. 配置->源码管理->Git:URL为github上的项目clone url,下面默认master分支
  3. 配置->构建触发器->填写代码分支:eg:master 点击生成触发器地址留下备用(github webhook配置会用到)


</>复制代码

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

</>复制代码

  1. 配置->镜像构建和发布: 这里使用ali云的免费docker镜像仓库
  2. 镜像版本号最好用jenkins环境变量标记,registry地址证书等就是自己开通的ali云registry地址和账户,docker路径是相对于当前代码仓库的Dcokerfile文件路径,用这个Dockefile文件来生成镜像。
  3. eg: bootshiro的Dockefile
  4. #VERSION 1.1.0
  5. #基础镜像为openjdk:12-alpine
  6. FROM openjdk:12-alpine
  7. #签名
  8. MAINTAINER tomsun28 "tomsun28@outlook.com"
  9. RUN rm -rf /opt/running/bootshiro*
  10. ADD ./target/bootshiro.jar /opt/running/bootshiro.jar
  11. EXPOSE 8080
  12. WORKDIR /opt/running/
  13. CMD ["java", "-jar", "bootshiro.jar","--spring.profiles.active=prod"]

</>复制代码

  1. 配置->部署Kubernetes(新): 这里配置对搭建好的k8s环境的apiServer连接,之后好使用apiServer对kubernetes操作
  2. 认证方式:选择认证证书
  3. API服务器地址:为apiServer通讯地址
  4. 证书:使用docker授权模式,客户端Key(key.pem)和客户端证书(cert.pem)在/etc/kubernetes/admin.conf,服务端CA证书(ca.pem)在/etc/kubernetes/pki/ca.crt
  5. 部署配置文件:为k8s部署这个项目的配置文件位置,也是以当前项目代码仓库为相对路径,eg :bootshiro.yaml
  6. # ----------------------bootshiro--------------------- #
  7. # ------bootshiro deployment------ #
  8. kind: Deployment
  9. apiVersion: apps/v1beta2
  10. metadata:
  11. name: bootshiro-deployment
  12. labels:
  13. app: bootshiro
  14. spec:
  15. replicas: 1
  16. selector:
  17. matchLabels:
  18. app: bootshiro
  19. template:
  20. metadata:
  21. labels:
  22. app: bootshiro
  23. spec:
  24. containers:
  25. - name: nginx
  26. image: registry.cn-hangzhou.aliyuncs.com/tomsun28/bootshiro:${BUILD_NUMBER}
  27. ports:
  28. - containerPort: 8080
  29. ---
  30. # -------nginx-service--------- #
  31. apiVersion: v1
  32. kind: Service
  33. metadata:
  34. name: bootshiro-service
  35. spec:
  36. # type: NodePort
  37. ports:
  38. - name: server
  39. port: 8080
  40. targetPort: 8080
  41. selector:
  42. app: bootshiro
  43. # !----------------------bootshiro--------------------- #
  44. 这里配置部署文件创建了一个pod实例,创建了与其想对应的service在集群内部暴露服务。
  45. 如果部署的应用需要对集群外提供服务,这里还要创建对应的暴露服务的方式,如ingress, nodeport等


-

到此cicd就差不多了,我们开发代码push到github仓库上,跟着DevOps流程走,最后项目就会自己运行到kubernetes集群里面了,pod挂了或者从机挂了,k8s会重新启保证设定数量的pod。

使用ingress对集群外暴露服务

这里使用的是traefik-ingress,在kubernetes中部署traefik有官方部署手册,基本按着走一遍就能部署上去了。

整合部署的traefik.yaml:

</>复制代码

  1. ---
  2. kind: ClusterRole
  3. apiVersion: rbac.authorization.k8s.io/v1beta1
  4. metadata:
  5. name: traefik-ingress-controller
  6. rules:
  7. - apiGroups:
  8. - ""
  9. resources:
  10. - services
  11. - endpoints
  12. - secrets
  13. verbs:
  14. - get
  15. - list
  16. - watch
  17. - apiGroups:
  18. - extensions
  19. resources:
  20. - ingresses
  21. verbs:
  22. - get
  23. - list
  24. - watch
  25. ---
  26. kind: ClusterRoleBinding
  27. apiVersion: rbac.authorization.k8s.io/v1beta1
  28. metadata:
  29. name: traefik-ingress-controller
  30. roleRef:
  31. apiGroup: rbac.authorization.k8s.io
  32. kind: ClusterRole
  33. name: traefik-ingress-controller
  34. subjects:
  35. - kind: ServiceAccount
  36. name: traefik-ingress-controller
  37. namespace: kube-system
  38. ---
  39. apiVersion: v1
  40. kind: ServiceAccount
  41. metadata:
  42. name: traefik-ingress-controller
  43. namespace: kube-system
  44. ---
  45. kind: DaemonSet
  46. apiVersion: extensions/v1beta1
  47. metadata:
  48. name: traefik-ingress-controller
  49. namespace: kube-system
  50. labels:
  51. k8s-app: traefik-ingress-lb
  52. spec:
  53. template:
  54. metadata:
  55. labels:
  56. k8s-app: traefik-ingress-lb
  57. name: traefik-ingress-lb
  58. spec:
  59. serviceAccountName: traefik-ingress-controller
  60. terminationGracePeriodSeconds: 60
  61. containers:
  62. - image: traefik
  63. name: traefik-ingress-lb
  64. ports:
  65. - name: http
  66. containerPort: 80
  67. hostPort: 80
  68. - name: admin
  69. containerPort: 8080
  70. securityContext:
  71. capabilities:
  72. drop:
  73. - ALL
  74. add:
  75. - NET_BIND_SERVICE
  76. args:
  77. - --api
  78. - --kubernetes
  79. - --logLevel=INFO
  80. ---
  81. apiVersion: v1
  82. kind: Service
  83. metadata:
  84. name: traefik-web-ui
  85. namespace: kube-system
  86. spec:
  87. selector:
  88. k8s-app: traefik-ingress-lb
  89. ports:
  90. - name: web
  91. port: 80
  92. targetPort: 8080
  93. ---
  94. apiVersion: extensions/v1beta1
  95. kind: Ingress
  96. metadata:
  97. name: traefik-web-ui
  98. namespace: kube-system
  99. annotations:
  100. kubernetes.io/ingress.class: traefik
  101. traefik.frontend.rule.type: PathPrefixStrip
  102. spec:
  103. rules:
  104. - host: tom.usthe.com
  105. http:
  106. paths:
  107. - path: /ingress
  108. backend:
  109. serviceName: traefik-web-ui
  110. servicePort: web

使用traefik来暴露service:

</>复制代码

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: chess
  5. namespace: default
  6. annotations:
  7. kubernetes.io/ingress.class: traefik
  8. traefik.frontend.rule.type: PathPrefixStrip
  9. spec:
  10. rules:
  11. - host: tom.usthe.com
  12. http:
  13. paths:
  14. - path: /usthe
  15. backend:
  16. serviceName: usthe-service
  17. servicePort: http
  18. - path: /nginx
  19. backend:
  20. serviceName: nginx
  21. servicePort: http



分享一波阿里云代金券快速上云


转载请注明 from tomsun28

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27640.html

相关文章

  • 基于kubernetes+docker+jenkinsDevOps实践

    摘要:一个小服务器加本地一个闲置从机撑进去这么多东西很显然爆了,于是把拆出来,用上了公共的云服务容器镜像服务。使用对集群外暴露服务这里使用的是在中部署有官方部署手册,基本按着走一遍就能部署上去了。 基于kubernetes+docker+jenkins的DevOps实践 之前自己的项目开发就搭了个cicd的环境,那时候是在本就小的可怜的服务器上搭了一套 jenkins + docker...

    paulli3 评论0 收藏0
  • 优势+工具+实践=DevOps&Docker企业级落地

    摘要:的设计模式的设计模式以持续集成持续测试持续交付和持续部署为中心,自动化协作和持续监控是中使用的一些其他设计模式。持续集成持续集成是不断地将源代码集成到一个新的构建或发布的过程,源代码可以在本地存储中,也可以在或中。 showImg(https://segmentfault.com/img/remote/1460000010452455); 识别二维码报名活动 8月19日,来自微软、数人...

    stormjun 评论0 收藏0
  • 构建与定制:唯品会 PaaS 基于 Kubernetes 实践

    摘要:基于年底或年初没有推广的现状,唯品会部门目前已经做了两年的时间。唯品会现状唯品会目前线上有一千多个域,每个域之间相互的依赖比较复杂,每次的部署发布困难。这是唯品会的架构,主要包含持续集成和持续部署。 数人云上海&深圳两地容器之Mesos/K8S/Swarm三国演义的嘉宾精彩实录第三更来啦。唯品会是数人云Meetup的老朋友,去年曾做过RPC服务框架和Mesos容器化的分享。本次分享中,...

    JackJiang 评论0 收藏0
  • DevOps 基于Walle小型持续集成实战(一)概述

    摘要:该文章用于概述一个小型持续集成环境的搭建的方案什么是持续集成持续集成作为当今软件开发实践,可以简单理解为团队开发相对频繁的集成他们的工作,一般让每个成员每天至少集成一次,而这回造成每天会有多次的版本发布。 该文章用于概述一个小型持续集成环境的搭建的方案 什么是持续集成? 持续集成作为当今软件开发实践,可以简单理解为团队开发相对频繁的集成他们的工作,一般让每个成员每天至少集成一次,而这回...

    Yangyang 评论0 收藏0
  • 容器 PaaS 新技术架构下运维实践

    摘要:王磊此次演讲的题目为容器新技术架构下的运维实践,详细为大家讲解了在基于构建容器的过程中,如何以应用为中心,通过新的技术工具对服务节点集群平台等多个方面进行管理运维,提高系统的自动化运维能力。 2018年11月16-17日,运维&容器技术盛会 CNUTCon 全球运维技术大会在上海·光大会展中心成功举办。时速云联合创始人兼 CTO 王磊受邀参加此次大会,并发表主题演讲。王磊此次演讲的题目...

    BaronZhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<