Kubernetes + Istio 入口网关端口
Kubernetes + Istio Ingress Gateway port
我在 kubernetes pod 中有一个应用程序 运行(在我的本地 docker 桌面上,启用了 kubernetes),侦听端口 8080。然后我有以下 kubernetes 配置
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: myrelease-foobar-app-gw
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: default-foobar-local-credential
hosts:
- test.foobar.local
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myrelease-foobar-app-vs
namespace: default
spec:
hosts:
- test.foobar.local
gateways:
- myrelease-foobar-app-gw
http:
- match:
- port: 443
route:
- destination:
host: myrelease-foobar-app.default.svc.cluster.local
subset: foobarAppDestination
port:
number: 8081
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: myrelease-foobar-app-destrule
namespace: default
spec:
host: myrelease-foobar-app.default.svc.cluster.local
subsets:
- name: foobarAppDestination
labels:
app.kubernetes.io/instance: myrelease
app.kubernetes.io/name: foobar-app
---
apiVersion: v1
kind: Service
metadata:
name: myrelease-foobar-app
namespace: default
labels:
helm.sh/chart: foobar-app-0.1.0
app.kubernetes.io/name: foobar-app
app.kubernetes.io/instance: myrelease
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/managed-by: Helm
spec:
type: ClusterIP
ports:
- port: 8081
targetPort: 8080
protocol: TCP
name: http
selector:
app.kubernetes.io/name: foobar-app
app.kubernetes.io/instance: myrelease
这很好用。但我想将该端口 443 更改为其他端口,比如 8443(因为我将有多个网关)。当我有这个时,我无法再访问该应用程序。我缺少某些配置吗?我猜我也需要将 Istio 配置为接受端口 8443 吗?我使用以下命令安装了 istio:
istioctl install --set profile=default -y
编辑:
我读了更多的书 (https://www.dangtrinh.com/2019/09/how-to-open-custom-port-on-istio.html),并且做了以下内容:
- kubectl -n istio-system 获取服务 istio-ingressgateway -o yaml > istio_ingressgateway.yaml
- 编辑 istio_ingressgateway.yaml,并添加以下内容:
- name: foobarhttps
nodePort: 32700
port: 445
protocol: TCP
targetPort: 8445
- kubectl apply -f istio_ingressgateway.yaml
- 上面我的网关内的变化:
- port:
number: 445
name: foobarhttps
protocol: HTTPS
- 在上面的 VirtualService 中进行更改:
http:
- match:
- port: 445
但我仍然无法从我的浏览器访问它(https://foobar.test.local:445)
我想该端口必须映射到 Istio Ingress Gateway 上。因此,如果您想使用自定义端口,则可能需要对其进行自定义。
不过一般情况下多个Gateway使用同一个端口应该问题不大,不会造成冲突。因此,对于该用例,没有必要这样做。
已修复。我在上面的编辑中做错的是:
- name: foobarhttps
nodePort: 32700
port: 445
protocol: TCP
targetPort: 8443
(注意targetPort还是8443)。我猜有一个 istio 组件在端口 8443 上监听,它处理所有这些 https 的东西。感谢 user140547 的帮助!
我在 kubernetes pod 中有一个应用程序 运行(在我的本地 docker 桌面上,启用了 kubernetes),侦听端口 8080。然后我有以下 kubernetes 配置
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: myrelease-foobar-app-gw
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: default-foobar-local-credential
hosts:
- test.foobar.local
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myrelease-foobar-app-vs
namespace: default
spec:
hosts:
- test.foobar.local
gateways:
- myrelease-foobar-app-gw
http:
- match:
- port: 443
route:
- destination:
host: myrelease-foobar-app.default.svc.cluster.local
subset: foobarAppDestination
port:
number: 8081
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: myrelease-foobar-app-destrule
namespace: default
spec:
host: myrelease-foobar-app.default.svc.cluster.local
subsets:
- name: foobarAppDestination
labels:
app.kubernetes.io/instance: myrelease
app.kubernetes.io/name: foobar-app
---
apiVersion: v1
kind: Service
metadata:
name: myrelease-foobar-app
namespace: default
labels:
helm.sh/chart: foobar-app-0.1.0
app.kubernetes.io/name: foobar-app
app.kubernetes.io/instance: myrelease
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/managed-by: Helm
spec:
type: ClusterIP
ports:
- port: 8081
targetPort: 8080
protocol: TCP
name: http
selector:
app.kubernetes.io/name: foobar-app
app.kubernetes.io/instance: myrelease
这很好用。但我想将该端口 443 更改为其他端口,比如 8443(因为我将有多个网关)。当我有这个时,我无法再访问该应用程序。我缺少某些配置吗?我猜我也需要将 Istio 配置为接受端口 8443 吗?我使用以下命令安装了 istio:
istioctl install --set profile=default -y
编辑: 我读了更多的书 (https://www.dangtrinh.com/2019/09/how-to-open-custom-port-on-istio.html),并且做了以下内容:
- kubectl -n istio-system 获取服务 istio-ingressgateway -o yaml > istio_ingressgateway.yaml
- 编辑 istio_ingressgateway.yaml,并添加以下内容:
- name: foobarhttps nodePort: 32700 port: 445 protocol: TCP targetPort: 8445
- kubectl apply -f istio_ingressgateway.yaml
- 上面我的网关内的变化:
- port: number: 445 name: foobarhttps protocol: HTTPS
- 在上面的 VirtualService 中进行更改:
http: - match: - port: 445
但我仍然无法从我的浏览器访问它(https://foobar.test.local:445)
我想该端口必须映射到 Istio Ingress Gateway 上。因此,如果您想使用自定义端口,则可能需要对其进行自定义。
不过一般情况下多个Gateway使用同一个端口应该问题不大,不会造成冲突。因此,对于该用例,没有必要这样做。
已修复。我在上面的编辑中做错的是:
- name: foobarhttps
nodePort: 32700
port: 445
protocol: TCP
targetPort: 8443
(注意targetPort还是8443)。我猜有一个 istio 组件在端口 8443 上监听,它处理所有这些 https 的东西。感谢 user140547 的帮助!