spring-cloud-kubernetes官方demo运行实战

[INFO] Reactor Summary for Spring Cloud Kubernetes 1.0.1.RELEASE:

[INFO]

[INFO] Spring Cloud Kubernetes :: Dependencies … SUCCESS [ 0.077 s]

[INFO] Spring Cloud Kubernetes … SUCCESS [ 2.575 s]

[INFO] Spring Cloud Kubernetes :: Core … SUCCESS [01:51 min]

[INFO] Spring Cloud Kubernetes :: Config … SUCCESS [ 21.357 s]

[INFO] Spring Cloud Kubernetes :: Discovery … SUCCESS [ 6.473 s]

[INFO] Spring Cloud Kubernetes :: Ribbon … SUCCESS [ 31.616 s]

[INFO] Spring Cloud Kubernetes :: Starter … SUCCESS [ 0.558 s]

[INFO] Spring Cloud Kubernetes :: Starter :: Config … SUCCESS [ 0.569 s]

[INFO] Spring Cloud Kubernetes :: Starter :: Ribbon … SUCCESS [ 0.595 s]

[INFO] Spring Cloud Kubernetes :: Starter :: All … SUCCESS [ 0.571 s]

[INFO] Spring Cloud Kubernetes :: Examples … SUCCESS [ 0.558 s]

[INFO] Spring Cloud Kubernetes :: Examples :: Reload ConfigMap SUCCESS [ 9.077 s]

[INFO] Spring Cloud Kubernetes :: Examples :: Hello World . SUCCESS [ 1.323 s]

[INFO] Spring Cloud Kubernetes :: Leader … SUCCESS [ 7.395 s]

[INFO] Spring Cloud Kubernetes :: Examples :: Leader Election SUCCESS [ 0.594 s]

[INFO] Spring Cloud Kubernetes :: Istio … SUCCESS [ 12.788 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests … SUCCESS [ 0.574 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Simple Core SUCCESS [02:14 min]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Simple Configmap SUCCESS [ 0.646 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Istio SUCCESS [ 0.623 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Parent SUCCESS [ 0.564 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Service A SUCCESS [ 0.605 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Service B SUCCESS [ 0.625 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Client SUCCESS [ 0.608 s]

[INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Tests SUCCESS [ 1.440 s]

[INFO] Spring Cloud Kubernetes Docs … SUCCESS [ 0.583 s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 05:53 min

[INFO] Finished at: 2019-06-08T19:32:19+08:00

[INFO] ------------------------------------------------------------------------

  1. 进入目录spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example,这里面就是官方的入门demo,执行以下命令开始构建并且会部署到minikube:

mvn clean package fabric8:deploy -Pkubernetes

构建和部署完成后,控制台输出以下信息:

[INFO] Installing /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/kubernetes-hello-world-1.0.1.RELEASE-sources.jar to /root/.m2/repository/org/springframework/cloud/kubernetes-hello-world/1.0.1.RELEASE/kubernetes-hello-world-1.0.1.RELEASE-sources.jar

[INFO]

[INFO] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ kubernetes-hello-world <<<

[INFO]

[INFO]

[INFO] — fabric8-maven-plugin:3.5.37:deploy (default-cli) @ kubernetes-hello-world —

[INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/classes/META-INF/fabric8/kubernetes.yml

[INFO] Using namespace: default

[INFO] Creating a Service from kubernetes.yml namespace default name kubernetes-hello-world

[INFO] Created Service: spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/fabric8/applyJson/default/service-kubernetes-hello-world.json

[INFO] Using namespace: default

[INFO] Creating a Deployment from kubernetes.yml namespace default name kubernetes-hello-world

[INFO] Created Deployment: spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/fabric8/applyJson/default/deployment-kubernetes-hello-world.json

[INFO] F8: HINT: Use the command kubectl get pods -w to watch your pods start up

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 16.047 s

[INFO] Finished at: 2019-06-08T19:50:50+08:00

[INFO] ------------------------------------------------------------------------

  1. 查看服务,已经创建了,类型是NodePort ,并且将8080端口映射到宿主机的30700端口,说明可以用http://宿主机IP:30700来访问此服务:

[root@minikube kubernetes-hello-world-example]# kubectl get services

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 443/TCP 10h

kubernetes-hello-world NodePort 10.108.214.207 8080:30700/TCP 4m

  1. 查看部署,发现始终未能进入READY状态:

[root@minikube kubernetes-hello-world-example]# kubectl get deployments

NAME READY UP-TO-DATE AVAILABLE AGE

kubernetes-hello-world 0/1 1 0 4m46s

  1. 查看pod,发现新建的pod始终未能进入READY状态:

[root@minikube kubernetes-hello-world-example]# kubectl get pods

NAME READY STATUS RESTARTS AGE

kubernetes-hello-world-7578f45c5d-hr4r7 0/1 Running 1 6m

  1. 从上面的信息可以看出,部署虽然已经完成,但是pod是不可用的,访问网页试试,如下图,果然无法访问:

在这里插入图片描述

检查问题

  1. 执行命令kubectl describe pod kubernetes-hello-world-7578f45c5d-hr4r7检查pod的具体情况,如下图红框所示,两个探针检查都失败了:

在这里插入图片描述

  1. 再看看控制台输出的pod基本情况,里面有探针的信息,如下图所示,两个探针的地址都是/health:

在这里插入图片描述

  1. 打开demo的源码,如下所示,根本就没有路径为/health的服务:

@RestController

public class HelloController {

private static final Log log = LogFactory.getLog(HelloController.class);

@Autowired

private DiscoveryClient discoveryClient;

@RequestMapping(“/”)

public String hello() {

return “Hello World”;

}

@RequestMapping(“/services”)

public List services() {

return this.discoveryClient.getServices();

}

}

现在真相大白了:部署到minikube上的pod,配置了探针地址是/health,但是服务中并没有此路径,因此探针检查一直无法通过;

解决问题

搞清楚问题之后就可以动手解决问题了,这里有两种解决方式:

第一种,修改HelloController.java,增加一个方法,对应的地址是/health的服务;

第二种,修改deployment的配置,将探针地址改为现有的服务,例如"/",这是个可用的服务;

第一种方法很简单,留给读者您来完成吧,我们来试试第二种:

  1. 执行以下命令,开始编辑deployment:

kubectl edit deployment kubernetes-hello-world

  1. 在编辑页面上找到两个探针的配置,都从"/health"改成"/",如下图两个红框所示:

在这里插入图片描述

  1. 修改完毕后,像普通vim操作一样"wq"保存退出,配置会立即生效,稍等一会儿再看pod情况,发现pod的name已经变了,并且状态已经成为Ready,证明旧的pod已经销毁,新的pod被创建并且探针测试通过:

[root@minikube examples]# kubectl get pods

NAME READY STATUS RESTARTS AGE

kubernetes-hello-world-6c5f75ff74-dnm2q 1/1 Running 0 15s

  1. 访问地址http://192.168.121.133:30700 ,服务正常(192.168.121.133是宿主机IP地址),如下图:

在这里插入图片描述

官方解释

官方的demo无法在minikube上正常运行,还要我们自己去修改配置或者源码,官方的demo不应该会这样,在kubernetes-hello-world-example工程内的README.md文档中发现了对此问题的说明,如下图红框所示,fabric8的maven插件在生成探针配置的是时候配错了URL,因此官方建议我们去修改deployment的配置,将探针的地址从"/health"改为"/actuator/heath",这个问题已经被提交到了fabric8社区,并且贴出了链接:

在这里插入图片描述

权限问题

刚才我们看过了HelloController.java的源码,里面还有个路径为"/services"的接口,在minikube环境下访问此接口可以成功返回,内容是当前minikube环境的服务信息,但是如果部署在正式的kubernetes环境,访问此接口会返回以下错误:

Message: Forbidden!Configured service account doesn’t have access. Service account may have been revoked. services is forbidden: User “system:serviceaccount:default:default” cannot list resource “services” in API group “” in the namespace “default”

也就是说当前的system:serviceaccount账号是没有权限通过API server访问"services"资源的,此时最快的解决办法是提升账号权限:

kubectl create clusterrolebinding permissive-binding \

–clusterrole=cluster-admin \

–user=admin \

–user=kubelet \

–group=system:serviceaccounts

注意:以上办法只能用于开发和测试环境,不要用在生产环境,在生产环境应该参考Kubernetes的RBAC授权相关设置来处理。

修改源码时遇到的错误怎么规避

如果您想尝试修改demo的源码并且部署上去,在编译阶段可能遇到以下问题:

[root@minikube kubernetes-hello-world-example]# mvn clean package fabric8:deploy -Pkubernetes

[INFO] Scanning for projects…

[INFO]

[INFO] ----------< org.springframework.cloud:kubernetes-hello-world >----------

[INFO] Building Spring Cloud Kubernetes :: Examples :: Hello World 1.0.1.RELEASE

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] — maven-clean-plugin:2.5:clean (default-clean) @ kubernetes-hello-world —

[INFO] Deleting /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target

[INFO]

[INFO] — maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) @ kubernetes-hello-world —

[INFO] 开始检查……

[ERROR] /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/src/main/java/org/springframework/cloud/kubernetes/examples/HelloController.java:33: 当前行匹配非法表达式: ‘Trailing whitespace’。 [Regexp]

检查完成。

[INFO] ------------------------------------------------------------------------

[INFO] BUILD FAILURE

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 2.976 s

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

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

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

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

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

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

img

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入


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

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

[外链图片转存中…(img-iX1xfJUP-1713305191856)]

[外链图片转存中…(img-gzwxqXWN-1713305191856)]

[外链图片转存中…(img-NYDOb43L-1713305191856)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值