--- title: 设置 Kubernetes 集群 overview: 为教程准备 Kubernetes 集群。 weight: 2 owner: istio/wg-docs-maintainers test: no --- {{< boilerplate work-in-progress >}} 在这个模块,您将设置一个安装了 Istio 的 Kubernetes 集群, 还将设置整个教程要用到的一个命名空间。 {{< warning >}} 如果您在培训班且讲师已准备好了集群, 直接前往[设置本地机器](/zh/docs/examples/microservices-istio/setup-local-computer)。 {{}} 1. 确保您有 [Kubernetes 集群](https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/)的访问权限。 您可以使用 [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/docs/quickstart) 或 [IBM Cloud Kubernetes Service](https://cloud.ibm.com/docs/containers?topic=containers-getting-started)。 1. 生成一个环境变量用于存储运行教程指令要用到的命名空间的名字。 可以用任何名字,比如 `tutorial`。 {{< text bash >}} $ export NAMESPACE=tutorial {{< /text >}} 1. 创建命名空间: {{< text bash >}} $ kubectl create namespace $NAMESPACE {{< /text >}} {{< tip >}} 如果您是管理员,您可以为每个用户分配一个独立的命名空间。本教程支持多个用户同时在多个命名空间中进行工作。 {{< /tip >}} 1. 使用 `demo` 配置文件[安装 Istio](/zh/docs/setup/)。 1. 本示例中使用了 [Kiali](/zh/docs/ops/integrations/kiali/) 和 [Prometheus](/zh/docs/ops/integrations/prometheus/) 附加组件, 需要安装它们。使用以下命令安装所有插件: {{< text bash >}} $ kubectl apply -f @samples/addons@ {{< /text >}} {{< tip >}} 如果尝试安装插件时出错,请尝试再次运行命令。 因为再次运行命令时可以解决一些时序引起的问题。 {{< /tip >}} 1. 使用 `kubectl` 命令为这些通用 Istio 服务创建一个 Kubernetes Ingress 资源。 在教程目前这个阶段要熟悉这些服务并不是必须的。 - [Grafana](https://grafana.com/docs/guides/getting_started/) - [Jaeger](https://www.jaegertracing.io/docs/1.13/getting-started/) - [Prometheus](https://prometheus.io/docs/prometheus/latest/getting_started/) - [Kiali](https://kiali.io/docs/installation/quick-start/) `kubectl` 命令可以通过修改 yaml 配置为每个服务创建 Ingress 资源: {{< text bash >}} $ kubectl apply -f - <}} 1. 创建一个角色为 `istio-system` 命名空间提供读权限。要在下面的步骤中限制用户的权限,这个角色是必须要有的。 {{< text bash >}} $ kubectl apply -f - <}} 1. 为每个用户创建服务账号: {{< text bash >}} $ kubectl apply -f - <}} 1. 限制每个用户的权限。在教程中,用户只需要在他们自己的命名空间中创建资源以及从 `istio-system` 命名空间中读取资源。即使使用您自己的集群,这也是一个好的实践,它可以避免影响您集群中的其他命名空间。 创建一个角色为每个用户的命名空间提供读写权限。为每个用户赋予这个角色,以及读取 `istio-system` 资源的角色: {{< text bash >}} $ kubectl apply -f - <}} 1. 每个用户需要使用他们自己的 Kubernetes 配置文件。这个配置文件指明了集群的详细信息、服务账号、证书和用户的命名空间。`kubectl` 命令使用这个配置文件在集群上操作。 为每个用户创建 Kubernetes 配置文件: {{< tip >}} 该命令假定您的集群名为 `tutorial-cluster`。 如果集群的名称不同,则将所有引用替换为集群的名称。 {{}} {{< text bash >}} $ cat < ./${NAMESPACE}-user-config.yaml apiVersion: v1 kind: Config preferences: {} clusters: - cluster: certificate-authority-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}') server: $(kubectl config view -o jsonpath="{.clusters[?(.name==\"$(kubectl config view -o jsonpath="{.contexts[?(.name==\"$(kubectl config current-context)\")].context.cluster}")\")].cluster.server}") name: ${NAMESPACE}-cluster users: - name: ${NAMESPACE}-user user: as-user-extra: {} client-key-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}') token: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath={.data.token} | base64 --decode) contexts: - context: cluster: ${NAMESPACE}-cluster namespace: ${NAMESPACE} user: ${NAMESPACE}-user name: ${NAMESPACE} current-context: ${NAMESPACE} EOF {{< /text >}} 1. 为 `${NAMESPACE}-user-config.yaml` 配置文件设置环境变量 `KUBECONFIG`: {{< text bash >}} $ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml {{< /text >}} 1. 打印当前命名空间以确认配置文件已生效: {{< text bash >}} $ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}" tutorial {{< /text >}} 在输出中可以看到命名空间的名字。 1. 如果您为自己设置好了集群,复制前面步骤中提到的 `${NAMESPACE}-user-config.yaml` 文件到您的本地机器,`${NAMESPACE}` 就是前面步骤中的命名空间。 比如,`tutorial-user-config.yaml`。教程中您将会再次用到这个文件。 如果您是讲师,则将生成的配置文件发送给每个学员。学员必须将该配置文件复制到自己本地的计算机。 恭喜,您为您的教程设置好了集群! 您已经准备好[设置本地机器](/zh/docs/examples/microservices-istio/setup-local-computer)了。