关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
3年前关闭。
Improve this question
我对 Kubernetes 有点陌生,并且正在讨论“Ingress”。在阅读了 k8 文档和谷歌搜索后,我总结了以下内容。有人可以确认/纠正我的理解吗:
为了理解 Ingress,我将其分为 2 个部分:
云基础设施:
其中,在主节点中运行了内置的入口 Controller (但在运行 kubectl get pods -n all 时我们看不到它)。要配置,首先创建您的 Deployment Pods 并通过服务公开它们(Service Type=NodePort 必须)。此外,请确保创建默认后端服务。然后创建入口规则如下:
kind: Ingress
metadata:
name: app-ingress
spec:
backend:
serviceName: default-svc
servicePort: 80
rules:
- host: api.foo.com
http:
paths:
- path: /v1/
backend:
serviceName: api-svc-v1
servicePort: 80
- path: /v2/
backend:
serviceName: api-svc-v2
servicePort: 80
将入口规则应用于 API 服务器后,入口 Controller 会监听 API 并更新/etc/nginx.conf。此外,几分钟后,nginx Controller 会创建一个带有 IP 的外部负载均衡器(比如说 LB_IP)
现在进行测试:在您的浏览器中,输入 http://api.foo.com/(or http://) 将重定向到默认服务和http://api.foo.com/v1(or http:///v1) 将重定向它服务 api-svc-v1
问题:
使用 kubeadm 进行内部 kubernetes 部署:
在这种情况下,没有外部入口 Controller ,您需要手动安装它。要进行配置,首先创建您的部署 pod 并通过服务公开它们(确保服务类型 = NodePort)。此外,请确保使用以下 yaml 文件创建 default-backend-service.Create Ingress Controller :
spec:
containers:
-
args:
- /nginx-ingress-controller
- "--default-backend-service=\\$(POD_NAMESPACE)/default-backend"
image: "gcr.io/google_containers/nginx-ingress-controller:0.8.3"
imagePullPolicy: Always
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 5
name: nginx-ingress-controller
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
我们可以看到使用“kubectl get pods”在node3中运行的入口 Controller 并登录到这个pod,我们可以看到/etc/nginx/nginx.conf
现在创建入口规则如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/rewrite-target: /
name: app-ingress
spec:
rules:
- host: testabc.com
http:
paths:
- backend:
serviceName: appsvc1
servicePort: 80
path: /app1
- backend:
serviceName: appsvc2
servicePort: 80
path: /app2
将入口规则应用于 API 服务器后,入口 Controller 会监听 API 并更新/etc/nginx.conf。但请注意,没有创建负载均衡器。相反,当您执行“kubectl get ingress”时,您会得到 Host=testabc.com 和 IP=127.0.0.1。现在要在外面公开这个入口 Controller ,我需要使用 type=NodePort 或 type=Loadbalancer 创建一个服务
kind: Service
metadata:
name: nginx-ingress
spec:
type: NodePort
ports:
- port: 80
nodePort: 33200
name: http
selector:
app: nginx-ingress-lb
在此之后,我们将获得一个外部 IP(如果 type=Loadbalancer)
现在进行测试:在您的浏览器中,输入 http://testabc.com/(or http://) 将重定向到默认服务和http://testabc.com/v1(or http:///v1) 将重定向它服务 api-svc-v1
问题:
3.如果 ingress-controller pod 在 node3 中运行,它如何监听 node1 中运行的 ingress api
最佳答案
Q.1 由于入口 Controller pod 不可见,我如何查看/etc/nginx 文件?
答:每当您通过 Helm 安装 Nginx Ingress 时,它都会为该 Ingress 创建一个完整的部署。这个部署驻留在 Kube 系统命名空间 .所有绑定(bind)到此部署的 pod 也位于 Kube-System 命名空间 .所以,如果你想附加到这个 pod 的容器,你需要进入那个命名空间并附加到它。然后您将能够看到该命名空间中的 Pod。
Here You can see the Namespace is Kube-System & the 1st deployment in the list is for Nginx Ingress.
Q.3 如果 ingress-controller pod 在 node3 中运行,它如何监听 node1 中运行的 ingress api?
答:pod 和节点之间的整个通信都是使用 Kubernetes 中的服务进行的。服务使用 NodePort 以及内部端点和外部端点将 pod 暴露给每个节点。这个服务然后通过标签附加到部署(在这种情况下为入口部署),并且在整个集群中都是已知的以进行通信 .我希望您知道如何将服务附加到部署。因此,即使 Controller pod 在 node3 上运行,服务也知道这一点并将传入的流量转移到 pod。
Endpoints exposed to entire cluster, right above the curser.
关于nginx - kubernetes 入口 Controller 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165094/