设置 Kubernetes 集群

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

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

    1. 确保您有 的访问权限。 您可以使用 Google Kubernetes Engine 或 。

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

    3. 创建命名空间:

      1. $ kubectl create namespace $NAMESPACE

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

    4. 使用 demo 配置文件安装 Istio

    5. 本示例中使用了 和 Prometheus 附加组件,需要安装它们。使用以下命令安装所有插件:

      1. $ kubectl apply -f @samples/addons@

      如果尝试安装插件时出错,请尝试再次运行命令。 因为再次运行命令时可以解决一些时序引起的问题。

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

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

    7. 创建一个角色为 istio-system 命名空间提供读权限。要在下面的步骤中限制参与者的权限,这个角色是必须要有的。

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

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

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

    10. 每个参与者需要使用他们自己的 Kubernetes 配置文件。这个配置文件指明了集群的详细信息、服务账号、证书和参与者的命名空间。 kubectl 命令使用这个配置文件在集群上操作。

      该命令假定您的集群名为 tutorial-cluster。如果集群的名称不同,则将所有引用替换为集群的名称。

      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}-user
      10. user:
      11. as-user-extra: {}
      12. client-key-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
      13. token: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath={.data.token} | base64 --decode)
      14. contexts:
      15. - context:
      16. cluster: ${NAMESPACE}-cluster
      17. namespace: ${NAMESPACE}
      18. user: ${NAMESPACE}-user
      19. name: ${NAMESPACE}
      20. current-context: ${NAMESPACE}
      21. EOF
    11. ${NAMESPACE}-user-config.yaml 配置文件设置环境变量 KUBECONFIG

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

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

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

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

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

    您已经准备好了。