Service Mesh - Kubernetes & Istio 開發(fā)環(huán)境搭建

原文:https://makeoptim.com/service-mesh/kubernetes-istio-setup

注:更新于 2020-09-09

  • Kubernetes 1.1.5.5 -> 1.16.5
  • dashboard 2.0.0-beta8 -> 2.0.4
  • Istio 1.5 -> Istio 1.7

上一篇 介紹了 Istio 1.5 的新特性坏瘩,這對于 Istio 老用戶們確實(shí)是個(gè)好消息箭跳。從本文開始沸移,我們會用理論與實(shí)踐相結(jié)合的形式講解 Istio 知識點(diǎn)乃坤。工欲善其事必先利其器砌些,本文向大家介紹最快的 Kubernetes & Istio 開發(fā)環(huán)境搭建方法吊输,希望能幫助到大家环鲤。

Kubernetes

Istio 依托于 Kubernetes等脂,因此裁奇,首先我們先安裝 Kubernetes桐猬。Kubernetes 有許多安裝的方法,包括:Minikube刽肠、kubeadm溃肪、Docker Desktop免胃。本文選用較為便捷的 Docker Desktop。

安裝 Docker Desktop

前往Docker Desktop 選擇對應(yīng)系統(tǒng)安裝包下載并安裝惫撰。

Istio

安裝 Kubernetes

打開 Docker Desktop羔沙,點(diǎn)擊 Preferences

Istio

選擇左側(cè) Kubernetes 欄,并勾選 Enable Kubernetes厨钻,最后點(diǎn)擊 Apply & Restart

注:由于安裝過程需要下載許多東西扼雏,請開啟安全上網(wǎng),避免網(wǎng)絡(luò)問題導(dǎo)致安裝失敗

由于 Istio 1.7 要求 Kubernetes 1.16+夯膀,詳見 https://makeoptim.com/service-mesh/istio1-7#require呢蛤。因此,安裝前請先升級 Docker Desktop 到最新棍郎,以便安裝 Kubernetes 1.16+其障。

Istio

等待 Kubernetes 安裝完畢后,左下角會顯示 Kubernetes running 狀態(tài)涂佃。這時(shí)励翼,打開 Resources,在 Advanced 中將 CPU 至少設(shè)置為 4 核心辜荠,內(nèi)存至少設(shè)置為 8 GB汽抚,最后點(diǎn)擊 Apply & Restart

注:若機(jī)器資源不夠,可使用 docker system prune 指令釋放更多可用資源伯病。 該指令該默認(rèn)會清除所有如下資源:

  • 已停止的容器(container
  • 未被任何容器所使用的卷(volume
  • 未被任何容器所關(guān)聯(lián)的網(wǎng)絡(luò)(network
  • 所有懸空鏡像(image
Istio

驗(yàn)證 Kubernetes

首先造烁,先切換 Kubernetes 的 config 到 docker-desktop

$ kubectl config use docker-desktop
Switched to context "docker-desktop".

查看命名空間

$ kubectl get ns
NAME              STATUS   AGE
default           Active   22m
docker            Active   21m
kube-node-lease   Active   22m
kube-public       Active   22m
kube-system       Active   22m

部署 dashboard

執(zhí)行以下安裝命令

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

查看 dashboard

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

打開 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

Istio

這是因?yàn)闄?quán)限的原因,可通過以下方法獲取 Token午笛。

首先惭蟋,創(chuàng)建 ServiceAccount

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF
serviceaccount/admin-user created

創(chuàng)建 ClusterRoleBinding 為 dashboard sa 授權(quán)集群權(quán)限 cluster-admin

$ cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard
EOF
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

獲取 Token

$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-x2h9w
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: e9822a9d-03dc-4f43-9f1e-de54e27174e3

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXgyaDl3Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJlOTgyMmE5ZC0wM2RjLTRmNDMtOWYxZS1kZTU0ZTI3MTc0ZTMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.nL7n_R1VMU_CxWxWyc4MNaMIpA8CRjlI45LvB5TEIri6tlXHlQBhEwUA662AYFETWpPnyNljkOLGhuzTSl7RXSf6Wsv8r-qH21DqvtOP2j2cFdTy4c9MBvaAEZrmDDOHXqc9_29AIZjC5LXNApRkzAPeHgFG_HsfJjbkhZuWVOWmXW3S_kY87DlieoltVfxDR-zyMCTiMCMetXIFcDYoXl8l37jWFOZQUpZCtNIbpvIQAOMQ746LPaK9MzX7glcs7GXGXokQRrQ-RLYSe5MaNX1PnTRYJv0VSu5RhReKXhpq5gYzQhu1hE5HYZTJYwiC0ubB98zS9z2xzm_D-q6H4A
ca.crt:     1025 bytes
namespace:  20 bytes

拷貝 token,并黏貼药磺,即可進(jìn)入 dashboard

Istio
Istio

至此告组,Kubernetes 已安裝完畢,下面將 Istio 安裝到 Kubernetes 中癌佩。

Istio

下載 Istio

1木缝、訪問 Istio release 頁面下載與您操作系統(tǒng)對應(yīng)的安裝文件。在 macOS 或 Linux 系統(tǒng)中围辙,也可以通過以下命令下載最新版本的 Istio:

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

2我碟、切換到 Istio 包所在目錄下。例如:Istio 包名為 istio-1.7.0姚建,則:

$ cd istio-1.7.0/
(base) bogon:istio-1.7.0 catchzeng$ ls -l
total 48
-rw-r--r--   1 catchzeng  staff  11348  3  4 20:41 LICENSE
-rw-r--r--   1 catchzeng  staff   5818  3  4 20:41 README.md
drwxr-x---   3 catchzeng  staff     96  3  4 20:41 bin
drwxr-xr-x   7 catchzeng  staff    224  3  4 20:41 install
-rw-r-----   1 catchzeng  staff    595  3  4 20:41 manifest.yaml
drwxr-xr-x  20 catchzeng  staff    640  3  4 20:41 samples
drwxr-x---   6 catchzeng  staff    192  3  4 20:41 tools

注:安裝目錄包含如下內(nèi)容:

  • install/kubernetes 目錄下矫俺,有 Kubernetes 相關(guān)的 YAML 安裝文件
  • samples/ 目錄下,有示例應(yīng)用程序
  • bin/ 目錄下,包含 istioctl 的客戶端文件恳守。istioctl 工具用于手動注入 Envoy sidecar 代理。

3贩虾、將 istioctl 客戶端路徑增加到 path 環(huán)境變量中催烘,macOS 或 Linux 系統(tǒng)的增加方式如下:

$ export PATH=$PWD/bin:$PATH

4、驗(yàn)證安裝

$ istioctl version --remote=false
1.7.0

注:在使用 Bash 或 ZSH 控制臺時(shí)缎罢,可以選擇啟動 auto-completion option伊群。具體步驟如下:

  • Bash

    $ cp tools/istioctl.bash ~
    $ source ~/istioctl.bash
    
    
  • ZSH

    $ cp tools/_istioctl ~
    $ source ~/_istioctl
    
    

安裝 Istio

配置文件

istioctl 內(nèi)置了幾個(gè)配置文件(config profiles)供我們選擇。

$ istioctl profile list

Istio configuration profiles:
    demo
    empty
    minimal
    preview
    remote
    default

這些配置文件提供了對 Istio 控制平面和 Istio 數(shù)據(jù)平面 sidecar 的定制內(nèi)容策精。 你可以從 Istio 內(nèi)置配置文件的其中一個(gè)開始入手舰始,然后根據(jù)您的特定需求進(jìn)一步自定義配置文件。當(dāng)前提供以下幾種內(nèi)置配置文件:

  • default:根據(jù)默認(rèn)的安裝選項(xiàng)啟用組件 (建議用于生產(chǎn)部署)咽袜。
  • demo:這一配置具有適度的資源需求丸卷,旨在展示 Istio 的功能。它適合運(yùn)行 Bookinfo 應(yīng)用程序和相關(guān)任務(wù)询刹。 這是通過快速開始指導(dǎo)安裝的配置谜嫉,但是您以后可以通過自定義配置 啟用其他功能來探索更高級的任務(wù)。
  • minimal:使用 Istio 的流量管理功能所需的最少組件集凹联。
  • remote:用于配置多集群網(wǎng)格的遠(yuǎn)程集群沐兰。
  • empty:什么都不部署。 這可用作自定義配置的基本配置文件蔽挠。
  • preview: preview 配置文件包含實(shí)驗(yàn)性功能住闯。 目的是探索 Istio 的新功能。 不能保證穩(wěn)定性澳淑,安全性和性能-使用風(fēng)險(xiǎn)自負(fù)比原。
default demo minimal remote
istio-egressgateway <input type="checkbox" checked="checked" style="box-sizing: border-box; margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; overflow: visible; padding: 0px;">
istio-ingressgateway <input type="checkbox" checked="checked" style="box-sizing: border-box; margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; overflow: visible; padding: 0px;"> <input type="checkbox" checked="checked" style="box-sizing: border-box; margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; overflow: visible; padding: 0px;">
istiod <input type="checkbox" checked="checked" style="box-sizing: border-box; margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; overflow: visible; padding: 0px;"> <input type="checkbox" checked="checked" style="box-sizing: border-box; margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; overflow: visible; padding: 0px;"> <input type="checkbox" checked="checked" style="box-sizing: border-box; margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; overflow: visible; padding: 0px;">

如果你想進(jìn)一步自定義安裝 Istio 和 addons,你可以在 istioctl install 的時(shí)候增加 --set <key>=<value> 配置項(xiàng)

如果你想查看配置文件中都有那些配置杠巡,可以通過 profile dump 命令

$ istioctl profile dump demo
components:
  egressGateways:
  - enabled: true
    k8s:
      resources:
        requests:
          cpu: 10m
          memory: 40Mi
    name: istio-egressgateway

...

安裝

為了更接近生產(chǎn)環(huán)境春寿。因此,這里選用 default 配置文件部署 Istio忽孽。

$ istioctl install --set profile=default
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.
? Istio core installed
? Istiod installed
? Ingress gateways installed
? Installation complete

啟動自動注入

通過以下命令绑改,為 default 命名空間開啟 sidecar 自動注入。

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

驗(yàn)證 Istio

1兄一、部署 Bookinfo 例子程序

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

2厘线、驗(yàn)證 services & pods

$ kubectl get services
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.108.129.83    <none>        9080/TCP   18s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    86m
productpage   ClusterIP   10.104.221.90    <none>        9080/TCP   17s
ratings       ClusterIP   10.101.178.252   <none>        9080/TCP   18s
reviews       ClusterIP   10.107.61.70     <none>        9080/TCP   18s

$ kubectl get pods -w
NAME                              READY   STATUS            RESTARTS   AGE
details-v1-74f858558f-fnr9q       0/2     PodInitializing   0          107s
productpage-v1-76589d9fdc-ppgtp   0/2     PodInitializing   0          105s
ratings-v1-7855f5bcb9-gh6zt       0/2     PodInitializing   0          106s
reviews-v1-64bc5454b9-sfzs2       0/2     PodInitializing   0          105s
reviews-v2-76c64d4bdf-4g4b8       0/2     PodInitializing   0          106s
reviews-v3-5545c7c78f-87m6l       0/2     PodInitializing   0          106s
reviews-v3-5545c7c78f-87m6l       1/2     Running           0          5m10s
reviews-v3-5545c7c78f-87m6l       2/2     Running           0          5m12s
details-v1-74f858558f-fnr9q       1/2     Running           0          5m57s
details-v1-74f858558f-fnr9q       2/2     Running           0          5m59s
ratings-v1-7855f5bcb9-gh6zt       1/2     Running           0          7m3s
ratings-v1-7855f5bcb9-gh6zt       2/2     Running           0          7m4s
reviews-v1-64bc5454b9-sfzs2       1/2     Running           0          7m10s
reviews-v1-64bc5454b9-sfzs2       2/2     Running           0          7m11s
reviews-v2-76c64d4bdf-4g4b8       1/2     Running           0          7m21s
reviews-v2-76c64d4bdf-4g4b8       2/2     Running           0          7m24s
productpage-v1-76589d9fdc-ppgtp   1/2     Running           0          8m11s
productpage-v1-76589d9fdc-ppgtp   2/2     Running           0          8m12s

注:可通過 -w 觀察 pod 的狀態(tài),READY 為 2/2 表示該 pod出革,啟動了應(yīng)用本身和 sidecar 這兩個(gè)容器

3造壮、驗(yàn)證服務(wù)訪問

$ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

4、部署 gateway

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

確認(rèn)部署

$ kubectl get gateway
NAME               AGE
bookinfo-gateway   19s

5、獲取訪問路徑

$ kubectl get services -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                      AGE
istio-ingressgateway   LoadBalancer   10.108.194.170   localhost     15021:30409/TCP,80:30609/TCP,443:31666/TCP,15443:31613/TCP   8m47s
istiod                 ClusterIP      10.101.125.4     <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP                10m

通過查看 istio-ingressgatewayEXTERNAL-IPlocalhost耳璧,可得知訪問地址為 http://localhost/productpage

Istio

小結(jié)

至此成箫,我們已經(jīng)將 Kubernetes & Istio 開發(fā)環(huán)境搭建完畢。下一篇開始旨枯,我們便用理論和實(shí)踐相結(jié)合的形式講解 Istio 的特性蹬昌,咱們下一篇見。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀隔,一起剝皮案震驚了整個(gè)濱河市皂贩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昆汹,老刑警劉巖明刷,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異满粗,居然都是意外死亡辈末,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門映皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來本冲,“玉大人,你說我怎么就攤上這事劫扒∶识矗” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵沟饥,是天一觀的道長添怔。 經(jīng)常有香客問我,道長贤旷,這世上最難降的妖魔是什么广料? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮幼驶,結(jié)果婚禮上艾杏,老公的妹妹穿的比我還像新娘。我一直安慰自己盅藻,他們只是感情好购桑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氏淑,像睡著了一般勃蜘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上假残,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天缭贡,我揣著相機(jī)與錄音,去河邊找鬼。 笑死阳惹,一個(gè)胖子當(dāng)著我的面吹牛谍失,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莹汤,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼快鱼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了体啰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嗽仪,失蹤者是張志新(化名)和其女友劉穎荒勇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闻坚,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沽翔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窿凤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仅偎。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雳殊,靈堂內(nèi)的尸體忽然破棺而出橘沥,到底是詐尸還是另有隱情,我是刑警寧澤夯秃,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布座咆,位于F島的核電站,受9級特大地震影響仓洼,放射性物質(zhì)發(fā)生泄漏介陶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一色建、第九天 我趴在偏房一處隱蔽的房頂上張望哺呜。 院中可真熱鬧,春花似錦箕戳、人聲如沸某残。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驾锰。三九已至,卻和暖如春走越,著一層夾襖步出監(jiān)牢的瞬間椭豫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏酥,地道東北人喳整。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像裸扶,于是被迫代替她去往敵國和親框都。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容