设置 Kubernetes 集群

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

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

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

  1. $ export NAMESPACE=tutorial
  • 创建命名空间:
  1. $ kubectl create namespace $NAMESPACE

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

  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
  • 创建一个角色为 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
  • 为每个参与者创建服务账号:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: ${NAMESPACE}-user
  6. namespace: $NAMESPACE
  7. EOF
  • 限制每个参与者的权限。在教程中,参与者只需要在他们自己的命名空间中创建资源以及从 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
  • 每个参与者需要使用他们自己的 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
  • ${NAMESPACE}-user-config.yaml 配置文件设置环境变量 KUBECONFIG
  1. $ export KUBECONFIG=./${NAMESPACE}-user-config.yaml
  • 打印当前命名空间以确认配置文件已生效:
  1. $ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}"
  2. tutorial

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

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

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

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

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