首页 > 解决方案 > 从 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

标签: kubernetesistiokubernetes-ingress

解决方案


为了摆脱您的情况下的 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 添加到容器中:

  1. 从https://github.com/istio/istio/releases下载并解压最新的 istio 版本,适合您的操作系统
  2. 将目录更改为 istio 包。例如,如果包是 istio-0.7

    cd istio-0.7

  3. 创建注入配置:

    kubectl create -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml --dry-run -o=jsonpath='{.data.config}' > inject-config.yaml

  4. 创建网格配置:

    kubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml

  5. 将 istio sidecar 容器添加到您的部署中:

    bin/istioctl kube-inject \ --injectConfigFile inject-config.yaml \ --meshConfigFile mesh-config.yaml \ --filename path/to/original/deployment.yaml \ --output deployment-injected.yaml

  6. 部署新部署: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

推荐阅读