原文: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)安裝包下載并安裝惫撰。
安裝 Kubernetes
打開 Docker Desktop羔沙,點(diǎn)擊 Preferences
選擇左側(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+其障。
等待 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
)
驗(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
這是因?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
至此告组,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-ingressgateway
的 EXTERNAL-IP
為 localhost
耳璧,可得知訪問地址為 http://localhost/productpage
小結(jié)
至此成箫,我們已經(jīng)將 Kubernetes & Istio
開發(fā)環(huán)境搭建完畢。下一篇開始旨枯,我們便用理論和實(shí)踐相結(jié)合的形式講解 Istio 的特性蹬昌,咱們下一篇見。