正在执行Linux Foundation的Kubernetes开发人员课程中的实验7.2.服务网格和入口控制器,但我遇到了一个问题-Top特性仅显示/healthz请求。
它也应该显示/请求。但没有。真的很想排除故障,但我甚至不知道如何接近它。
更多详细信息
按照课程说明,我有:
1.在两个GCE虚拟机上部署一个k8s集群
1.链接器
- nginx入口控制器
1.httpd映像的简单LoadBalancer服务。实际上,这是一个NodePort服务,因为从未预配LoadBalancer。名称为secondapp
1.路由到secondapp服务的简单入口对象。
我不知道什么信息对解决问题有用。下面是我可以想到的一些信息:
设定
链接器版本
student@master:~$ linkerd version
Client version: stable-2.11.1
Server version: stable-2.11.1
student@master:~$
nginx入口控制器版本
student@master:~$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myingress default 1 2022-09-28 02:09:35.031108611 +0000 UTC deployed ingress-nginx-4.2.5 1.3.1
student@master:~$
服务清单
student@master:~$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d4h
myingress-ingress-nginx-controller LoadBalancer 10.106.67.139 <pending> 80:32144/TCP,443:32610/TCP 62m
myingress-ingress-nginx-controller-admission ClusterIP 10.107.109.117 <none> 443/TCP 62m
nginx ClusterIP 10.105.88.244 <none> 443/TCP 3h42m
registry ClusterIP 10.110.129.139 <none> 5000/TCP 3h42m
secondapp LoadBalancer 10.105.64.242 <pending> 80:32000/TCP 111m
student@master:~$
正在验证入口控制器是否为linkerd所知
student@master:~$ k get ds myingress-ingress-nginx-controller -o json | jq .spec.template.metadata.annotations
{
"linkerd.io/inject": "ingress"
}
student@master:~$
第二个应用程序窗格
apiVersion: v1
kind: Pod
metadata:
name: secondapp
labels:
example: second
spec:
containers:
- name: webserver
image: httpd
- name: busy
image: busybox
command:
- sleep
- "3600"
第二个应用程序服务
student@master:~$ k get svc secondapp -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2022-09-28T01:21:00Z"
name: secondapp
namespace: default
resourceVersion: "433221"
uid: 9266f000-5582-4796-ba73-02375f56ce2b
spec:
allocateLoadBalancerNodePorts: true
clusterIP: 10.105.64.242
clusterIPs:
- 10.105.64.242
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- nodePort: 32000
port: 80
protocol: TCP
targetPort: 80
selector:
example: second
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer: {}
student@master:~$
入口对象
student@master:~$ k get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-test <none> www.example.com 80 65m
student@master:~$ k get ingress ingress-test -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
creationTimestamp: "2022-09-28T02:20:03Z"
generation: 1
name: ingress-test
namespace: default
resourceVersion: "438934"
uid: 1952a816-a3f3-42a4-b842-deb56053b168
spec:
rules:
- host: www.example.com
http:
paths:
- backend:
service:
name: secondapp
port:
number: 80
path: /
pathType: ImplementationSpecific
status:
loadBalancer: {}
student@master:~$
测试中
第二个应用程序
student@master:~$ curl "$(curl ifconfig.io):$(k get svc secondapp '--template={{(index .spec.ports 0).nodePort}}')"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 15 100 15 0 0 340 0 --:--:-- --:--:-- --:--:-- 348
<html><body><h1>It works!</h1></body></html>
student@master:~$
通过入口控制器
student@master:~$ url="$(curl ifconfig.io):$(k get svc myingress-ingress-nginx-controller '--template={{(index .spec.ports 0).nodePort}}')"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 15 100 15 0 0 319 0 --:--:-- --:--:-- --:--:-- 319
student@master:~$ curl -H "Host: www.example.com" $url
<html><body><h1>It works!</h1></body></html>
student@master:~$
如果没有Host
头文件:
student@master:~$ curl $url
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
student@master:~$
最后是linkerd Jmeter 盘Top快照:
GET /
请求在哪里?
编辑1
所以在linkerd上有人建议去www.example.com看看https://linkerd.io/2.12/tasks/using-ingress/#nginx,这让我更仔细地检查了我的pod。结果发现有一个nginx入口pod无法启动,这显然是由于linkerd注入。请注意:
在链接器d之前
student@master:~$ k get pod
NAME READY STATUS RESTARTS AGE
myingress-ingress-nginx-controller-gbmbg 1/1 Running 0 19m
myingress-ingress-nginx-controller-qtdhw 1/1 Running 0 3m6s
secondapp 2/2 Running 4 (13m ago) 12h
student@master:~$
在链接器d之后
student@master:~$ k get ds myingress-ingress-nginx-controller -o yaml | linkerd inject --ingress - | k apply -f -
daemonset "myingress-ingress-nginx-controller" injected
daemonset.apps/myingress-ingress-nginx-controller configured
student@master:~$
检查吊舱:
第一个
我将处理我在linkerd松弛上得到的链接,并用任何新的发现更新这篇文章。
1条答案
按热度按时间b4wnujal1#
解决方案是由linkerd 2 slack论坛上的Axenow用户提供的。问题是ingress-nginx无法与它提供入口功能的服务共享名称空间。在我的例子中,所有这些服务都在默认名称空间中。
引用Axenow的话:
当你部署nginx的时候,默认情况下它会直接向pod发送流量。要解决这个问题,你必须进行如下配置:https://linkerd.io/2.12/tasks/using-ingress/#nginx
为了详细说明,必须更新下载的ingress-nginx helm图表的
values.yaml
文件,以确保以下内容为真:并将控制器安装在专用命名空间中:
(当然,已卸载了以前的安装)