设置 Kubernetes 集群

这项工作正在进行中,我们将逐段添加其内容。欢迎您在 discuss.istio.io 网站上提供反馈。

在这个模块,您将设置一个安装了 Istio 的 Kubernetes 集群,和一个整个教程要用到的命名空间。

如果您在培训班且讲师已准备好了集群,直接前往设置本地机器

  1. 确保您有 Kubernetes 集群的访问权限。 您可以使用 Google Kubernetes EngineIBM Cloud Kubernetes Service

  2. 生成一个环境变量用于存储运行教程指令要用到的命名空间的名字。 可以用任何名字,比如 tutorial

    1. $ export NAMESPACE=tutorial
  3. 创建命名空间:

    1. $ kubectl create namespace $NAMESPACE

    如果您是一位讲师,可以为每个参与者分配独立的命名空间。本教程支持多个参与者在不同的命名空间下同时运行。

  4. 安装 Istio

  5. 启用 Envoy 访问日志

  6. 使用 kubectl 命令为这些通用 Istio 服务创建一个 Kubernetes Ingress 资源。在教程目前这个阶段要熟悉这些服务并不是必须的。

    kubectl 命令可以接收一个行内配置去为每个服务创建 Ingress 资源:

    1. $ kubectl apply -f - <<EOF
    2. apiVersion: extensions/v1beta1
    3. kind: Ingress
    4. metadata:
    5. name: istio-system
    6. namespace: istio-system
    7. spec:
    8. rules:
    9. - host: my-istio-dashboard.io
    10. http:
    11. paths:
    12. - path: /
    13. backend:
    14. serviceName: grafana
    15. servicePort: 3000
    16. - host: my-istio-tracing.io
    17. http:
    18. paths:
    19. - path: /
    20. backend:
    21. serviceName: tracing
    22. servicePort: 9411
    23. - host: my-istio-logs-database.io
    24. http:
    25. paths:
    26. - path: /
    27. backend:
    28. serviceName: prometheus
    29. servicePort: 9090
    30. - host: my-kiali.io
    31. http:
    32. paths:
    33. - path: /
    34. backend:
    35. serviceName: kiali
    36. servicePort: 20001
    37. EOF
  7. 创建一个角色为 istio-system 命名空间提供读权限。要在下面的步骤中限制参与者的权限,这个角色是必须要有的。

    1. $ kubectl apply -f - <<EOF
    2. kind: Role
    3. apiVersion: rbac.authorization.k8s.io/v1beta1
    4. metadata:
    5. name: istio-system-access
    6. namespace: istio-system
    7. rules:
    8. - apiGroups: ["", "extensions", "apps"]
    9. resources: ["*"]
    10. verbs: ["get", "list"]
    11. EOF
  8. 为每个参与者创建服务账号:

    1. $ kubectl apply -f - <<EOF
    2. apiVersion: v1
    3. kind: ServiceAccount
    4. metadata:
    5. name: ${NAMESPACE}-user
    6. namespace: $NAMESPACE
    7. EOF
  9. 限制每个参与者的权限。在教程中,参与者只需要在他们自己的命名空间中创建资源以及从 istio-system 命名空间中读取资源。 即使使用您自己的集群,这也是一个好的实践,它可以避免影响您集群中的其他命名空间。

    创建一个角色为每个参与者的命名空间提供读写权限。为每个参与者赋予这个角色,以及读取 istio-system 资源的角色:

    1. $ kubectl apply -f - <<EOF
    2. kind: Role
    3. apiVersion: rbac.authorization.k8s.io/v1beta1
    4. metadata:
    5. name: ${NAMESPACE}-access
    6. namespace: $NAMESPACE
    7. rules:
    8. - apiGroups: ["", "extensions", "apps", "networking.k8s.io", "networking.istio.io", "authentication.istio.io",
    9. "rbac.istio.io", "config.istio.io"]
    10. resources: ["*"]
    11. verbs: ["*"]
    12. ---
    13. kind: RoleBinding
    14. apiVersion: rbac.authorization.k8s.io/v1beta1
    15. metadata:
    16. name: ${NAMESPACE}-access
    17. namespace: $NAMESPACE
    18. subjects:
    19. - kind: ServiceAccount
    20. name: ${NAMESPACE}-user
    21. namespace: $NAMESPACE
    22. roleRef:
    23. apiGroup: rbac.authorization.k8s.io
    24. kind: Role
    25. name: ${NAMESPACE}-access
    26. ---
    27. kind: RoleBinding
    28. apiVersion: rbac.authorization.k8s.io/v1beta1
    29. metadata:
    30. name: ${NAMESPACE}-istio-system-access
    31. namespace: istio-system
    32. subjects:
    33. - kind: ServiceAccount
    34. name: ${NAMESPACE}-user
    35. namespace: $NAMESPACE
    36. roleRef:
    37. apiGroup: rbac.authorization.k8s.io
    38. kind: Role
    39. name: istio-system-access
    40. EOF
  10. 每个参与者需要使用他们自己的 Kubernetes 配置文件。这个配置文件指明了集群的详细信息,服务账号,证书和参与者的命名空间。 kubectl 命令使用这个配置文件在集群上操作。

    为每个参与者创建 Kubernetes 配置文件:

    1. $ cat <<EOF > ./${NAMESPACE}-user-config.yaml
    2. apiVersion: v1
    3. kind: Config
    4. preferences: {}
    5. clusters:
    6. - cluster:
    7. certificate-authority-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
    8. server: $(kubectl config view -o jsonpath="{.clusters[?(.name==\"$(kubectl config view -o jsonpath="{.contexts[?(.name==\"$(kubectl config current-context)\")].context.cluster}")\")].cluster.server}")
    9. name: ${NAMESPACE}-cluster
    10. users:
    11. - name: ${NAMESPACE}-user
    12. user:
    13. as-user-extra: {}
    14. client-key-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
    15. token: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath={.data.token} | base64 --decode)
    16. contexts:
    17. - context:
    18. cluster: ${NAMESPACE}-cluster
    19. namespace: ${NAMESPACE}
    20. user: ${NAMESPACE}-user
    21. name: ${NAMESPACE}
    22. current-context: ${NAMESPACE}
    23. EOF
  11. ${NAMESPACE}-user-config.yaml 配置文件设置环境变量 KUBECONFIG

    1. $ export KUBECONFIG=./${NAMESPACE}-user-config.yaml
  12. 打印当前命名空间以确认配置文件已生效:

    1. $ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}"
    2. tutorial

    在输出中可以看到命名空间的名字。

  13. 如果您为自己设置好了集群,复制前面步骤中提到的 ${NAMESPACE}-user-config.yaml 文件到您的本地机器,${NAMESPACE} 就是前面步骤中的命名空间。比如,tutorial-user-config.yaml。 教程中您将会再次用到这个文件。

    如果您是讲师,则将生成的配置文件发送给每个学员。学员必须将该配置文件复制到自己本地的计算机。

恭喜, 您为您的教程设置好了集群!

您已经准备好设置本地机器了。