注:关于ceph、kubernetes集群的部署在此不声明,相信搜到本篇博文,你一定对ceph、kubernetes的部署环节手刃有余。

注:本篇博文牵扯到的技术点有:ceph、kubernetes、harbor、jenkins、traefik

  1. #ceph -s //查看ceph集群状态
  2. #ceph osd pool create jenkins 128 //创建pool 建议每个pool存放的是通类应用
  3. #ceph auth get-or-create client.jenkins mon 'allow r' osd 'allow class-read, allow rwx pool=jenkins' -o ceph.client.jenkins.keyring //创建普通用户管理对应pool

注意:ceph集群的状态要先调试成ok.

image-20200315164133224

image-20200315164335421

  1. # cat ~/.docker/config.json |base64 -w 0 //node节点访问私有仓库的认证
  2. ewoJImF1dGhzIjogewoJCSJoYXJib3IubGludXguY29tIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NmVtbHpaV1psYVhwb2RRPT0iCgkJfQoJfSwKCSJIdHRwSGVhZGVycyI6IHsKCQkiVXNlci1BZ2VudCI6ICJEb2NrZXItQ2xpZW50LzE5LjAzLjUgKGxpbnV4KSIKCX0KfQ==
  3. # cat secret_harbor.yaml
  4. ##########################################################################
  5. #Author: zisefeizhu
  6. #QQ: 2********0
  7. #Date: 2020-02-19
  8. #FileName: secret_harbor.yaml
  9. #URL: https://www.cnblogs.com/zisefeizhu/
  10. #Description: The test script
  11. #Copyright (C): 2020 All rights reserved
  12. ###########################################################################
  13. apiVersion: v1
  14. kind: Secret
  15. metadata:
  16. name: k8s-harbor-login
  17. type: kubernetes.io/dockerconfigjson
  18. data:
  19. .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJoYXJib3IubGludXguY29tIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NmVtbHpaV1psYVhwb2RRPT0iCgkJfQoJfSwKCSJIdHRwSGVhZGVycyI6IHsKCQkiVXNlci1BZ2VudCI6ICJEb2NrZXItQ2xpZW50LzE5LjAzLjUgKGxpbnV4KSIKCX0KfQ==
  20. # kubectl create -f secret_harbor.yaml
  21. secret/login created
  22. # kubectl get secret
  23. NAME TYPE DATA AGE
  24. ceph-admin-secret kubernetes.io/rbd 1 3d16h
  25. ceph-kube-secret kubernetes.io/rbd 1 3d16h

注意:前提是node节点可以访问到harbor,关于这部分可以参考我的这篇博文:https://www.cnblogs.com/zisefeizhu/p/12329864.html

image-20200315162612795

  1. # pwd
  2. /data/k8s/jenkins //单个服务单个目录
  3. # cat namespace.yaml //单个服务单个名称空间,便于管理
  4. ##########################################################################
  5. #Author: zisefeizhu
  6. #QQ: 2********0
  7. #Date: 2020-03-09
  8. #FileName: namespace.yaml
  9. #URL: https://www.cnblogs.com/zisefeizhu/
  10. #Description: The test script
  11. #Copyright (C): 2020 All rights reserved
  12. ###########################################################################
  13. apiVersion: v1
  14. kind: Namespace
  15. metadata:
  16. name: jenkins
  17. labels:
  18. name: jenkins
  19. #kubernetes结合ceph需要使用第三方插件
  20. # cat external-storage-rbd-provisioner.yaml
  21. ##########################################################################
  22. #Author: zisefeizhu
  23. #QQ: 2********0
  24. #Date: 2020-03-09
  25. #FileName: external-storage-rbd-provisioner.yaml
  26. #URL: https://www.cnblogs.com/zisefeizhu/
  27. #Description: The test script
  28. #Copyright (C): 2020 All rights reserved
  29. ###########################################################################
  30. apiVersion: v1
  31. kind: ServiceAccount
  32. metadata:
  33. name: rbd-provisioner
  34. namespace: jenkins
  35. ---
  36. kind: ClusterRole
  37. apiVersion: rbac.authorization.k8s.io/v1
  38. metadata:
  39. name: rbd-provisioner
  40. rules:
  41. - apiGroups: [""]
  42. resources: ["persistentvolumes"]
  43. verbs: ["get", "list", "watch", "create", "delete"]
  44. - apiGroups: [""]
  45. resources: ["persistentvolumeclaims"]
  46. verbs: ["get", "list", "watch", "update"]
  47. - apiGroups: ["storage.k8s.io"]
  48. resources: ["storageclasses"]
  49. verbs: ["get", "list", "watch"]
  50. - apiGroups: [""]
  51. resources: ["events"]
  52. verbs: ["create", "update", "patch"]
  53. - apiGroups: [""]
  54. resources: ["endpoints"]
  55. verbs: ["get", "list", "watch", "create", "update", "patch"]
  56. - apiGroups: [""]
  57. resources: ["services"]
  58. resourceNames: ["kube-dns"]
  59. verbs: ["list", "get"]
  60. ---
  61. kind: ClusterRoleBinding
  62. apiVersion: rbac.authorization.k8s.io/v1
  63. metadata:
  64. name: rbd-provisioner
  65. subjects:
  66. - kind: ServiceAccount
  67. name: rbd-provisioner
  68. namespace: jenkins
  69. roleRef:
  70. kind: ClusterRole
  71. name: rbd-provisioner
  72. apiGroup: rbac.authorization.k8s.io
  73. ---
  74. apiVersion: rbac.authorization.k8s.io/v1
  75. kind: Role
  76. metadata:
  77. name: rbd-provisioner
  78. namespace: jenkins
  79. rules:
  80. - apiGroups: [""]
  81. resources: ["secrets"]
  82. verbs: ["get"]
  83. ---
  84. apiVersion: rbac.authorization.k8s.io/v1
  85. kind: RoleBinding
  86. metadata:
  87. name: rbd-provisioner
  88. namespace: jenkins
  89. roleRef:
  90. apiGroup: rbac.authorization.k8s.io
  91. kind: Role
  92. name: rbd-provisioner
  93. subjects:
  94. - kind: ServiceAccount
  95. name: rbd-provisioner
  96. namespace: jenkins
  97. ---
  98. apiVersion: apps/v1
  99. kind: Deployment
  100. metadata:
  101. name: rbd-provisioner
  102. namespace: jenkins
  103. spec:
  104. replicas: 1
  105. selector:
  106. matchLabels:
  107. app: rbd-provisioner
  108. strategy:
  109. type: Recreate
  110. template:
  111. metadata:
  112. labels:
  113. app: rbd-provisioner
  114. spec:
  115. containers:
  116. - name: rbd-provisioner
  117. image: "harbor.linux.com/rbd/rbd-provisioner:latest"
  118. imagePullPolicy: IfNotPresent
  119. env:
  120. - name: PROVISIONER_NAME
  121. value: ceph.com/rbd
  122. imagePullSecrets:
  123. - name: k8s-harbor-login
  124. serviceAccount: rbd-provisioner
  125. #敏感数据创建secret,这没什么可说的
  126. # cat ceph-jenkins-secret.yaml
  127. ##########################################################################
  128. #Author: zisefeizhu
  129. #QQ: 2********0
  130. #Date: 2020-03-09
  131. #FileName: ceph-wordpress-secret.yaml
  132. #URL: https://www.cnblogs.com/zisefeizhu/
  133. #Description: The test script
  134. #Copyright (C): 2020 All rights reserved
  135. ###########################################################################
  136. apiVersion: v1
  137. kind: Secret
  138. metadata:
  139. name: ceph-admin-secret
  140. namespace: jenkins
  141. data:
  142. key: QVFBZ2pXVmVGOVJISkJBQTBTUDRoOTVZYVdHNEN6TzNaUWtIdVE9PQ==
  143. type: kubernetes.io/rbd
  144. ---
  145. apiVersion: v1
  146. kind: Secret
  147. metadata:
  148. name: ceph-jenkins-secret
  149. namespace: jenkins
  150. data:
  151. key: QVFEUjRHWmVNUFJpRnhBQUQ1Zlg1UG9JRUNkMG85Qk5kVzN5SUE9PQ==
  152. type: kubernetes.io/rbd
  153. # cat ceph-jenkins-storageclass.yaml //
  154. ##########################################################################
  155. #Author: zisefeizhu
  156. #QQ: 2********0
  157. #Date: 2020-03-09
  158. #FileName: ceph-wordpress-storageclass.yaml
  159. #URL: https://www.cnblogs.com/zisefeizhu/
  160. #Description: The test script
  161. #Copyright (C): 2020 All rights reserved
  162. ###########################################################################
  163. apiVersion: storage.k8s.io/v1
  164. kind: StorageClass
  165. metadata:
  166. name: ceph-jenkins
  167. namespace: jenkins
  168. annotations:
  169. storageclass.kubernetes.io/is-default-class: "false"
  170. provisioner: ceph.com/rbd
  171. reclaimPolicy: Retain
  172. parameters:
  173. monitors: 20.0.0.207:6789,20.0.0.208:6789,20.0.0.210:6789
  174. adminId: admin
  175. adminSecretName: ceph-admin-secret
  176. adminSecretNamespace: jenkins
  177. pool: jenkins
  178. fsType: xfs
  179. userId: jenkins
  180. userSecretName: ceph-jenkins-secret
  181. imageFormat: "2"
  182. imageFeatures: "layering"
  183. # cat jenkins-pvc.yaml
  184. ##########################################################################
  185. #Author: zisefeizhu
  186. #QQ: 2********0
  187. #Date: 2020-03-10
  188. #FileName: jenkins-pvc.yaml
  189. #URL: https://www.cnblogs.com/zisefeizhu/
  190. #Description: The test script
  191. #Copyright (C): 2020 All rights reserved
  192. ###########################################################################
  193. apiVersion: v1
  194. kind: PersistentVolumeClaim
  195. metadata:
  196. name: jenkins-pvc
  197. namespace: jenkins
  198. # labels:
  199. # app: gitlab
  200. spec:
  201. storageClassName: ceph-jenkins
  202. accessModes:
  203. - ReadWriteOnce
  204. resources:
  205. requests:
  206. storage: 20Gi
  207. # kubectl get pvc -n jenkins
  208. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  209. jenkins-pvc Bound pvc-d386c125-5302-468a-8a94-a2570f0a4ca0 20Gi RWO ceph-jenkins 2d8h
  1. # pwd
  2. /data/k8s/jenkins
  3. # cat jenkins.yaml //核心资源清单
  4. ---
  5. apiVersion: apps/v1
  6. kind: StatefulSet
  7. metadata:
  8. name: jenkins
  9. namespace: jenkins
  10. labels:
  11. name: jenkins
  12. spec:
  13. selector:
  14. matchLabels:
  15. name: jenkins
  16. serviceName: jenkins
  17. replicas: 1
  18. updateStrategy:
  19. type: RollingUpdate
  20. template:
  21. metadata:
  22. name: jenkins
  23. labels:
  24. name: jenkins
  25. spec:
  26. terminationGracePeriodSeconds: 10
  27. serviceAccountName: jenkins
  28. #登陆私有仓库harbor认证
  29. imagePullSecrets:
  30. - name: k8s-harbor-login
  31. containers:
  32. - name: jenkins
  33. image: harbor.linux.com/dev/jenkins:lts
  34. imagePullPolicy: IfNotPresent
  35. ports:
  36. - containerPort: 8080
  37. - containerPort: 50000
  38. resources:
  39. limits:
  40. cpu: 1
  41. memory: 1Gi
  42. requests:
  43. cpu: 0.5
  44. memory: 500Mi
  45. env:
  46. - name: LIMITS_MEMORY
  47. valueFrom:
  48. resourceFieldRef:
  49. resource: limits.memory
  50. divisor: 1Mi
  51. - name: JAVA_OPTS
  52. # value: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
  53. value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
  54. volumeMounts:
  55. - name: jenkins-home
  56. mountPath: /var/jenkins_home
  57. livenessProbe:
  58. httpGet:
  59. path: /login
  60. port: 8080
  61. initialDelaySeconds: 60
  62. timeoutSeconds: 5
  63. failureThreshold: 12 # ~2 minutes
  64. readinessProbe:
  65. httpGet:
  66. path: /login
  67. port: 8080
  68. initialDelaySeconds: 60
  69. timeoutSeconds: 5
  70. failureThreshold: 12 # ~2 minutes
  71. securityContext:
  72. fsGroup: 1000
  73. volumes:
  74. - name: jenkins-home
  75. persistentVolumeClaim:
  76. claimName: jenkins-pvc
  77. ---
  78. apiVersion: v1
  79. kind: Service
  80. metadata:
  81. name: jenkins
  82. namespace: jenkins
  83. spec:
  84. # type: LoadBalancer
  85. selector:
  86. name: jenkins
  87. # ensure the client ip is propagated to avoid the invalid crumb issue when using LoadBalancer (k8s >=1.7)
  88. #externalTrafficPolicy: Local
  89. ports:
  90. -
  91. name: http
  92. port: 80
  93. targetPort: 8080
  94. protocol: TCP
  95. -
  96. name: agent
  97. port: 50000
  98. protocol: TCP
  99. # cat jenkins-serviceaccount.yaml
  100. ##########################################################################
  101. #Author: zisefeizhu
  102. #QQ: 2********0
  103. #Date: 2020-03-10
  104. #FileName: jenkins-serviceaccount.yaml
  105. #URL: https://www.cnblogs.com/zisefeizhu/
  106. #Description: The test script
  107. #Copyright (C): 2020 All rights reserved
  108. ###########################################################################
  109. # In GKE need to get RBAC permissions first with
  110. # kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=<user-name>|--group=<group-name>]
  111. ---
  112. apiVersion: v1
  113. kind: ServiceAccount
  114. metadata:
  115. name: jenkins
  116. namespace: jenkins
  117. ---
  118. kind: Role
  119. apiVersion: rbac.authorization.k8s.io/v1beta1
  120. metadata:
  121. name: jenkins
  122. namespace: jenkins
  123. rules:
  124. - apiGroups: [""]
  125. resources: ["pods"]
  126. verbs: ["create","delete","get","list","patch","update","watch"]
  127. - apiGroups: [""]
  128. resources: ["pods/exec"]
  129. verbs: ["create","delete","get","list","patch","update","watch"]
  130. - apiGroups: [""]
  131. resources: ["pods/log"]
  132. verbs: ["get","list","watch"]
  133. - apiGroups: [""]
  134. resources: ["secrets"]
  135. verbs: ["get"]
  136. ---
  137. apiVersion: rbac.authorization.k8s.io/v1beta1
  138. kind: RoleBinding
  139. metadata:
  140. name: jenkins
  141. namespace: jenkins
  142. roleRef:
  143. apiGroup: rbac.authorization.k8s.io
  144. kind: Role
  145. name: jenkins
  146. subjects:
  147. - kind: ServiceAccount
  148. name: jenkins
  149. namespace: jenkins
  150. # kubectl get pods -n jenkins
  151. NAME READY STATUS RESTARTS AGE
  152. jenkins-0 1/1 Running 14 30h
  153. rbd-provisioner-5c97b9d5ff-95qwj 1/1 Running 13 2d8h
  1. # cat jenkins-ingressroute.yaml
  2. ##########################################################################
  3. #Author: zisefeizhu
  4. #QQ: 2********0
  5. #Date: 2020-03-10
  6. #FileName: jenkins-ingressroute.yaml
  7. #URL: https://www.cnblogs.com/zisefeizhu/
  8. #Description: The test script
  9. #Copyright (C): 2020 All rights reserved
  10. ###########################################################################
  11. apiVersion: traefik.containo.us/v1alpha1
  12. kind: IngressRoute
  13. metadata:
  14. name: jenkins
  15. namespace: jenkins
  16. spec:
  17. entryPoints:
  18. - web
  19. routes:
  20. #登陆域名 需要自己在主机添加hosts解析 或者自建dns也行
  21. - match: Host(`jenkins.linux.com`)
  22. kind: Rule
  23. services:
  24. - name: jenkins #和jenkins核心资源清单一致, name是jenkins service的name
  25. port: 80 #jenkins pod 暴漏端口

image-20200315180713459

  1. # kubectl get pods -n jenkins
  2. NAME READY STATUS RESTARTS AGE
  3. jenkins-0 1/1 Running 1 18m
  4. rbd-provisioner-dbc4c8b59-grfg2 1/1 Running 1 125m
  5. # kubectl logs jenkins-0 -n jenkins
  6. VM settings:
  7. Max. Heap Size: 1.00G
  8. Ergonomics Machine Class: server
  9. Using VM: OpenJDK 64-Bit Server VM
  10. #注意 jenkins首次登陆密码
  11. ac4fe3940ec145fe9104eda3ca390d0a
  12. This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
  13. *************************************************************
  14. *************************************************************
  15. *************************************************************
  16. 2020-03-10 02:44:33.446+0000 [id=39] INFO hudson.model.UpdateSite#updateData: Obtained the latest update center data file for UpdateSource default
  17. 2020-03-10 02:44:36.699+0000 [id=25] INFO hudson.model.UpdateSite#updateData: Obtained the latest update center data file for UpdateSource default
  18. 2020-03-10 02:44:42.206+0000 [id=25] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
  19. 2020-03-10 02:44:43.044+0000 [id=39] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
  20. 2020-03-10 02:44:43.044+0000 [id=39] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
  21. 2020-03-10 02:44:43.055+0000 [id=39] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$0: Finished Download metadata. 81,778 ms
  22. 2020-03-10 02:44:43.414+0000 [id=19] INFO hudson.WebAppMain$3#run: Jenkins is fully up and running

登陆密码为:

  1. ac4fe3940ec145fe9104eda3ca390d0a

image-20200315180746691

注:本篇博文完全原创,后续将发布大量有技术的原创博文,请持续关注。
注:关于ceph集群的部署、kubernetes1.17.2高可用集群的部署可以看我的历史博文。
注:关于jenkins的使用不在本篇讲解范围内(主要是截图太多了,有空再发表吧)

版权声明:本文为zisefeizhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zisefeizhu/p/12499084.html