在k3d上快速安裝Istio,助你在本地靈活使用K8S!

作者丨Mitsuyuki Shiiba

原文鏈接:

https://dev.to/bufferings/tried-k8s-istio-in-my-local-machine-with-k3d-52gg

在之前的文章裏我們介紹瞭如何使用k3d創建k3s集羣,並且瞭解到k3d能爲我們搭建本地k3s環境提供非常大的便利。本文將探索k3d的另一種使用方式,將Istio安裝在k3d上,並在本地環境中使用。

本文爲社區用戶一個簡短的實踐記錄,其需求是在本地機器上運行Kubernetes以方便檢查某些東西。他之前一直在使用minikube和Docker Desktop的方案,偶然發現了k3d這個工具,於是將其實踐過程記錄了下來。

也歡迎大家向我們踊躍投稿自己的相關實踐,添加k3s小助手微信(k3s2019)即可投稿。

安裝並配置k3d

Github鏈接:https://github.com/rancher/k3d

正如之前的文章所介紹的,k3d的原理就是在容器裏面運行k3s。接下來,我就開始進行操作了。我的筆記本電腦使用的是Ubuntu系統。首先,我先使用以下命令安裝k3d:

$ curl -s https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash

然後創建一個集羣併爲kubectl設置配置:

$ k3d create
$ export KUBECONFIG=$(k3d get-kubeconfig)

成功了!

$ kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-58fb86bdfd-kvmdh   1/1     Running     0          3m40s
kube-system   coredns-57d8bbb86-grbbr                   1/1     Running     0          3m40s
kube-system   helm-install-traefik-4qr7t                0/1     Completed   0          3m40s
kube-system   svclb-traefik-j8c49                       3/3     Running     0          3m5s
kube-system   traefik-65bccdc4bd-vtk9r                  1/1     Running     0          3m5s

$ kubectl get svc -A                                                                                                                                                                                   
NAMESPACE     NAME         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                                     AGE                                                                                
default       kubernetes   ClusterIP      10.43.0.1      <none>         443/TCP                                     5m57s                                                                              
kube-system   kube-dns     ClusterIP      10.43.0.10     <none>         53/UDP,53/TCP,9153/TCP                      5m56s                                                                              
kube-system   traefik      LoadBalancer   10.43.80.235   192.168.48.2   80:30107/TCP,443:31822/TCP,8080:31373/TCP   5m5s

由上面的代碼可以看出來,k3d使用的是traefik來進行LoadBalancer服務。

在k3d上可以安裝Istio嗎?

此時,我腦袋裏冒出了一個想法,是否能將Istio運行在上面呢。然後,我找到了這個issue:

https://github.com/rancher/k3d/issues/104

根據這個issue的描述,在關閉了traefik以避免端口衝突之後,即可在上面成功運行Istio。

接下來,我來試試看。

創建沒有traefik的k3d集羣

# Delete the previous cluster
$ k3d delete

# Create a cluster without traefik
$ k3d create --server-arg --no-deploy --server-arg traefik

# Generate config
$ export KUBECONFIG=$(k3d get-kubeconfig)

# Check
$ kubectl get pod,svc -A
NAMESPACE     NAME                                          READY   STATUS    RESTARTS   AGE
kube-system   pod/local-path-provisioner-58fb86bdfd-h6npn   1/1     Running   0          13m
kube-system   pod/coredns-57d8bbb86-zkjkq                   1/1     Running   0          13m

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP                  13m
kube-system   service/kube-dns     ClusterIP   10.43.0.10   <none>        53/UDP,53/TCP,9153/TCP   13m

現在,我已經準備好在上面安裝Istio了。

安裝Istio

在本文成文時Istio 1.4剛剛發佈不久,因此我先使用Istio 1.3進行嘗試。

從下方鏈接中可以下載Istio:

https://github.com/istio/istio/releases/tag/1.3.5

我根據官網文檔上的步驟來安裝Istio:

https://istio.io/docs/setup/install/helm/

因爲我已經在我的筆記本上安裝了Helm,所以在安裝過程中我選擇helm template的選項:

# Create a namespace for Istio
$ kubectl create namespace istio-system

# Install CRDs
$ helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -

# Wait for the generation of the CRDs
$ kubectl -n istio-system wait --for=condition=complete job --all

我發現命令已經更改。之前,要檢查是否創建了23個CRD通常使用wc命令,但現在它使用的是kubectl wait –for

$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -

出乎意料的是,在整個過程中沒有出現error。這也許是我第一次如此順利地安裝Istio。

kubectl get svc,pod -n istio-system
NAME                             TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                                                                                                                                      AGE
service/istio-galley             ClusterIP      10.43.10.191    <none>         443/TCP,15014/TCP,9901/TCP                                                                                                                   2m21s
service/istio-policy             ClusterIP      10.43.86.131    <none>         9091/TCP,15004/TCP,15014/TCP                                                                                                                 2m21s
service/istio-telemetry          ClusterIP      10.43.11.107    <none>         9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       2m21s
service/istio-pilot              ClusterIP      10.43.126.19    <none>         15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       2m21s
service/prometheus               ClusterIP      10.43.41.148    <none>         9090/TCP                                                                                                                                     2m21s
service/istio-citadel            ClusterIP      10.43.91.217    <none>         8060/TCP,15014/TCP                                                                                                                           2m21s
service/istio-sidecar-injector   ClusterIP      10.43.117.133   <none>         443/TCP,15014/TCP                                                                                                                            2m21s
service/istio-ingressgateway     LoadBalancer   10.43.69.0      192.168.96.2   15020:30845/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31842/TCP,15030:32247/TCP,15031:32685/TCP,15032:31093/TCP,15443:30499/TCP   2m21s

NAME                                          READY   STATUS      RESTARTS   AGE
pod/istio-init-crd-10-1.3.5-28hj7             0/1     Completed   0          5m40s
pod/istio-init-crd-11-1.3.5-vmwmw             0/1     Completed   0          5m40s
pod/istio-init-crd-12-1.3.5-84q77             0/1     Completed   0          5m40s
pod/istio-security-post-install-1.3.5-jb66j   0/1     Completed   0          2m21s
pod/svclb-istio-ingressgateway-ww22d          9/9     Running     0          2m21s
pod/istio-citadel-5c67db5cb-hmhvb             1/1     Running     0          2m20s
pod/prometheus-6f74d6f76d-tpjpc               1/1     Running     0          2m20s
pod/istio-policy-66d87c756b-hf4wx             2/2     Running     3          2m21s
pod/istio-galley-56b9fb859d-7jmsq             1/1     Running     0          2m21s
pod/istio-sidecar-injector-5d65cfcd79-lhh6k   1/1     Running     0          2m20s
pod/istio-pilot-64478c6886-9xm7b              2/2     Running     0          2m20s
pod/istio-telemetry-5d4c4bfbbf-g4ccz          2/2     Running     4          2m20s
pod/istio-ingressgateway-7b766b6685-5vwg5     1/1     Running     0          2m21s

接下來,我將嘗試在Istio上運行一個示例應用程序。

部署bookinfo示例應用程序

爲了能夠檢查其能否正常運行,我部署了一個bookinfo示例應用程序到Istio中:

https://istio.io/docs/examples/bookinfo/

# Enable automatic sidecar injection
$ kubectl label namespace default istio-injection=enabled

# Deploy apps
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# Wait for the deployment finished for example using watch
$ kubectl get pods -w
NAME                              READY   STATUS            RESTARTS   AGE
details-v1-78d78fbddf-5db8b       0/2     PodInitializing   0          37s
reviews-v1-7bb8ffd9b6-rdgjc       0/2     PodInitializing   0          37s
ratings-v1-6c9dbf6b45-p7567       0/2     PodInitializing   0          36s
productpage-v1-596598f447-nj6wx   0/2     PodInitializing   0          36s
reviews-v3-68964bc4c8-qrhc4       0/2     PodInitializing   0          37s
reviews-v2-d7d75fff8-65f4q        0/2     PodInitializing   0          37s

# Create ingress gateway for bookinfo
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

然後,確認LoadBalancer服務的外部IP:

$ kubectl get svc  -n istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
192.168.96.2

並使用該IP打開以下URL:

http://{The IP Address}/productpage

成功了!

在這裏插入圖片描述

Bookinfo容器的內存使用量約爲2GB:

$ docker stats --no-stream
CONTAINER ID        NAME                     CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
598bd6d07c85        k3d-k3s-default-server   52.24%              1.909GiB / 15.4GiB   12.40%              819MB / 21.7MB      1.41MB / 818MB      899

經過以上實踐可知,使用k3d在本地運行Kubernetes極爲方便,它爲研發側提供了極爲便捷的Kubernetes基礎設施。

正如你所知,k3d是k3s周邊工具中的一個,通過本文我們已經體會到其帶來的便捷之處。如果你還想更深入地瞭解k3d或瞭解k3s其他周邊工具,歡迎預約今天晚上的直播課程。預約鏈接:http://z-mz.cn/Pmxd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章