设置 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. 使用 demo 配置文件安装 Istio

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

    Zip

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

    If there are errors trying to install the addons, try running the command again. There may be some timing issues which will be resolved when the command is run again.

  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. annotations:
    8. kubernetes.io/ingress.class: istio
    9. spec:
    10. rules:
    11. - host: my-istio-dashboard.io
    12. http:
    13. paths:
    14. - path: /
    15. pathType: Prefix
    16. backend:
    17. serviceName: grafana
    18. servicePort: 3000
    19. - host: my-istio-tracing.io
    20. http:
    21. paths:
    22. - path: /
    23. pathType: Prefix
    24. backend:
    25. serviceName: tracing
    26. servicePort: 9411
    27. - host: my-istio-logs-database.io
    28. http:
    29. paths:
    30. - path: /
    31. pathType: Prefix
    32. backend:
    33. serviceName: prometheus
    34. servicePort: 9090
    35. - host: my-kiali.io
    36. http:
    37. paths:
    38. - path: /
    39. pathType: Prefix
    40. backend:
    41. serviceName: kiali
    42. servicePort: 20001
    43. 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 配置文件:

    该命令假定您的集群名为 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}-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。 教程中您将会再次用到这个文件。

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

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

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