溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Istio1.4的部署過程

發(fā)布時間:2021-08-31 11:48:27 來源:億速云 閱讀:123 作者:chen 欄目:云計算

這篇文章主要講解了“Istio1.4的部署過程”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Istio1.4的部署過程”吧!

在部署 Istio 之前,首先需要確保 Kubernetes 集群(kubernetes 版本建議在 1.13 以上)已部署并配置好本地的 kubectl 客戶端。

1. Kubernetes 環(huán)境準(zhǔn)備

為了快速準(zhǔn)備 kubernetes 環(huán)境,我們可以使用 sealos 來部署,步驟如下:

前提條件

  • 下載kubernetes 離線安裝包

  • 下載最新版本sealos

  • 務(wù)必同步服務(wù)器時間

  • 主機名不可重復(fù)

安裝 kubernetes 集群

$ sealos init --master 192.168.0.2 \
    --node 192.168.0.3 \
    --node 192.168.0.4 \
    --node 192.168.0.5 \
    --user root \
    --passwd your-server-password \
    --version v1.16.3 \
    --pkg-url /root/kube1.16.3.tar.gz

檢查安裝是否正常:

$ kubectl get node

NAME       STATUS   ROLES    AGE   VERSION
sealos01   Ready    master   18h   v1.16.3
sealos02   Ready    <none>   18h   v1.16.3
sealos03   Ready    <none>   18h   v1.16.3
sealos04   Ready    <none>   18h   v1.16.3

2. 下載 Istio 部署文件

你可以從 GitHub 的 release 頁面下載 istio,或者直接通過下面的命令下載:

$ curl -L https://istio.io/downloadIstio | sh -

下載完成后會得到一個 istio-1.4.2 目錄,里面包含了:

  • install/kubernetes : 針對 Kubernetes 平臺的安裝文件

  • samples : 示例應(yīng)用

  • bin : istioctl 二進制文件,可以用來手動注入 sidecar proxy

進入 istio-1.4.2 目錄。

$ cd istio-1.4.2

$ tree -L 1 ./
./
├── bin
├── demo.yaml
├── install
├── LICENSE
├── manifest.yaml
├── README.md
├── samples
└── tools

4 directories, 4 files

將 istioctl 拷貝到 /usr/local/bin/ 中:

$ cp bin/istioctl /usr/local/bin/

開啟 istioctl 的自動補全功能

bash

tools 目錄中的 istioctl.bash 拷貝到 $HOME 目錄中:

$ cp tools/istioctl.bash ~/

~/.bashrc 中添加一行:

source ~/istioctl.bash

應(yīng)用生效:

$ source ~/.bashrc
zsh

tools 目錄中的 _istioctl 拷貝到 $HOME 目錄中:

$ cp tools/_istioctl ~/

~/.zshrc 中添加一行:

source ~/_istioctl

應(yīng)用生效:

$ source ~/.zshrc

3. 部署 Istio

istioctl 提供了多種安裝配置文件,可以通過下面的命令查看:

$ istioctl profile list

Istio configuration profiles:
    minimal
    remote
    sds
    default
    demo

它們之間的差異如下:


defaultdemominimalsdsremote
核心組件




istio-citadelXX
XX
istio-egressgateway
X


istio-galleyXX
X
istio-ingressgatewayXX
X
istio-nodeagent


X
istio-pilotXXXX
istio-policyXX
X
istio-sidecar-injectorXX
XX
istio-telemetryXX
X
附加組件




Grafana
X


istio-tracing
X


kiali
X


prometheusXX
X

其中標(biāo)記 X 表示該安裝該組件。

如果只是想快速試用并體驗完整的功能,可以直接使用配置文件 demo 來部署。

在正式部署之前,需要先說明兩點:

Istio CNI Plugin

當(dāng)前實現(xiàn)將用戶 pod 流量轉(zhuǎn)發(fā)到 proxy 的默認(rèn)方式是使用 privileged 權(quán)限的 istio-init 這個 init container 來做的(運行腳本寫入 iptables),需要用到 NET_ADMIN capabilities。對 linux capabilities 不了解的同學(xué)可以參考我的 Linux capabilities 系列。

Istio CNI 插件的主要設(shè)計目標(biāo)是消除這個 privileged 權(quán)限的 init container,換成利用 Kubernetes CNI 機制來實現(xiàn)相同功能的替代方案。具體的原理就是在 Kubernetes CNI 插件鏈末尾加上 Istio 的處理邏輯,在創(chuàng)建和銷毀 pod 的這些 hook 點來針對 istio 的 pod 做網(wǎng)絡(luò)配置:寫入 iptables,讓該 pod 所在的 network namespace 的網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)到 proxy 進程。

詳細內(nèi)容請參考官方文檔。

使用 Istio CNI 插件來創(chuàng)建 sidecar iptables 規(guī)則肯定是未來的主流方式,不如我們現(xiàn)在就嘗試使用這種方法。

Kubernetes 關(guān)鍵插件(Critical Add-On Pods)

眾所周知,Kubernetes 的核心組件都運行在 master 節(jié)點上,然而還有一些附加組件對整個集群來說也很關(guān)鍵,例如 DNS 和 metrics-server,這些被稱為關(guān)鍵插件。一旦關(guān)鍵插件無法正常工作,整個集群就有可能會無法正常工作,所以 Kubernetes 通過優(yōu)先級(PriorityClass)來保證關(guān)鍵插件的正常調(diào)度和運行。要想讓某個應(yīng)用變成 Kubernetes 的關(guān)鍵插件,只需要其 priorityClassName 設(shè)為 system-cluster-criticalsystem-node-critical,其中 system-node-critical 優(yōu)先級最高。

> 注意:關(guān)鍵插件只能運行在 kube-system namespace 中!

詳細內(nèi)容可以參考官方文檔。

接下來正式安裝 istio,命令如下:

$ istioctl manifest apply --set profile=demo \
   --set cni.enabled=true --set cni.components.cni.namespace=kube-system \
   --set values.gateways.istio-ingressgateway.type=ClusterIP

istioctl 支持兩種 API:

  • IstioControlPlane API

  • Helm API

在上述安裝命令中,cni 參數(shù)使用的是 IstioControlPlane API,而 values.* 使用的是 Helm API。

部署完成后,查看各組件狀態(tài):

$ kubectl -n istio-system get pod

NAME                                      READY   STATUS    RESTARTS   AGE
grafana-6b65874977-8psph                  1/1     Running   0          36s
istio-citadel-86dcf4c6b-nklp5             1/1     Running   0          37s
istio-egressgateway-68f754ccdd-m87m8      0/1     Running   0          37s
istio-galley-5fc6d6c45b-znwl9             1/1     Running   0          38s
istio-ingressgateway-6d759478d8-g5zz2     0/1     Running   0          37s
istio-pilot-5c4995d687-vf9c6              0/1     Running   0          37s
istio-policy-57b99968f-ssq28              1/1     Running   1          37s
istio-sidecar-injector-746f7c7bbb-qwc8l   1/1     Running   0          37s
istio-telemetry-854d8556d5-6znwb          1/1     Running   1          36s
istio-tracing-c66d67cd9-gjnkl             1/1     Running   0          38s
kiali-8559969566-jrdpn                    1/1     Running   0          36s
prometheus-66c5887c86-vtbwb               1/1     Running   0          39s
$ kubectl -n kube-system get pod -l k8s-app=istio-cni-node

NAME                   READY   STATUS    RESTARTS   AGE
istio-cni-node-k8zfb   1/1     Running   0          10m
istio-cni-node-kpwpc   1/1     Running   0          10m
istio-cni-node-nvblg   1/1     Running   0          10m
istio-cni-node-vk6jd   1/1     Running   0          10m

可以看到 cni 插件已經(jīng)安裝成功,查看配置是否已經(jīng)追加到 CNI 插件鏈的末尾:

$ cat /etc/cni/net.d/10-calico.conflist

{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.1",
  "plugins": [
  ...
    {
      "type": "istio-cni",
      "log_level": "info",
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/ZZZ-istio-cni-kubeconfig",
        "cni_bin_dir": "/opt/cni/bin",
        "exclude_namespaces": [
          "istio-system"
        ]
      }
    }
  ]
}

默認(rèn)情況下除了 istio-system namespace 之外,istio cni 插件會監(jiān)視其他所有 namespace 中的 Pod,然而這并不能滿足我們的需求,更嚴(yán)謹(jǐn)?shù)淖龇ㄊ亲?istio CNI 插件至少忽略 kube-system、istio-system 這兩個 namespace,怎么做呢?

也很簡單,還記得之前提到的 IstioControlPlane API 嗎?可以直接通過它來覆蓋之前的配置,只需要創(chuàng)建一個 IstioControlPlane CRD 就可以了。例如:

$ cat cni.yaml

apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
spec:
  cni:
    enabled: true
    components:
      namespace: kube-system
  values:
    cni:
      excludeNamespaces:
       - istio-system
       - kube-system
       - monitoring
  unvalidatedValues:
    cni:
      logLevel: info
$ istioctl manifest apply -f cni.yaml

刪除所有的 istio-cni-node Pod:

$ kubectl -n kube-system delete pod -l k8s-app=istio-cni-node

再次查看 CNI 插件鏈的配置:

$ cat /etc/cni/net.d/10-calico.conflist

{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.1",
  "plugins": [
  ...
    {
      "type": "istio-cni",
      "log_level": "info",
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/ZZZ-istio-cni-kubeconfig",
        "cni_bin_dir": "/opt/cni/bin",
        "exclude_namespaces": [
          "istio-system",
          "kube-system",
          "monitoring"
        ]
      }
    }
  ]
}

4. 暴露 Dashboard

這個沒什么好說的,通過 Ingress Controller 暴露就好了,可以參考我以前寫的 Istio 1.0 部署。如果使用 Contour 的可以參考我的另一篇文章:Contour 學(xué)習(xí)筆記(一):使用 Contour 接管 Kubernetes 的南北流量。

這里我再介紹一種新的方式,istioctl 提供了一個子命令來從本地打開各種 Dashboard:

$ istioctl dashboard --help

Access to Istio web UIs

Usage:
  istioctl dashboard [flags]
  istioctl dashboard [command]

Aliases:
  dashboard, dash, d

Available Commands:
  controlz    Open ControlZ web UI
  envoy       Open Envoy admin web UI
  grafana     Open Grafana web UI
  jaeger      Open Jaeger web UI
  kiali       Open Kiali web UI
  prometheus  Open Prometheus web UI
  zipkin      Open Zipkin web UI

例如,要想在本地打開 Grafana 頁面,只需執(zhí)行下面的命令:

$ istioctl dashboard grafana
http://localhost:36813

咋一看可能覺得這個功能很雞肋,我的集群又不是部署在本地,而且這個命令又不能指定監(jiān)聽的 IP,在本地用瀏覽器根本打不開呀!其實不然,你可以在本地安裝 kubectl 和 istioctl 二進制文件,然后通過 kubeconfig 連接到集群,最后再在本地執(zhí)行上面的命令,就可以打開頁面啦,開發(fā)人員用來測試是不是很方便?Windows 用戶當(dāng)我沒說。。。

5. 暴露 Gateway

為了暴露 Ingress Gateway,我們可以使用 HostNetwork 模式運行,但你會發(fā)現(xiàn)無法啟動 ingressgateway 的 Pod,因為如果 Pod 設(shè)置了 HostNetwork=true,則 dnsPolicy 就會從 ClusterFirst 被強制轉(zhuǎn)換成 Default。而 Ingress Gateway 啟動過程中需要通過 DNS 域名連接 pilot 等其他組件,所以無法啟動。

我們可以通過強制將 dnsPolicy 的值設(shè)置為 ClusterFirstWithHostNet 來解決這個問題,詳情參考:Kubernetes DNS 高階指南。

修改后的 ingressgateway deployment 配置文件如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: istio-ingressgateway
  namespace: istio-system
  ...
spec:
  ...
  template:
    metadata:
    ...
    spec:
      affinity:
        nodeAffinity:
          ...
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - 192.168.0.4   # 假設(shè)你想調(diào)度到這臺主機上
      ...
      dnsPolicy: ClusterFirstWithHostNet
      hostNetwork: true
      restartPolicy: Always
      ...

感謝各位的閱讀,以上就是“Istio1.4的部署過程”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Istio1.4的部署過程這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI