Resumen del problema y registro del proceso de Istio de la instalación del clúster k8s

1. Introducción

Este artículo registra la instalación del clúster k8s de Helm, Istio y Kiali para facilitar el aprendizaje de conceptos relacionados.
La premisa requiere un clúster k8s:
inserte la descripción de la imagen aquí
puede consultar: arquitectura Arm64 (MacBookPro M1) instalación de la máquina virtual registros de la versión k8s1.27.3 y resumen del problema

Helm es el administrador de paquetes del clúster k8s Podemos instalar aplicaciones en el clúster k8s a través de Helm.
Istio es una potente plataforma de malla de servicios que proporciona un amplio conjunto de herramientas y funciones para arquitecturas de microservicios a fin de simplificar y mejorar la comunicación, la seguridad y la visibilidad entre servicios.
El tablero de Kiali presenta una descripción general de la cuadrícula y las relaciones entre los diversos servicios de la aplicación de ejemplo Bookinfo. También proporciona filtros para visualizar el flujo de tráfico.

Política de soporte de la versión de Helm: https://helm.sh/zh/docs/topics/version_skew/
Política de soporte de la versión de Istio: https://istio.io/latest/zh/docs/releases/supported-releases/
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

2. Implementar Helm

Documento oficial: https://helm.sh/zh/docs/intro/quickstart/
El método de instalación de Helm es muy simple, solo necesita ejecutar un comando y ejecutar el script correspondiente para completar la instalación. Si necesita instalar la versión correspondiente, cada versión de Helm proporciona versiones binarias de varios sistemas operativos: https://github.com/helm/helm/releases, estas versiones pueden descargarse e instalarse manualmente y luego descomprimirse para mover helm a el directorio deseado ( mv linux-amd64/helm /usr/local/bin/helm)

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
[root@k8s-master ~]# curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11345  100 11345    0     0   8068      0  0:00:01  0:00:01 --:--:--  8063
[WARNING] Could not find git. It is required for plugin installation.
Downloading https://get.helm.sh/helm-v3.12.1-linux-arm64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
[root@k8s-master ~]# helm version
version.BuildInfo{
    
    Version:"v3.12.1", GitCommit:"f32a527a060157990e2aa86bf45010dfb3cc8b8d", GitTreeState:"clean", GoVersion:"go1.20.4"}
[root@k8s-master ~]# helm ls
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
[root@k8s-master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
[root@k8s-master ~]# 
[root@k8s-master ~]# helm repo update     
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈

3. Implementar Istio

Documento oficial: https://istio.io/latest/zh/docs/setup/getting-started/
Istio también puede realizar la instalación de scripts, pero no puedo hacerlo porque mi red está desconectada.

[root@k8s-master ~]# curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.18.0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   102  100   102    0     0    359      0 --:--:-- --:--:-- --:--:--   359
  0     0    0     0    0     0      0      0 --:--:--  0:01:36 --:--:--     0
curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104
[root@k8s-master ~]# cat  >> /etc/hosts << EOF
> 75.2.60.5 istio.io
> EOF
> [root@k8s-master ~]# curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.18.0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   102  100   102    0     0    337      0 --:--:-- --:--:-- --:--:--   337
  0     0    0     0    0     0      0      0 --:--:--  0:01:32 --:--:--     0
curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104

Solo los paquetes binarios se pueden descargar y cargar en máquinas virtuales para su implementación.
Descarga del paquete binario: https://github.com/istio/istio/releases/tag/1.18.0
Descargue la versión correspondiente
inserte la descripción de la imagen aquí
Use tar -zxvfel comando para descomprimir, ingrese a la carpeta y agregue el comando istio a la variable de entorno.
Utilice la combinación de configuración de demostración. Contiene un conjunto de funciones que están especialmente preparadas para la prueba, así como una combinación de configuraciones para la producción o la prueba de rendimiento.

cd istio-1.18.0
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y

EnvoyY agregue una etiqueta al espacio de nombres para indicarle a Istio que inyecte automáticamente el proxy sidecar ( ) al implementar la aplicación Sidecar:

kubectl label namespace default istio-injection=enabled

Implementar el ejemplo oficial Bookinfo

Luego instale el ejemplo de demostración oficial:

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
[root@k8s-master ~]# ll | grep istio
-rw-r--r--. 1 root root 25307383 7月   5 23:16 istio-1.18.0-linux-arm64.tar.gz
[root@k8s-master ~]# tar -zxvf istio-1.18.0-linux-arm64.tar.gz 
[root@k8s-master ~]# ll | grep istio
drwxr-x---. 6 root root      115 6月   7 16:01 istio-1.18.0
-rw-r--r--. 1 root root 25307383 7月   5 23:16 istio-1.18.0-linux-arm64.tar.gz
[root@k8s-master ~]# cd istio-1.18.0
[root@k8s-master istio-1.18.0]# ls
bin  LICENSE  manifests  manifest.yaml  README.md  samples  tools
[root@k8s-master istio-1.18.0]# export PATH=$PWD/bin:$PATH
[root@k8s-master istio-1.18.0]# istioctl install --set profile=demo -y
✔ Istio core installed                                                                                                                                                                      
✔ Istiod installed                                                                                                                                                                          
✔ Egress gateways installed                                                                                                                                                                 
✔ Ingress gateways installed                                                                                                                                                                
✔ Installation complete                                                                                                                                                                     Making this installation the default for injection and validation.
[root@k8s-master istio-1.18.0]# kubectl label namespace default istio-injection=enabled
namespace/default labeled
[root@k8s-master istio-1.18.0]# 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
[root@k8s-master istio-1.18.0]# 

La aplicación se lanzará en breve. Cuando cada pod está listo, se implementa un sidecar de Istio junto con la aplicación.

[root@k8s-master istio-1.18.0]# kubectl get services
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.111.93.162    <none>        9080/TCP   12m
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    18h
productpage   ClusterIP   10.97.94.189     <none>        9080/TCP   12m
ratings       ClusterIP   10.106.155.115   <none>        9080/TCP   12m
reviews       ClusterIP   10.106.49.5      <none>        9080/TCP   12m
[root@k8s-master istio-1.18.0]# kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-7c7dbcb4b5-jx866       2/2     Running   0          12m
productpage-v1-664d44d68d-v722l   2/2     Running   0          12m
ratings-v1-844796bf85-kktgq       2/2     Running   0          12m
reviews-v1-5cf854487-gn6xv        2/2     Running   0          12m
reviews-v2-955b74755-rp9b5        2/2     Running   0          12m
reviews-v3-797fc48bc9-wspwt       2/2     Running   0          12m
[root@k8s-master istio-1.18.0]# 

Después de confirmar que las operaciones anteriores son correctas, ejecute el siguiente comando para verificar que la aplicación se esté ejecutando en el clúster y haya brindado servicios web al verificar el título de la página devuelta:

[root@k8s-master istio-1.18.0]# kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
[root@k8s-master istio-1.18.0]# 

En este punto, la aplicación BookInfo se ha implementado, pero el mundo exterior no puede acceder a ella. Para abrir el acceso, se debe crear un Istio Ingress Gateway, que asigna una ruta a una ruta en el borde de la malla.

[root@k8s-master istio-1.18.0]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

# 确保配置文件没有问题:
[root@k8s-master istio-1.18.0]# istioctl analyze

✔ No validation issues found when analyzing namespace: default.
[root@k8s-master istio-1.18.0]# 

Ejecute el siguiente comando para determinar si su entorno de clúster de Kubernetes admite el equilibrio de carga externo:

[root@k8s-master ~]# kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.103.45.216   <pending>     15021:31564/TCP,80:30704/TCP,443:30854/TCP,31400:30301/TCP,15443:30563/TCP   20h
[root@k8s-master ~]# 

Después de establecer EXTERNAL-IPel valor de , el entorno tiene un equilibrador de carga externo que se puede utilizar como puerta de enlace de entrada. Sin embargo, si el valor de EXTERNAL-IP es (o permanece en el pendingestado < >), su entorno no proporciona un equilibrador de carga externo que pueda actuar como puerta de enlace para el tráfico entrante. En este caso, también puede utilizar el servicio (Servicio) NodePortpara acceder a la puerta de enlace.
Si no tiene un balanceador de carga externo en su entorno, elija uno NodePorten su lugar.
Establezca la dirección IP y el puerto de entrada:

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')

export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')

Establezca la variable de entorno GATEWAY_URL:

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo "$GATEWAY_URL"
echo "http://$GATEWAY_URL/productpage"

Copie y pegue la dirección de salida del comando anterior en el navegador y visite para confirmar si se puede abrir la página del producto de la aplicación Bookinfo.

[root@k8s-master ~]# export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
[root@k8s-master ~]# export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
[root@k8s-master ~]# export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
[root@k8s-master ~]# echo "$GATEWAY_URL"
192.168.153.102:30704
[root@k8s-master ~]# echo "http://$GATEWAY_URL/productpage"
http://192.168.153.102:30704/productpage

Acceso externo (host) exitoso:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

4. Implementar Kali

Istio se integra con varias aplicaciones de telemetría. La telemetría puede ayudarnos a comprender la estructura de la red de servicios, mostrar la topología de la red y analizar el estado de la red.
Utilice las instrucciones a continuación para implementar el panel de Kiali, junto con Prometheus, Grafana y Jaeger.

kubectl apply -f samples/addons
# 查询kiali在滚动更新期间的状态
kubectl rollout status deployment/kiali -n istio-system

Para acceder a la página web de kiali de forma externa, debe crear un NodePortServicio.

kubectl -n istio-system expose service kiali --type=NodePort --name=kiali-external
kubectl get svc -n istio-system
kubectl -n istio-system get service kiali-external -o=jsonpath='{.spec.ports[0].nodePort}'
[root@k8s-master ~]# cd istio-1.18.0
[root@k8s-master istio-1.18.0]# kubectl apply -f samples/addons
serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
configmap/istio-grafana-dashboards created
configmap/istio-services-grafana-dashboards created
deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
serviceaccount/kiali created
configmap/kiali created
clusterrole.rbac.authorization.k8s.io/kiali-viewer created
clusterrole.rbac.authorization.k8s.io/kiali created
clusterrolebinding.rbac.authorization.k8s.io/kiali created
role.rbac.authorization.k8s.io/kiali-controlplane created
rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
service/kiali created
deployment.apps/kiali created
serviceaccount/loki created
configmap/loki created
configmap/loki-runtime created
service/loki-memberlist created
service/loki-headless created
service/loki created
statefulset.apps/loki created
serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created
[root@k8s-master istio-1.18.0]# kubectl rollout status deployment/kiali -n istio-system
deployment "kiali" successfully rolled out
[root@k8s-master istio-kiali]# kubectl -n istio-system expose service kiali --type=NodePort --name=kiali-external
service/kiali-external exposed
[root@k8s-master istio-kiali]# kubectl get svc -n istio-system
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE
istio-egressgateway    ClusterIP      10.111.39.235   <none>        80/TCP,443/TCP                                                               21h
istio-ingressgateway   LoadBalancer   10.103.45.216   <pending>     15021:31564/TCP,80:30704/TCP,443:30854/TCP,31400:30301/TCP,15443:30563/TCP   21h
istiod                 ClusterIP      10.109.218.54   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        21h
kiali                  ClusterIP      10.105.43.99    <none>        20001/TCP,9090/TCP                                                           21h
kiali-external         NodePort       10.110.49.251   <none>        20001:31430/TCP,9090:30588/TCP                                               9s
[root@k8s-master istio-kiali]# kubectl -n istio-system get service kiali-external -o=jsonpath='{.spec.ports[0].nodePort}'
31430[root@k8s-master istio-kiali]#

Acceso a través de la dirección IP del clúster + NodePort:http://192.168.153.102:31430/

Para ver los datos de rastreo, se debe enviar una solicitud al servicio. El número de solicitudes depende de la frecuencia de muestreo de Istio. La frecuencia de muestreo se establece cuando se instala Istio y la frecuencia de muestreo predeterminada es del 1 %. Debe enviar al menos 100 solicitudes antes de que se vea el primer rastro. Envía 100 solicitudes al servicio de página de productos con el siguiente comando:

for i in `seq 1 100`; do curl -s -o /dev/null http://$GATEWAY_URL/productpage; done

El tablero de Kiali presenta una descripción general de la cuadrícula y las relaciones entre los diversos servicios de la aplicación de ejemplo Bookinfo. También proporciona filtros para visualizar el flujo de tráfico.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

registro de errores

Error al implementar la demostración de Bookinfo

Cuando usé kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yamlel comando para implementar la demostración, descubrí que el pod no podía iniciarse todo el tiempo.

[root@k8s-master istio-1.18.0]# kubectl get pods -o wide
NAME                              READY   STATUS                  RESTARTS      AGE     IP              NODE         NOMINATED NODE   READINESS GATES
details-v1-7c7dbcb4b5-lw8hr       0/2     Init:CrashLoopBackOff   5 (82s ago)   4m13s   172.16.85.212   k8s-node01   <none>           <none>
productpage-v1-664d44d68d-lgc4k   0/2     Init:CrashLoopBackOff   5 (69s ago)   4m12s   172.16.58.203   k8s-node02   <none>           <none>
ratings-v1-844796bf85-7s4zp       0/2     Init:CrashLoopBackOff   5 (87s ago)   4m13s   172.16.85.213   k8s-node01   <none>           <none>
reviews-v1-5cf854487-ztl9l        0/2     Init:CrashLoopBackOff   5 (73s ago)   4m13s   172.16.58.202   k8s-node02   <none>           <none>
reviews-v2-955b74755-tm6cj        0/2     Init:CrashLoopBackOff   5 (74s ago)   4m13s   172.16.85.214   k8s-node01   <none>           <none>
reviews-v3-797fc48bc9-s29zm       0/2     Init:CrashLoopBackOff   5 (78s ago)   4m13s   172.16.85.215   k8s-node01   <none>           <none>

Al principio pensé que era porque no se podía descargar la imagen, así que descargué la imagen por separado

crictl pull docker.io/istio/examples-bookinfo-details-v1:1.17.0
crictl pull docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
crictl pull docker.io/istio/examples-bookinfo-ratings-v1:1.17.0
crictl pull docker.io/istio/examples-bookinfo-reviews-v1:1.17.0
crictl pull docker.io/istio/examples-bookinfo-reviews-v2:1.17.0
crictl pull docker.io/istio/examples-bookinfo-reviews-v3:1.17.0
crictl pull docker.io/istio/proxyv2:1.18.0
[root@k8s-node02 istio-1.18.0]# crictl images
IMAGE                                                            TAG                 IMAGE ID            SIZE
docker.io/calico/cni                                             v3.25.0             0bb8d6f033a05       81.1MB
docker.io/calico/kube-controllers                                v3.25.0             2a83e28de3677       27.1MB
docker.io/calico/node                                            v3.25.0             8a2dff14388de       82.2MB
docker.io/istio/examples-bookinfo-details-v1                     1.17.0              8c7b34204cae9       59.8MB
docker.io/istio/examples-bookinfo-productpage-v1                 1.17.0              348980125f0b0       64.7MB
docker.io/istio/examples-bookinfo-ratings-v1                     1.17.0              18290de2e4a28       54.2MB
docker.io/istio/examples-bookinfo-reviews-v1                     1.17.0              9dc1566776c17       412MB
docker.io/istio/examples-bookinfo-reviews-v2                     1.17.0              5233615dc9972       412MB
docker.io/istio/examples-bookinfo-reviews-v3                     1.17.0              fbb7b7ceabf34       412MB
docker.io/istio/proxyv2                                          1.18.0              c901fe029266e       90.4MB
docker.io/kubernetesui/dashboard                                 v2.3.1              5bb89698273d8       65.4MB
registry.aliyuncs.com/google_containers/pause                    3.8                 4e42fb3c9d90e       268kB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns      v1.10.1             97e04611ad434       14.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy   v1.27.3             fb73e92641fd5       21.4MB
[root@k8s-node02 istio-1.18.0]# 

La imagen se descargó en los tres nodos, pero el contenedor aún no pudo iniciarse.
Más tarde, revisé el registro del Pod y encontré este problema:error output: xtables parameter problem: iptables-restore: unable to initialize table 'nat'

Finalmente encontré la solución:

cat <<EOT >> /etc/modules-load.d/k8s.conf
overlay
br_netfilter
nf_nat
xt_REDIRECT
xt_owner
iptable_nat
iptable_mangle
iptable_filter
EOT
modprobe br_netfilter ; modprobe nf_nat ; modprobe xt_REDIRECT ; modprobe xt_owner; modprobe iptable_nat; modprobe iptable_mangle; modprobe iptable_filter

https://stackoverflow.com/questions/73473680/service-deployed-with-istio-doesnt-start-minikube-docker-mac-m1

https://github.com/istio/istio/issues/36762

El contenedor se ejecuta correctamente:

[root@k8s-master istio-1.18.0]# kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
details-v1-7c7dbcb4b5-jx866       2/2     Running   0          12m   172.16.85.220   k8s-node01   <none>           <none>
productpage-v1-664d44d68d-v722l   2/2     Running   0          12m   172.16.58.207   k8s-node02   <none>           <none>
ratings-v1-844796bf85-kktgq       2/2     Running   0          12m   172.16.85.221   k8s-node01   <none>           <none>
reviews-v1-5cf854487-gn6xv        2/2     Running   0          12m   172.16.58.206   k8s-node02   <none>           <none>
reviews-v2-955b74755-rp9b5        2/2     Running   0          12m   172.16.85.222   k8s-node01   <none>           <none>
reviews-v3-797fc48bc9-wspwt       2/2     Running   0          12m   172.16.85.223   k8s-node01   <none>           <none>
[root@k8s-master istio-1.18.0]# 

Supongo que te gusta

Origin blog.csdn.net/DreamsArchitects/article/details/131586727
Recomendado
Clasificación