我正在尝试使用 Kubernetes 托管一个简单的网站。我正在尝试使用 K8s 部署、服务和入口将来自外部的流量路由到在 pod 内运行的应用程序。
以下是我的 YAML 配置文件。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: trojanwall-deployment
namespace: dev
labels:
app: trojanwall
spec:
replicas: 1
selector:
matchLabels:
app: trojanwall
template:
metadata:
labels:
app: trojanwall
spec:
containers:
- name: trojanwall
image: arbabu/trojan-wall:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: trojanwall-service
namespace: dev
spec:
selector:
app: trojanwall
ports:
- name: http
protocol: TCP
port: 3000
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: trojanwall-ingress
namespace: dev
spec:
rules:
- host: "ec2-3-96-217-161.compute-1.amazonaws.com"
http:
paths:
- path: "/trojanwall"
pathType: Prefix
backend:
service:
name: trojanwall-service
port:
number: 3000
以下是资源状态。
预期是,当我运行类似“http://ec2-3-96-217-161.compute-1.amazonaws.com/trojanwall”的程序时,我应该能够访问我的网站。但是,我得到了以下信息。
有人知道如何正确配置入口流量吗?
答案1
你需要一个负载均衡器,它通常由你的云提供商提供(从主机名来看我猜是 AWS),但它很可能缺失,因为你还缺少
ingressClassName: nginx
在 yaml 文件的 spec 部分中。这样,云负载均衡器就可以在属于该类的 nginx-ingress 对象的状态部分中更新 LoadBalancer 的 IP 地址。
整个机制由 CCM(云控制器管理器)负责,它是 k8s 组件,提供路由和服务管理等云特定功能(https://kubernetes.io/docs/concepts/architecture/cloud-controller/#service-controller)
当你的入口正确绑定时,它将显示如下内容:
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
myingress nginx myhostname.my 10.11.12.13 80, 443 6d9h
这是我的入口清单(的一部分),供参考:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
name: myingress
namespace: myns
spec:
ingressClassName: nginx
rules:
- host: myhostname.my
http:
paths:
- backend:
service:
name: myservice
port:
number: 8080
path: /
pathType: Prefix