作者丨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