namespace/spring-boot-operator-system created

customresourcedefinition.apiextensions.k8s.io/springbootapplications.springboot.qingmu.io created

role.rbac.authorization.k8s.io/spring-boot-operator-leader-election-role created

clusterrole.rbac.authorization.k8s.io/spring-boot-operator-manager-role created

clusterrole.rbac.authorization.k8s.io/spring-boot-operator-proxy-role created

clusterrole.rbac.authorization.k8s.io/spring-boot-operator-metrics-reader created

rolebinding.rbac.authorization.k8s.io/spring-boot-operator-leader-election-rolebinding created

clusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-manager-rolebinding created

clusterrolebinding.rbac.authorization.k8s.io/spring-boot-operator-proxy-rolebinding created

service/spring-boot-operator-controller-manager-metrics-service created

deployment.apps/spring-boot-operator-controller-manager created

稍等片刻查看是否已经安装成功:

kubectl  get po -n spring-boot-operator-system

成功如下输出:

NAME                                                       READY   STATUS    RESTARTS   AGE

spring-boot-operator-controller-manager-7f498596bb-wcwtn   2/2     Running   0          2m15s

部署 OperatorDemo 应用

完成了 Operator 的部署之后,我们来部署我们第一个应用。这里我们就发布上面我们编写的 Spring Boot 应用 opreator-demo。

首先,我们需要先编写一个 Spring Boot Application 的 CRD 部署 yaml,如下:

# Demo.yaml

apiVersion: springboot.qingmu.io/v1alpha1

kind: SpringBootApplication

metadata:

name: operator-demo

spec:

springBoot:

version: v1.0.0

#    image: registry.cn-shanghai.aliyuncs.com/qingmuio/operator-demo/operator-demo:v1.0.0

细心的同学可能发现了,为啥连 Image 都没有这怎么发布?就 name、version 就能完成发布?

是的没错!就能完成发布,后面我讲详细讲到他是如何完成的。

接着我们 apply 一下:

kubectl apply -f Demo.yaml

看到 console 输出:

springbootapplication.springboot.qingmu.io/operator-demo created

验证

表示创建成功了,接着我们来看下我们部署的第一个应用,这里我们直接用上面的 yaml 中的 name 过滤即可。

查看 pod。

~# kubectl  get po | grep operator-demo

operator-demo-7574f4789c-mg58m             1/1     Running   0          76s

operator-demo-7574f4789c-ssr8v             1/1     Running   0          76s

operator-demo-7574f4789c-sznww             1/1     Running   0

查看下我们的 pid 不等于 1 的设置是否生效。

根据下面的结果可以看到通过设置 ShareProcessNamespace 该参数我们可以在 Kubernetes 层面来解决这个 pid=1 的问题。

kubectl exec -it operator-demo-7574f4789c-mg58m bash

bash-5.0# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

root         1     0  0 02:06 ?        00:00:00 /pause

root         6     0 26 02:06 ?        00:00:09 java --add-opens java.base/sun.nio.ch=ALL-UNNAMED -cp /app/resources:/app/classes:/app/libs/* io.qingmu.operator.operatordemo.Oper…

root        38     0  0 02:07 pts/0    00:00:00 bash

root        44    38  0 02:07 pts/0    00:00:00 ps -ef

查看 svc。

~# kubectl  get svc | grep operator-demo

operator-demo             ClusterIP   10.101.128.6             8080/TCP            2m52s

我们来访问一下试试:

root@server1:~# curl -i http://10.101.128.6:8080

HTTP/1.1 200

Content-Type: text/plain;charset=UTF-8

Content-Length: 9

Date: Wed, 08 Apr 2020 08:45:46 GMT

hello !!!

我们来试着缩减副本数到 1 个。

编辑我们的 Demo.yaml,加入一个新的属性 replicas:

# Demo.yaml

apiVersion: springboot.qingmu.io/v1alpha1

kind: SpringBootApplication

metadata:

name: operator-demo

spec:

springBoot:

version: v1.0.0

replicas: 1

应用一下:

root@server1:~# kubectl apply -f Demo.yaml

springbootapplication.springboot.qingmu.io/operator-demo configured

再次查看 pod,会发现我们的 pod 已经缩放为一个副本了:

~# kubectl  get po | grep operator-demo

operator-demo-7574f4789c-sznww             1/1     Running   0

清理 operator-demo

要删除该 pod 我们只需要执行 delete 即可:

~# kubectl delete -f Demo.yaml

springbootapplication.springboot.qingmu.io “operator-demo” deleted

再次查看 pod,已经没了:

kubectl  get po | grep operator-demo

部署自己的应用

部署自己私有仓库的应用需要需要先创建 secret(如果已经创建跳过即可)。

创建 docker-registry 的 secret:

kubectl create

secret docker-registry aliyun-registry-secret

–docker-server=registry-vpc.cn-hangzhou.aliyuncs.com

–docker-username=***

–docker-password=***

–docker-email=***

自己应用的 crd Yaml:

apiVersion: springboot.qingmu.io/v1alpha1

kind: SpringBootApplication

metadata:

name: 你的应用的名称

spec:

springBoot:

version: v1.0.0

replicas: 1

image: 你的image地址

imagePullSecrets:

- 上面创建的secret

一个完整的 Spring Boot Application Yaml

下面是一个完整的 yaml 属性结构,大部分属性我们都可以用默认配置的即可。

不设置属性,默认使用 Operator 中设置的通用值。详见后面的自定义安装 Operator。

apiVersion: springboot.qingmu.io/v1alpha1

kind: SpringBootApplication

metadata:

name: operator-demo

namespace: default

spec:

springBoot:

# image 可以不设置,如果不设置默认使用 IMAGE_REPOSITORY+/+mate.name+:+spec.springBoot.version

# registry.cn-shanghai.aliyuncs.com/qingmuio + / + operator-demo + : + v1.0.0

image: registry.cn-shanghai.aliyuncs.com/qingmuio/operator-demo:v1.0.0

clusterIp: “”

version: v1.0.0

replicas: 1

resource:

cpu:

request: 50m

limit: “”

memory:

request: 1Gi

limit: 1Gi

path:

liveness: /actuator/health

readiness: /actuator/health

hostLog: /var/applog

shutdown: /spring/shutdown

imagePullSecrets:

- aliyun-docker-registry-secret

env:

- name: EUREKA_SERVERS

value: http://eureka1:8761/eureka/,http://eureka2:8761/eureka/,http://eureka3:8761/eureka/

nodeAffinity:

key: “failure-domain.beta.kubernetes.io/zone”

operator: “In”

values:

- “cn-i”

- “cn-h”

- “cn-g”

优雅停机的路径

由于优雅停机默认是关闭的,并且并不支持 GET 请求,所以我们需要开启和搭个桥。

首先,在 application.yml 中启用:

management:

endpoints:

web:

exposure:

include: “*”

endpoint:

shutdown:

enabled: true

然后,桥接一个 GET 方法:

@RestController

public class ShutdownController {

@Autowired

private ShutdownEndpoint shutdownEndpoint;

@GetMapping(“/spring/shutdown”)

public Map<String, String> shutdown(HttpServletRequest request) {

return shutdownEndpoint.shutdown();

}

}

node 亲和的使用

举一个例子:我们有一个 Spring Boot 应用 user-service,希望它能分布到 3 个可用区的 6 个节点上:

首先,我们把机器划分多个可用区:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-OKX1E1Bk-1712760187393)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐