istio 1.8.2刚刚发布(4天前,2021年1月14日),今晚迫不及待的作了下安装测试,和1.7版本在安装上没太大差别。这里作一个安装记录。应该是中文全网第一份简单的安装配置文档。
假定你没有K8s集群,这里用k3s在一个虚拟机上测试的。
一,k3s简介
K3s,这是一个Kubernetes的发行版,它针对边缘进行了高度优化。虽然K3s是Kubernetes的简化版、迷你版,但API的一致性和功能并没有受到影响。从kubectl到Helm再到Kubernetes,几乎所有的云原生生态系统的工具都能与K3s无缝对接。实际上,K3s是一个经过CNCF认证的、符合要求的Kubernetes发行版,可以在生产环境中部署。几乎所有运行完整的Kubernetes集群的工作负载都能保证在K3s集群上工作。
K3s的魅力在于它的简单性。作为一个单一的二进制文件(约100MB)进行打包和部署,你只需几秒钟就可以得到一个完全成熟的Kubernetes集群。安装体验就像在集群的每个节点上运行一个脚本一样简单。
K3s二进制文件是一个自给自足的封装实体,它几乎运行了Kubernetes集群的所有组件,包括API server、scheduler和controller。默认情况下,每个K3s的安装都包括控制平面、kubelet和containerd运行时,这些已经足以运行Kubernetes工作负载。当然,也可以添加只运行kubelet agent和containerd运行时的专用worker节点,来调度和管理pod生命周期。
与传统的Kubernetes集群相比,K3s中的master节点和worker节点没有明显的区别。可以在任何节点上调度和管理Pod,不管它们扮演的是什么角色。所以,master节点和worker节点的命名方式不适用于k3s集群。
在k3s集群中,将运行控制平面组件与kubelet的节点称为server,而只运行kubelet的节点称为agent。server和agent都有容器运行时和一个kubeproxy,管理整个集群的tunnel和网络流量。
二,k3s下载
1,文档
https://rancher.com/docs/k3s/latest/en/
2,下载
http://mirror.cnrancher.com/
找最新版,1.20以上版本,主要包括3个文件。
k3s:k3s的可执行文件
k3s-airgap-images-amd64.tar:离线安装镜像包
k3s-install.sh:安装脚本(这个脚本在上一级目录)
三,k3s安装
1, 将k3s拷贝到可执行目录
cp k3s /usr/local/bin/
2,将离线包导入本地docker
docker load -i k3s-airgap-images-amd64.tar
3,设置环境变量
export INSTALL_K3S_SKIP_DOWNLOAD=true
export INSTALL_K3S_EXEC="--docker --bind-address=192.168.1.214 \
kube-apiserver-arg service-node-port-range=30000-50000 \
--no-deploy traefik \
--no-deploy servicelb \
--no-deploy local-storage \
--no-deploy metrics-server \
--write-kubeconfig ~/.kube/config \
--write-kubeconfig-mode 666"
(使用docker服务,无须部署servicelb, traefik, local-storage, metrics-server)
4,运行安装脚本
sh k3s-install.sh
[INFO] Skipping k3s download and verify
[INFO] Skipping installation of SELinux RPM
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Skipping /usr/local/bin/crictl symlink to k3s, command exists in PATH at /usr/bin/crictl
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
[INFO] systemd: Starting k3s
就这么简单,一个轻量的k8s集群安装完成
四,istio简介
Istio 是一个由谷歌、IBM 与 Lyft 共同开发的开源项目,旨在提供一种统一化的微服务连接、安全保障、管理与监控方式。Istio 项目能够为微服务架构提供流量管理机制,同时亦为其它增值功能(包括安全性、监控、路由、连接管理与策略等)创造了基础。这款软件利用久经考验的 Lyft Envoy 代理进行构建,可在无需对应用程序代码作出任何发动的前提下实现可视性与控制能力。
当整体应用程序向分布式微服务架构过渡时,Istio解决了开发人员和运营商面临的挑战。
服务网格术语用于描述组成此类应用程序的微服务网络及其之间的交互。随着服务网格的大小和复杂性的增长,它变得越来越难以理解和管理。 它的要求可以包括发现,负载平衡,故障恢复,指标和监控。 服务网格通常还具有更复杂的操作要求,例如A/B测试,金丝雀,网速限制,访问控制和端到端的身份验证。
Istio提供了整个服务网格上的行为洞察力和操作控制,从而提供了完整的解决方案来满足微服务应用程序的各种需求。
Istio可以轻松在已部署服务网络上创建带有负载平衡,服务到服务的身份验证,监控等功能,并且服务代码中的代码无需变动(或变动很少)。通过在整个环境中部署一个特殊的sidecar代理来拦截微服务之间的所有网络通信,然后使用其平台控制功能配置和管理Istio,包括:
• 自动为HTTP,gRPC,WebSocket和TCP流量负载平衡。
• 通过丰富的路由规则,重试,故障转移和故障注入对流量行为进行细粒度控制。
• 可插拔的策略层和配置API,支持访问控制,速率限制和配额。
• 集群内所有流量的自动度量,日志和跟踪,包括集群的入口和出口。
• 通过强大的基于身份的身份验证和授权,在集群中进行安全的服务之间通信。
Istio专为可扩展性而设计,可满足多种部署需求。
github项目地址:
https://github.com/istio/istio
五,istio下载及安装
1,下载istio-1.8.2-linux-amd64.tar.gz,并解压,然后进入解压后的istio-1.8.2目录
2,将bin/目录下的istioctl文件,cp到可执行的PATH路径,就可以使用istioctl命令了。
3,直接使用isctio install命令,控制力较弱,这里先使用istio manifest命令生成yaml,再修改yaml之后,应用到k8s集群
istioctl manifest generate --set profile=demo --set .values.global.imagePullPolicy=IfNotPresent > istio-demo.yaml
4,将istio-ingressgateway的service的type由LoadBalancer更改为NodePort。(因为没有云厂商支持LB功能,改为NodePort方便私有云部署访问。)
六, 将yaml文件应用到集群
1, 建立namespace
kubectl create ns istio-system
2, 应用yaml到k8s(k3s)集群
kubectl apply -f istio-demo.yaml
如果报错,就多运行两次这个命令,其中有警告,可以不用理会。
输出类似如下:
Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
customresourcedefinition.apiextensions.k8s.io/authorizationpolicies.security.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/destinationrules.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/envoyfilters.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/gateways.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/istiooperators.install.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/peerauthentications.security.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/requestauthentications.security.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/serviceentries.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/sidecars.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/virtualservices.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/workloadentries.networking.istio.io unchanged
customresourcedefinition.apiextensions.k8s.io/workloadgroups.networking.istio.io unchanged
serviceaccount/istio-egressgateway-service-account unchanged
serviceaccount/istio-ingressgateway-service-account unchanged
serviceaccount/istio-reader-service-account unchanged
serviceaccount/istiod-service-account unchanged
clusterrole.rbac.authorization.k8s.io/istio-reader-istio-system unchanged
clusterrole.rbac.authorization.k8s.io/istiod-istio-system unchanged
clusterrolebinding.rbac.authorization.k8s.io/istio-reader-istio-system unchanged
clusterrolebinding.rbac.authorization.k8s.io/istiod-istio-system unchanged
Warning: admissionregistration.k8s.io/v1beta1 ValidatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 ValidatingWebhookConfiguration
validatingwebhookconfiguration.admissionregistration.k8s.io/istiod-istio-system configured
envoyfilter.networking.istio.io/metadata-exchange-1.6 unchanged
envoyfilter.networking.istio.io/metadata-exchange-1.7 unchanged
envoyfilter.networking.istio.io/metadata-exchange-1.8 unchanged
envoyfilter.networking.istio.io/stats-filter-1.6 unchanged
envoyfilter.networking.istio.io/stats-filter-1.7 unchanged
envoyfilter.networking.istio.io/stats-filter-1.8 unchanged
envoyfilter.networking.istio.io/tcp-metadata-exchange-1.6 unchanged
envoyfilter.networking.istio.io/tcp-metadata-exchange-1.7 unchanged
envoyfilter.networking.istio.io/tcp-metadata-exchange-1.8 unchanged
envoyfilter.networking.istio.io/tcp-stats-filter-1.6 unchanged
envoyfilter.networking.istio.io/tcp-stats-filter-1.7 unchanged
envoyfilter.networking.istio.io/tcp-stats-filter-1.8 unchanged
configmap/istio unchanged
configmap/istio-sidecar-injector unchanged
Warning: admissionregistration.k8s.io/v1beta1 MutatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 MutatingWebhookConfiguration
mutatingwebhookconfiguration.admissionregistration.k8s.io/istio-sidecar-injector configured
deployment.apps/istio-egressgateway configured
deployment.apps/istio-ingressgateway configured
deployment.apps/istiod configured
poddisruptionbudget.policy/istio-egressgateway unchanged
poddisruptionbudget.policy/istio-ingressgateway unchanged
poddisruptionbudget.policy/istiod unchanged
role.rbac.authorization.k8s.io/istio-egressgateway-sds unchanged
role.rbac.authorization.k8s.io/istio-ingressgateway-sds unchanged
role.rbac.authorization.k8s.io/istiod-istio-system unchanged
rolebinding.rbac.authorization.k8s.io/istio-egressgateway-sds unchanged
rolebinding.rbac.authorization.k8s.io/istio-ingressgateway-sds unchanged
rolebinding.rbac.authorization.k8s.io/istiod-istio-system unchanged
service/istio-egressgateway unchanged
service/istio-ingressgateway unchanged
service/istiod unchanged
3, 静候岁月
kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
istiod-6f77877456-4d9rp 1/1 Running 0 5h50m
istio-egressgateway-5dbd54dc69-99g9d 1/1 Running 0 5h50m
istio-ingressgateway-7586bbb5f8-bmpkh 1/1 Running 0 5h50m
七, 应用bookinfo示例
1, 启动default命名空间的自动sidecar注入功能
kubectl label namespace default istio-injection=enabled
2, 应用bookinfo到k8s集群
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
3, 应用网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
4, 应用最宽松路由
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
5, 查询pod状态及访问端口
kubectl get pod
NAME READY STATUS RESTARTS AGE
ratings-v1-7d99676f7f-vr8c4 2/2 Running 0 5h28m
details-v1-79c697d759-9zkll 2/2 Running 0 5h28m
reviews-v2-6c5bf657cf-mcrxs 2/2 Running 0 5h28m
reviews-v3-5f7b9f4f77-54lgw 2/2 Running 0 5h28m
reviews-v1-987d495c-pj87j 2/2 Running 0 5h28m
productpage-v1-65576bb7bf-qv4c7 2/2 Running 0 5h28m
kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-egressgateway ClusterIP 10.43.27.92 <none> 80/TCP,443/TCP,15443/TCP 33m
istio-ingressgateway NodePort 10.43.18.171 <none> 15021:31834/TCP,80:31226/TCP,443:32433/TCP,31400:30383/TCP,15443:30884/TCP 33m
istiod ClusterIP 10.43.185.25 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 33m
grafana NodePort 10.43.59.163 <none> 3000:32622/TCP 24m
tracing NodePort 10.43.22.172 <none> 80:31450/TCP 23m
zipkin ClusterIP 10.43.121.207 <none> 9411/TCP 23m
jaeger-collector NodePort 10.43.253.67 <none> 14268:31906/TCP,14250:31621/TCP 23m
kiali NodePort 10.43.225.156 <none> 20001:32579/TCP,9090:31058/TCP 23m
prometheus ClusterIP 10.43.147.39 <none> 9090/TCP 23m
http://192.168.1.214:31226/productpage
依旧是熟悉的配方和味道~~
八,可观测性配置
samples/addons/目录下,包括了grafana.yaml,jaeger.yaml,kiali.yaml,prometheus.yaml这4个文件,用来在istio中实现可观测性的工具(extras子目录里,是实现prometheus的operator安装和zipkin的定制,暂不理会)。手工更改4个yaml文件的内容,将service的type更改为NodePort。
然后,将这些文件应用到集群。
kubectl apply -f samples/addons/
稍后,看到这些pod和svc都运行正常,即完成。
kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
istiod-5c5945ff68-rghn2 1/1 Running 1 45m
istio-ingressgateway-68c86b9fc8-97sj5 1/1 Running 1 45m
istio-egressgateway-64d976b9b5-v29fn 1/1 Running 0 45m
jaeger-7f78b6fb65-pfgzb 1/1 Running 0 35m
grafana-784c89f4cf-lrbc8 1/1 Running 0 35m
kiali-7476977cf9-2p6fr 1/1 Running 0 35m
prometheus-7bfddb8dbf-knbmt 2/2 Running 0 35m
又是熟悉的kiali
http://192.168.1.214:32579/kiali/console/graph/namespaces/