設定 Kubernetes 叢集

在本模組中,您將設定已安裝 Istio 的 Kubernetes 叢集,以及在整個教學課程中使用的命名空間。

  1. 請確保您可以存取 Kubernetes 叢集。您可以使用 Google Kubernetes EngineIBM Cloud Kubernetes Service

  2. 建立環境變數來儲存您在執行教學課程命令時將使用的命名空間名稱。您可以使用任何名稱,例如 tutorial

    $ export NAMESPACE=tutorial
    
  3. 建立命名空間

    $ kubectl create namespace $NAMESPACE
    
  4. 使用 demo 設定檔安裝 Istio

  5. 本範例中使用 KialiPrometheus 附加元件,且需要安裝。所有附加元件都使用下列方式安裝

    Zip
    $ kubectl apply -f @samples/addons@
    
  6. 使用顯示的 kubectl 命令,為這些常見的 Istio 服務建立 Kubernetes Ingress 資源。在本教學的此階段,不需要熟悉這些服務中的每一項。

    kubectl 命令可以接受內嵌配置,為每個服務建立 Ingress 資源

    $ kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: istio-system
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.class: istio
    spec:
      rules:
      - host: my-istio-dashboard.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: grafana
                port:
                  number: 3000
      - host: my-istio-tracing.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: tracing
                port:
                  number: 9411
      - host: my-istio-logs-database.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus
                port:
                  number: 9090
      - host: my-kiali.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kiali
                port:
                  number: 20001
    EOF
    
  7. 建立一個角色,提供對 istio-system 命名空間的讀取權限。此角色是為了限制以下步驟中參與者的權限所必需的。

    $ kubectl apply -f - <<EOF
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: istio-system-access
      namespace: istio-system
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["*"]
      verbs: ["get", "list"]
    EOF
    
  8. 為每個參與者建立一個服務帳戶

    $ kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    EOF
    
  9. 限制每個參與者的權限。在本教學中,參與者只需要在其命名空間中建立資源,以及從 istio-system 命名空間讀取資源。即使您使用自己的叢集,為了避免干擾叢集中的其他命名空間,這也是一個好習慣。

    建立一個角色,允許對每個參與者的命名空間進行讀寫存取。將參與者的服務帳戶綁定到此角色,以及綁定到從 istio-system 讀取資源的角色

    $ kubectl apply -f - <<EOF
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ${NAMESPACE}-access
      namespace: $NAMESPACE
    rules:
    - apiGroups: ["", "extensions", "apps", "networking.k8s.io", "networking.istio.io", "authentication.istio.io",
                  "rbac.istio.io", "config.istio.io", "security.istio.io"]
      resources: ["*"]
      verbs: ["*"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ${NAMESPACE}-access
      namespace: $NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: ${NAMESPACE}-access
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ${NAMESPACE}-istio-system-access
      namespace: istio-system
    subjects:
    - kind: ServiceAccount
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: istio-system-access
    EOF
    
  10. 每個參與者都需要使用自己的 Kubernetes 設定檔。此設定檔指定叢集詳細資訊、服務帳戶、憑證以及參與者的命名空間。 kubectl 命令使用此設定檔來操作叢集。

    為每個參與者產生一個 Kubernetes 設定檔

    $ cat <<EOF > ./${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
    
  11. ${NAMESPACE}-user-config.yaml 設定檔設定 KUBECONFIG 環境變數

    $ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
    
  12. 透過列印目前的命名空間來驗證設定是否生效

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

    您應該在輸出中看到您的命名空間名稱。

  13. 如果您是自己設定叢集,請將先前步驟中提到的 ${NAMESPACE}-user-config.yaml 檔案複製到您的本機電腦,其中 ${NAMESPACE} 是您在先前步驟中提供的命名空間名稱。例如,tutorial-user-config.yaml。您稍後在本教學中將需要此檔案。

    如果您是講師,請將產生的設定檔傳送給每位參與者。參與者必須將其設定檔複製到其本機電腦。

恭喜,您已為本教學設定好您的叢集!

您已準備好設定本機電腦

這個資訊有用嗎?
您有任何改進建議嗎?

感謝您的回饋!