当前位置:   article > 正文

k8s集群部署Java(springboot)项目_哪里有实际项目的k8s的部署文件

哪里有实际项目的k8s的部署文件

1、java项目打成jar包

1、1 在IDEA开发工具中使用maven工具将开发完成的SpringBoot项目达成jar包

        我自己的项目生成的jar为:demojenkins.jar。

1、2 将生成jar包上传到装有docker的虚拟机上

        我上传到虚拟机的文件目录是/mydocker/springboot

1、3 编写Dockerfile文件

  1. # Dockerfile文件内容如下:
  2. # 基础镜像
  3. FROM openjdk:8-jdk-alpine
  4. VOLUME /tmp
  5. # 将jar包添加到容器中
  6. ADD demojenkins.jar demojenkins.jar
  7. ENTRYPOINT ["java","-jar","/demojenkins.jar", "&"]
  8. #暴露8111端口作为微服务
  9. EXPOSE 8111
  10. # Dockerfile保留字介绍:
  11. EXPOSE:当前容器对外暴漏的端口
  12. FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM
  13. VOLUME:数据卷挂载,用于保存数据和持久化工作
  14. ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
  15. ENTRYPOINT:容器运行执行的命令,当设置了ENTRYPOINT后,docker run不会将ENTRYPOINT命令覆盖。

2、jar包制作成本地镜像

2、1 上传Dockerfile文件到/mydocker/springboot目录下

2、2 切换到/mydocker/springboot目录

$ cd /mydocker/springboot

2、3  执行docker build命令生成本地镜像:

$ docker build -t java-demo-01:1.1 .

2、4 查看镜像是否制作完成:

  1. $ docker images java-demo-01
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. java-demo-01 1.1 160217035f51 3 hours ago 122MB

 可以看到镜像已经制作完成。

3、本地镜像生成符合阿里云镜像仓库规范的镜像

3、1 登录到阿里云官网

3、2 通过控制台找到镜像容器服务

3、3 创建一个新的镜像仓库

3、4 点击管理,进入新创建的镜像仓库中

3、5 虚拟机登录到阿里云镜像仓库

$ docker login --username=XXX registry.cn-hangzhou.aliyuncs.com

输入设置的阿里云镜像仓库密码之后即可登录成功。

3、6 生成符合阿里云镜像仓库规范的镜像

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/glutgl/java-project-01:[镜像版本号]

 查看是否生成

  1. $ docker images registry.cn-hangzhou.aliyuncs.com/glutgl/java-project-01
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. registry.cn-hangzhou.aliyuncs.com/glutgl/java-project-01 1.1 160217035f51 3 hours ago 122MB

 可以看到已经创建成功。

4、推送到阿里云镜像仓库

$ docker push registry.cn-hangzhou.aliyuncs.com/glutgl/java-project-01:[镜像版本号]

 在阿里云容器镜像仓库中查看是否推送成功:

 可以看到镜像推送成功。

5、k8s集群创建deplyment和Pod容器

  1. $ kubectl apply -f javademo1.yaml
  2. # javademo1.yaml文件内容如下:
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. creationTimestamp: null
  7. labels:
  8. app: javademo1
  9. name: javademo1
  10. spec:
  11. replicas: 1
  12. selector:
  13. matchLabels:
  14. app: javademo1
  15. strategy: {}
  16. template:
  17. metadata:
  18. creationTimestamp: null
  19. labels:
  20. app: javademo1
  21. spec:
  22. containers:
  23. - image: registry.cn-hangzhou.aliyuncs.com/glutgl/java-project-01:1.1
  24. name: java-project-01
  25. ports:
  26. - containerPort: 8111
  27. resources: {}
  28. status: {}

查看deployment和Pod容器是否创建成功:

  1. $ kubectl get deployment,pods
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. deployment.apps/javademo1 1/1 1 1 88m
  4. deployment.apps/nginx 1/1 1 1 28h
  5. NAME READY STATUS RESTARTS AGE
  6. pod/javademo1-55d455d766-kd6bj 1/1 Running 0 88m
  7. pod/nginx-f89759699-qr276 1/1 Running 1 28h

可以看到deloyment和pod已经创建成功。

6、创建service

  1. $ kubectl apply -f javademo1-service.yaml
  2. # javademo1-service.yaml内容如下:
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. creationTimestamp: "2022-10-29T14:04:11Z"
  7. labels:
  8. app: javademo1
  9. managedFields:
  10. - apiVersion: v1
  11. fieldsType: FieldsV1
  12. fieldsV1:
  13. f:metadata:
  14. f:labels:
  15. .: {}
  16. f:app: {}
  17. f:spec:
  18. f:externalTrafficPolicy: {}
  19. f:ports:
  20. .: {}
  21. k:{"port":8111,"protocol":"TCP"}:
  22. .: {}
  23. f:port: {}
  24. f:protocol: {}
  25. f:targetPort: {}
  26. f:selector:
  27. .: {}
  28. f:app: {}
  29. f:sessionAffinity: {}
  30. f:type: {}
  31. manager: kubectl
  32. operation: Update
  33. time: "2022-10-29T14:04:11Z"
  34. name: javademo1
  35. namespace: default
  36. resourceVersion: "42479"
  37. selfLink: /api/v1/namespaces/default/services/javademo1
  38. uid: b7262c9a-3028-4c48-a3c9-cd11e9254adc
  39. spec:
  40. clusterIP: 10.1.54.154
  41. externalTrafficPolicy: Cluster
  42. ports:
  43. - nodePort: 30459
  44. port: 8111
  45. protocol: TCP
  46. targetPort: 8111
  47. selector:
  48. app: javademo1
  49. sessionAffinity: None
  50. type: NodePort
  51. status:
  52. loadBalancer: {}

 查看service:

  1. $ kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. javademo1 NodePort 10.1.54.154 <none> 8111:30459/TCP 89m
  4. kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 28h

可以看到service已经创建成功。

6、使用ingress对外暴露应用

6、1 部署Ingress-Controller

  1. $ kubectl apply -f ingress-controller.yaml
  2. # ingress-controller.yaml文件内容如下:
  3. apiVersion: v1
  4. kind: Namespace
  5. metadata:
  6. name: ingress-nginx
  7. labels:
  8. app.kubernetes.io/name: ingress-nginx
  9. app.kubernetes.io/part-of: ingress-nginx
  10. ---
  11. kind: ConfigMap
  12. apiVersion: v1
  13. metadata:
  14. name: nginx-configuration
  15. namespace: ingress-nginx
  16. labels:
  17. app.kubernetes.io/name: ingress-nginx
  18. app.kubernetes.io/part-of: ingress-nginx
  19. ---
  20. kind: ConfigMap
  21. apiVersion: v1
  22. metadata:
  23. name: tcp-services
  24. namespace: ingress-nginx
  25. labels:
  26. app.kubernetes.io/name: ingress-nginx
  27. app.kubernetes.io/part-of: ingress-nginx
  28. ---
  29. kind: ConfigMap
  30. apiVersion: v1
  31. metadata:
  32. name: udp-services
  33. namespace: ingress-nginx
  34. labels:
  35. app.kubernetes.io/name: ingress-nginx
  36. app.kubernetes.io/part-of: ingress-nginx
  37. ---
  38. apiVersion: v1
  39. kind: ServiceAccount
  40. metadata:
  41. name: nginx-ingress-serviceaccount
  42. namespace: ingress-nginx
  43. labels:
  44. app.kubernetes.io/name: ingress-nginx
  45. app.kubernetes.io/part-of: ingress-nginx
  46. ---
  47. apiVersion: rbac.authorization.k8s.io/v1beta1
  48. kind: ClusterRole
  49. metadata:
  50. name: nginx-ingress-clusterrole
  51. labels:
  52. app.kubernetes.io/name: ingress-nginx
  53. app.kubernetes.io/part-of: ingress-nginx
  54. rules:
  55. - apiGroups:
  56. - ""
  57. resources:
  58. - configmaps
  59. - endpoints
  60. - nodes
  61. - pods
  62. - secrets
  63. verbs:
  64. - list
  65. - watch
  66. - apiGroups:
  67. - ""
  68. resources:
  69. - nodes
  70. verbs:
  71. - get
  72. - apiGroups:
  73. - ""
  74. resources:
  75. - services
  76. verbs:
  77. - get
  78. - list
  79. - watch
  80. - apiGroups:
  81. - ""
  82. resources:
  83. - events
  84. verbs:
  85. - create
  86. - patch
  87. - apiGroups:
  88. - "extensions"
  89. - "networking.k8s.io"
  90. resources:
  91. - ingresses
  92. verbs:
  93. - get
  94. - list
  95. - watch
  96. - apiGroups:
  97. - "extensions"
  98. - "networking.k8s.io"
  99. resources:
  100. - ingresses/status
  101. verbs:
  102. - update
  103. ---
  104. apiVersion: rbac.authorization.k8s.io/v1beta1
  105. kind: Role
  106. metadata:
  107. name: nginx-ingress-role
  108. namespace: ingress-nginx
  109. labels:
  110. app.kubernetes.io/name: ingress-nginx
  111. app.kubernetes.io/part-of: ingress-nginx
  112. rules:
  113. - apiGroups:
  114. - ""
  115. resources:
  116. - configmaps
  117. - pods
  118. - secrets
  119. - namespaces
  120. verbs:
  121. - get
  122. - apiGroups:
  123. - ""
  124. resources:
  125. - configmaps
  126. resourceNames:
  127. # Defaults to "<election-id>-<ingress-class>"
  128. # Here: "<ingress-controller-leader>-<nginx>"
  129. # This has to be adapted if you change either parameter
  130. # when launching the nginx-ingress-controller.
  131. - "ingress-controller-leader-nginx"
  132. verbs:
  133. - get
  134. - update
  135. - apiGroups:
  136. - ""
  137. resources:
  138. - configmaps
  139. verbs:
  140. - create
  141. - apiGroups:
  142. - ""
  143. resources:
  144. - endpoints
  145. verbs:
  146. - get
  147. ---
  148. apiVersion: rbac.authorization.k8s.io/v1beta1
  149. kind: RoleBinding
  150. metadata:
  151. name: nginx-ingress-role-nisa-binding
  152. namespace: ingress-nginx
  153. labels:
  154. app.kubernetes.io/name: ingress-nginx
  155. app.kubernetes.io/part-of: ingress-nginx
  156. roleRef:
  157. apiGroup: rbac.authorization.k8s.io
  158. kind: Role
  159. name: nginx-ingress-role
  160. subjects:
  161. - kind: ServiceAccount
  162. name: nginx-ingress-serviceaccount
  163. namespace: ingress-nginx
  164. ---
  165. apiVersion: rbac.authorization.k8s.io/v1beta1
  166. kind: ClusterRoleBinding
  167. metadata:
  168. name: nginx-ingress-clusterrole-nisa-binding
  169. labels:
  170. app.kubernetes.io/name: ingress-nginx
  171. app.kubernetes.io/part-of: ingress-nginx
  172. roleRef:
  173. apiGroup: rbac.authorization.k8s.io
  174. kind: ClusterRole
  175. name: nginx-ingress-clusterrole
  176. subjects:
  177. - kind: ServiceAccount
  178. name: nginx-ingress-serviceaccount
  179. namespace: ingress-nginx
  180. ---
  181. apiVersion: apps/v1
  182. kind: Deployment
  183. metadata:
  184. name: nginx-ingress-controller
  185. namespace: ingress-nginx
  186. labels:
  187. app.kubernetes.io/name: ingress-nginx
  188. app.kubernetes.io/part-of: ingress-nginx
  189. spec:
  190. replicas: 1
  191. selector:
  192. matchLabels:
  193. app.kubernetes.io/name: ingress-nginx
  194. app.kubernetes.io/part-of: ingress-nginx
  195. template:
  196. metadata:
  197. labels:
  198. app.kubernetes.io/name: ingress-nginx
  199. app.kubernetes.io/part-of: ingress-nginx
  200. annotations:
  201. prometheus.io/port: "10254"
  202. prometheus.io/scrape: "true"
  203. spec:
  204. hostNetwork: true
  205. # wait up to five minutes for the drain of connections
  206. terminationGracePeriodSeconds: 300
  207. serviceAccountName: nginx-ingress-serviceaccount
  208. nodeSelector:
  209. kubernetes.io/os: linux
  210. containers:
  211. - name: nginx-ingress-controller
  212. image: lizhenliang/nginx-ingress-controller:0.30.0
  213. args:
  214. - /nginx-ingress-controller
  215. - --configmap=$(POD_NAMESPACE)/nginx-configuration
  216. - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
  217. - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
  218. - --publish-service=$(POD_NAMESPACE)/ingress-nginx
  219. - --annotations-prefix=nginx.ingress.kubernetes.io
  220. securityContext:
  221. allowPrivilegeEscalation: true
  222. capabilities:
  223. drop:
  224. - ALL
  225. add:
  226. - NET_BIND_SERVICE
  227. # www-data -> 101
  228. runAsUser: 101
  229. env:
  230. - name: POD_NAME
  231. valueFrom:
  232. fieldRef:
  233. fieldPath: metadata.name
  234. - name: POD_NAMESPACE
  235. valueFrom:
  236. fieldRef:
  237. fieldPath: metadata.namespace
  238. ports:
  239. - name: http
  240. containerPort: 80
  241. protocol: TCP
  242. - name: https
  243. containerPort: 443
  244. protocol: TCP
  245. livenessProbe:
  246. failureThreshold: 3
  247. httpGet:
  248. path: /healthz
  249. port: 10254
  250. scheme: HTTP
  251. initialDelaySeconds: 10
  252. periodSeconds: 10
  253. successThreshold: 1
  254. timeoutSeconds: 10
  255. readinessProbe:
  256. failureThreshold: 3
  257. httpGet:
  258. path: /healthz
  259. port: 10254
  260. scheme: HTTP
  261. periodSeconds: 10
  262. successThreshold: 1
  263. timeoutSeconds: 10
  264. lifecycle:
  265. preStop:
  266. exec:
  267. command:
  268. - /wait-shutdown
  269. ---
  270. apiVersion: v1
  271. kind: LimitRange
  272. metadata:
  273. name: ingress-nginx
  274. namespace: ingress-nginx
  275. labels:
  276. app.kubernetes.io/name: ingress-nginx
  277. app.kubernetes.io/part-of: ingress-nginx
  278. spec:
  279. limits:
  280. - min:
  281. memory: 90Mi
  282. cpu: 100m
  283. type: Container

6、2 查看ingress-controller是否部署完成

查看namespace:

  1. $ kubectl get ns
  2. NAME STATUS AGE
  3. default Active 28h
  4. ingress-nginx Active 32s
  5. kube-node-lease Active 28h
  6. kube-public Active 28h
  7. kube-system Active 28h

查看指定ingress-controller命名空间下的pods

  1. $ kubectl get pods -n ingress-controller
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-ingress-controller-766fb9f77-fmpgp 1/1 Running 0 3m6s

 可以看到Ingress-Controller已经部署成功

6、3 创建Ingress

  1. $ kubectl apply -f ingress.yaml
  2. # ingress.yaml文件内容如下:
  3. apiVersion: networking.k8s.io/v1beta1
  4. kind: Ingress
  5. metadata:
  6. name: example-ingress
  7. spec:
  8. rules: # ingress规则
  9. - host: cn.glut.ingredemo.com # ingress访问service服务的自定义域名
  10. http: # http协议
  11. paths: # 路径列表
  12. - path: /user # 访问路径
  13. backend: # Ingress的http请求对发送到后端
  14. serviceName: javademo1 # 对应的后端服务名称
  15. servicePort: 8111 # 对应的后端服务端口号

查看ingress是否创建:

  1. $ kubectl get ingress
  2. NAME CLASS HOSTS ADDRESS PORTS AGE
  3. example-ingress <none> cn.glut.ingredemo.com 80 10s

 7、在windows系统hosts文件中添加域名访问规则:

        在C:\Windows\System32\drivers\etc下找到hosts文件,修改文件权限,然后打开此文件,添加如下内容:

pod所在节点IP地址	cn.glut.ingredemo.com

8、访问Java项目

成功访问,至此k8s部署Java项目已经成功。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57756
推荐阅读
相关标签
  

闽ICP备14008679号