kubernetes - 从 nginx 入口迁移到 istio
问题描述
我有一个简单的单页 golang web 应用程序,我正在尝试迁移到 istio。
我的产品设置(通过 nginx 入口):
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: goapp
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
spec:
tls:
- hosts:
- mycustomapp.mycustomapp.com
secretName: go-tls
rules:
- host: mycustomapp.mycustomapp.com
http:
paths:
- path: /
backend:
serviceName: mycustomapp
servicePort: 80
我正在尝试为 istio 构建至少 http 配置
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: goapp
annotations:
kubernetes.io/ingress.class: istio
spec:
rules:
- host: mycustomapp.mycustomapp.com
http:
paths:
- path: /
backend:
serviceName: mycustomapp
servicePort: 80
但是我总是从仅安装了 istio 0.7.1 的干净集群上的 istio lb 获得 404。bookinfo 和 httpbin 之类的示例效果很好
应用yaml:
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: mycustomapp
name: mycustomapp
spec:
replicas: 1
selector:
matchLabels:
k8s-app: mycustomapp
template:
metadata:
labels:
k8s-app: mycustomapp
spec:
containers:
- name: mycustomapp
image: xxxx.azurecr.io/mycustomapp:999
ports:
- containerPort: 80
protocol: TCP
imagePullSecrets:
- name: xxxx
serviceAccountName: mycustomapp
---
kind: Service
apiVersion: v1
metadata:
annotations:
prometheus.io/scrape: 'true'
labels:
k8s-app: mycustomapp
name: mycustomapp
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
k8s-app: mycustomapp
解决方案
为了摆脱您的情况下的 404 错误,将正确的端口名称添加到服务和部署 YAML 文件中,并将 istio sidecar 添加到部署 YAML 文件中就足够了。然后您应该重新部署所有更改的文件。
也许您可能需要为app: mycustomapp
服务和部署添加标签,但我不确定它是必需的还是可选的。
这是具有正确端口名称的 service.yaml 文件的示例(有关端口名称的更多信息,您可以在此处阅读):
kind: Service
apiVersion: v1
metadata:
annotations:
prometheus.io/scrape: 'true'
labels:
app: mycustomapp
k8s-app: mycustomapp
name: mycustomapp
spec:
type: ClusterIP
ports:
- name: http-80
port: 80
targetPort: 80
selector:
k8s-app: mycustomapp
确保您的部署文件中还有正确的端口名称。
您可以按照以下步骤手动将 istio sidecar 添加到容器中:
- 从https://github.com/istio/istio/releases下载并解压最新的 istio 版本,适合您的操作系统
将目录更改为 istio 包。例如,如果包是 istio-0.7
cd istio-0.7
创建注入配置:
kubectl create -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml --dry-run -o=jsonpath='{.data.config}' > inject-config.yaml
创建网格配置:
kubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml
将 istio sidecar 容器添加到您的部署中:
bin/istioctl kube-inject \ --injectConfigFile inject-config.yaml \ --meshConfigFile mesh-config.yaml \ --filename path/to/original/deployment.yaml \ --output deployment-injected.yaml
部署新部署:kubectl apply -f deployment-injected.yaml
如果您想进行自动边车注入,请遵循本手册。
您可以检查 sidecar 是否已注入到部署中:
$ kubectl get deployment mycustomapp -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
mycustomapp 1 1 1 1 3h mycustomapp,istio-proxy nginx:1.7.9,docker.io/istio/proxy:0.7.1 k8s-app=mycustomapp
推荐阅读
- javascript - 为什么我的组件会渲染两次计数?
- asp.net-mvc - ASP.NET MVC NullReferenceException 只在运行时抛出,添加断点时不抛出异常
- spring - 如何禁用密钥斗篷?
- sql - BigQuery Data Studio 的值与查询本身不同
- reactjs - 是否可以使用 ReactJS 和 .NET 5/.NET Core 使用 SAML 实现 SSO?
- reactjs - Cash-Dom 在将 HTML 转换为 NextJs App 时无法工作
- react-native - 如何在 React Navigation v5 中阻止/阻止导航?
- c# - WPF UserControl 容器拖动窗口
- reactjs - 如何启用禁用列表项中的按钮
- typescript - AntD edatepicker:如何设置可选日期和未选择时为空