Kubernetes & Istio 开发环境搭建

预计阅读时间 7 分钟

注:更新于 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 老用户们确实是个好消息。从本文开始,我们会用理论与实践相结合的形式讲解 Istio 知识点。工欲善其事必先利其器,本文向大家介绍最快的 Kubernetes & Istio 开发环境搭建方法,希望能帮助到大家。

Kubernetes

Istio 依托于 Kubernetes,因此,首先我们先安装 Kubernetes。Kubernetes 有许多安装的方法,包括:Minikube、kubeadm、Docker Desktop。本文选用较为便捷的 Docker Desktop。

安装 Docker Desktop

前往Docker Desktop 选择对应系统安装包下载并安装。

Istio

安装 Kubernetes

打开 Docker Desktop,点击 Preferences

Istio

选择左侧 Kubernetes 栏,并勾选 Enable Kubernetes,最后点击 Apply & Restart

注:由于安装过程需要下载许多东西,请开启安全上网,避免网络问题导致安装失败

由于 Istio 1.7 要求 Kubernetes 1.16+,详见 https://makeoptim.com/service-mesh/istio1-7#require。因此,安装前请先升级 Docker Desktop 到最新,以便安装 Kubernetes 1.16+。

Istio

等待 Kubernetes 安装完毕后,左下角会显示 Kubernetes running 状态。这时,打开 Resources,在 Advanced 中将 CPU 至少设置为 4 核心,内存至少设置为 8 GB,最后点击 Apply & Restart

注:若机器资源不够,可使用 docker system prune 指令释放更多可用资源。 该指令该默认会清除所有如下资源:

  • 已停止的容器(container
  • 未被任何容器所使用的卷(volume
  • 未被任何容器所关联的网络(network
  • 所有悬空镜像(image

Istio

验证 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

执行以下安装命令

$ 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

这是因为权限的原因,可通过以下方法获取 Token。

首先,创建 ServiceAccount

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

创建 ClusterRoleBinding 为 dashboard sa 授权集群权限 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,并黏贴,即可进入 dashboard

Istio

Istio

至此,Kubernetes 已安装完毕,下面将 Istio 安装到 Kubernetes 中。

Istio

下载 Istio

1、访问 Istio release 页面下载与您操作系统对应的安装文件。在 macOS 或 Linux 系统中,也可以通过以下命令下载最新版本的 Istio:

$ 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

注:安装目录包含如下内容:

  • install/kubernetes 目录下,有 Kubernetes 相关的 YAML 安装文件
  • samples/ 目录下,有示例应用程序
  • bin/ 目录下,包含 istioctl 的客户端文件。istioctl 工具用于手动注入 Envoy sidecar 代理。

3、将 istioctl 客户端路径增加到 path 环境变量中,macOS 或 Linux 系统的增加方式如下:

$ export PATH=$PWD/bin:$PATH

4、验证安装

$ istioctl version --remote=false
1.7.0

注:在使用 Bash 或 ZSH 控制台时,可以选择启动 auto-completion option。具体步骤如下:

  • Bash

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

    $ cp tools/_istioctl ~
    $ source ~/_istioctl
    

安装 Istio

配置文件

istioctl 内置了几个配置文件(config profiles)供我们选择。

$ istioctl profile list

Istio configuration profiles:
    demo
    empty
    minimal
    preview
    remote
    default

这些配置文件提供了对 Istio 控制平面和 Istio 数据平面 sidecar 的定制内容。 你可以从 Istio 内置配置文件的其中一个开始入手,然后根据您的特定需求进一步自定义配置文件。当前提供以下几种内置配置文件:

  • default:根据默认的安装选项启用组件 (建议用于生产部署)。
  • demo:这一配置具有适度的资源需求,旨在展示 Istio 的功能。它适合运行 Bookinfo 应用程序和相关任务。 这是通过快速开始指导安装的配置,但是您以后可以通过自定义配置 启用其他功能来探索更高级的任务。
  • minimal:使用 Istio 的流量管理功能所需的最少组件集
  • remote:用于配置多集群网格的远程集群。
  • empty:什么都不部署。 这可用作自定义配置的基本配置文件。
  • preview: preview 配置文件包含实验性功能。 目的是探索 Istio 的新功能。 不能保证稳定性,安全性和性能-使用风险自负。
  default demo minimal remote
istio-egressgateway      
istio-ingressgateway    
istiod  

如果你想进一步自定义安装 Istio 和 addons,你可以在 istioctl install 的时候增加 --set <key>=<value> 配置项

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

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

...

安装

为了更接近生产环境。因此,这里选用 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

验证 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、验证 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 的状态,READY 为 2/2 表示该 pod,启动了应用本身和 sidecar 这两个容器

3、验证服务访问

$ 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

确认部署

$ 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

小结

至此,我们已经将 Kubernetes & Istio 开发环境搭建完毕。下一篇开始,我们便用理论和实践相结合的形式讲解 Istio 的特性,咱们下一篇见。

参考

MakeOptim

MakeOptim

MakeOptim 是个人所学总结完再总结而形成的高质量文集。旨在通过这些文章,沉淀自己,帮助他人。