老铁们,大家好,相信还有很多朋友对于影子网站源码分享采集和影子网络网址的相关问题不太懂,没关系,今天就由我来为大家分享分享影子网站源码分享采集以及影子网络网址的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
k8s搭建
国外镜像太慢了,特别是google和docker有竞争,不把镜像弄到dockerhub上,下载真的特别麻烦。
用阿里云服务
minikubestart–image-mirror-country=&39;\n复制代码
创建ns,deployment,svc
ns.yaml
apiVersion:v1\nkind:Namespace\nmetadata:\nname:test-ns\n复制代码
deployment.yaml
apiVersion:apps/v1\nkind:Deployment\nmetadata:\nlabels:\napp:my-dep\nname:my-dep\nnamespace:test-ns\nspec:\nreplicas:3\nselector:\nmatchLabels:\napp:my-dep\ntemplate:\nmetadata:\nlabels:\napp:my-dep\nspec:\ncontainers:\n-image:nginx\nname:nginx\n复制代码
svc.yaml
apiVersion:v1\nkind:Service\nmetadata:\nlabels:\napp:my-dep\nname:my-dep\nnamespace:test-ns\nspec:\nselector:\napp:my-dep\nports:\n-port:8000\nprotocol:TCP\ntargetPort:80\ntype:NodePort\n复制代码
按照顺序创建
进入pod,修改nginx默认页面
查看pod,svc情况
进入minikube访问svc
在minikube节点中,还可以直接访问pod的ip地址,因为这里通过docker做了桥接。
而在宿主机,通过ipa可以看到下面的信息,网卡是一对的(25和26),会将192.168.49.2转发到minikube上
从外部访问minikube中的service。
流程解析1
ingress
之前一直卡在这里,就是这个镜像的问题,现在速度非常快!
minikubeaddonsenableingress\n复制代码
默认使用的是ingress-nginx
ingress-demo.yaml
apiVersion:networking.k8s.io/v1\nkind:Ingress\nmetadata:\nname:example-ingress\nannotations:\nnginx.ingress.kubernetes.io/rewrite-target:/$1\nnamespace:test-ns\nspec:\nrules:\n-host:java4ye.test\nhttp:\npaths:\n-path:/\npathType:Prefix\nbackend:\nservice:\nname:my-dep\nport:\nnumber:8000\n复制代码
这里我卡了很久,最后不知道怎么的,这个address终于有了,一开始一直是空的。
期间的操作包括重新创建ingress,以及重启minikube等。
果然搭建环境真的很折磨人,有时都不知道这个官方文档到底有没有用的
反正我跟着下面的链接操作了没有效果,最后还是得手动往宿主机的/etc/hosts中配置。
minikube.sigs.k8s.io/docs/handbo…
通过describe命令查看ingress
可以看到其中的路由规则。
配置完成后,我们只需要访问java4ye.test即可访问到后端的service,不用再访问API
再进一步,我们创建一个my-dep2标签的pod,svc,然后修改下ingress,同时配置/etc/hosts文件,
这时候便可以发现ingress的另一个好处了。
在微服务下,可以方便的将各个服务间的请求划分开,代码里也不用写死这个service的地址了,用域名就好了。
流程解析2
底层
Ingress创建成功后,会在pod中的nginx.conf文件中创建Server:java4ye.test和java4ye2.test,并配置相应的路由规则
k8sdashboard
接下来就可以通过UI直接操作这些POD了,比如查看logs或者exec等命令,方便多了
暴露到外网
我是在云服务器上搭建的,所以我先得修改服务器的防火墙,放开8001端口
接着利用kubectlproxy命令,在8001端口上启动代理服务,将请求转发到10.0.8.8上的k8s的APIServer
注意这里的address要改成内网的IP地址。不能用127.0.0.1的,也不能写minikube的地址。
kubectlproxy–port=8001–address=&39;–accept-hosts=&39;\n复制代码
最后,直接访问云服务器公网IP+8001端口,即可。
kubectlproxy的更多解释可以看这里
loft.sh/blog/when-a…
那怎么将minikube中的service暴露到公网上呢
其实,通过上面的kubectlproxy,我们可以有这么一个思路,监听公网某个端口,将它转发到k8s的某个service。
比如,利用nginx,监听某个端口,再根据访问路径的不同进行转发。
这里可选的有Nginx,HAproxy,Traefik等等。
听过这个Traefik是后起之秀,所以这次我打算用它来实现。(折磨之旅)
docs.traefik.cn/
Traefik
doc.traefik.io/traefik/
Traefikisanopen-sourceEdgeRouterthatmakespublishingyourservicesafunandeasyexperience.Itreceivesrequestsonbehalfofyoursystemandfindsoutwhichcomponentsareresponsibleforhandlingthem.
Traefik是一个开源的边缘路由器,它可以让发布你的服务成为一种有趣而简单的体验。它代表您的系统接收请求,并找出哪些组件负责处理它们。
这个上手也比较简单,所以基本的用法我就不多介绍了。
dockercompose文件
version:&39;\n\nservices:\ntraefik:\nEnablesthewebUIandtellsTraefiktolistentodocker\ncommand:–api.insecure=true–providers.docker–providers.file.directory=/etc/traefik/conf–api.insecure=true–providers.docker–providers.file.directory=/etc/traefik/conf–log.filePath=/var/log/traefik/traefik.log–log.format=json–log.level=DEBUG–accesslog=true–accesslog.filepath=/var/log/traefik/access.log–accesslog.format=json\nports:\n34;8002:80&TheWebUI(enabledby–api.insecure=true)\n-&34;\nvolumes:\n34;java4ye.test:192.168.49.2&34;java4ye2.test:192.168.49.2&Addtherouter\nrouters:\nrouter0:\nmiddlewares:\n-my-basic-auth\n-my-dep-stripPrefixRegex\n-myHeader1\nservice:my-dep\nrule:PathPrefix(`/my-dep/`)||PathPrefix(`/my-dep{a:/*$}`)\nrouter1:\nmiddlewares:\n-my-dep-stripPrefixRegex\n-my-basic-auth\n-myHeader2\nservice:my-dep2\nrule:PathPrefix(`/my-dep2/`)||PathPrefix(`/my-dep2{b:/*$}`)\n\n34;/my-dep\\\\d*&34;java4ye.test&Adds\n34;&Removes\nX-Custom-Response-Header:&34;34;java4ye2.test&34;http://java4ye.test&-url:&34;\nmy-dep2:\nloadBalancer:\nservers:\n34;http://192.168.49.2:30571&34;http://java4ye2.test&log这些是静态的,不能放在动态配置里面,不会有效果\n复制代码
这个配置文件也是不断地修修改改,折磨了两天后,终于成功了!
bug折磨我的过程
一开始搭建成功后,出现了一个很神奇的问题。
就是上面配置文件中service的url。
当我用自定义的域名时,它一直返回404给我
但是如果改成IP地址的话,就能正常访问到我们k8s中的service。
此时此刻,我已经把traefik的日志文件翻烂了,对比了一遍又一遍,都没看出啥问题。
没办法,我把目光转移到nginx容器上,到上面翻看日志时,我又产生了N多疑惑,这404日志去哪了!
为啥就记录这些200的,404你就不记录了!!(内心在咆哮!)
无奈之下,我把url换成ip的那种,再多次尝试下,我发现了一个疑点!
可以看到这里404的nginx是有版本号的!
这时我发现nginx容器的log也正常记录了这个404日志。
我开始怀疑这个请求根本没打到k8s容器上。
于是,我脑瓜子一转,不会是traefik中用到了nginx了吧,我得翻翻它的源码去(佩服自己的脑瓜子,此时此刻我还以为这个traefik就是个组装怪,底层用了nginx,然后加了些dashboard,集成k8s,docker等等)
在GitHub上搜查一番后,发现人家就是用go写的,哪有什么nginx的影子
此时,我已经很懵圈了,想不出哪里还有啥问题,甚至把官网和它的论坛翻了又翻,把有关404的问题都仔细看了一遍又一遍,差点就在GitHub上提issue了(要不是步骤有点麻烦)
终于,在刚刚吃根冰棍降降火后,我想到了ingress
好家伙,这里也是用到了nginx的,差点忘了!
我火速来进入到这个容器中,迫不及待的执行了curl命令测试下,结果它居然正常返回了。(我不能接受!)
只能去翻翻ingress的文档了
思路再次中断。
没办法,再吃点零食好了。
突然,我看到了ingress的配置文件。
这里指定了这个host!!
这一刻,我恍然大悟,肯定是traefik转发的时候,header中没有这个host。
在中间件中把这个host补上去
结果终于正常了!
这里还有点不顺畅的体验,就是正则表达式的使用(写法比较奇怪),以及路由匹配(没有好例子参考。。而且Path和PathPrefix的匹配范围不太明确)
正则表达式:
regex101.com/r/58sIgx/2
流程解析3
收获
做项目果然是最快的学习方式,有点当年做毕设的感觉哈哈。(目前打算用之前买的服务器搭建一些项目玩玩,这是小项目的开端,实验成功~)
这次实验为:用k8s+Ingress+Traefik搭建一个外网可以访问的Web服务。
通过它很好地熟悉了k8s中Deloyment,Service,Pod,Namespace,Ingress这些概念。
比如为啥要用到Ingress呢?Service不就可以访问到Pod吗?
这其实涉及到四层代理和七层代理的问题,Service只能代理到4层,而这个在我们日常开发中,往往会不够用了,毕竟我们经常得去到应用层http
Service通过标签去匹配要Pod
关于Service的更多知识可以看官网
kubernetes.io/zh-cn/docs/…
最重要的收获,网络知识
细心的小伙伴会发现,这里不仅仅有容器间通信,还有pod间通信以及Service到Pod通信
在文中我也简单提到过桥接,网卡配对,网段这些东西,但是我感触最大的还是iptables
了解到它的四表五链,也稍微知道了他们之间通过nat表做了目标地址转换等操作
那为啥用Traefik呢
这个也很简单,Nginx配置起来嫌麻烦,openresty还没用过。
这个Traefik用GO写的(快~),而且还集成了很多,如k8s,docker等等,还有个dashboard可以看看,更改一些配置也不用自己重启,挺轻松的用起来,但是后续怎样还得再看看了……(感觉服务器,网关好多选择)
最痛苦的感悟,看了那么多次日志,无数次看到host是空的,但是楞是没想到这个点,这可能就是对这些工具比较陌生,以及没有仔细思考这些配置后面的原理,就跟着傻瓜式CV了,确实有点不应该,浪费了很多时间在这,但是好处也有一点,,就是对官网文档熟悉些了还有顺便把nginx的官网也翻熟了
关于本次影子网站源码分享采集和影子网络网址的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。