Подготовка окружения для тестов Istio в minikube


Делаю:
14.02.2021


https://istio.io/docs/setup/getting-started/#download

$ {
    minikube --profile istio-lab config set memory 8192
    minikube --profile istio-lab config set cpus 4

    // minikube --profile istio-lab config set vm-driver virtualbox
    minikube --profile istio-lab config set vm-driver docker

    minikube --profile istio-lab config set kubernetes-version v1.20.2
    minikube start --profile istio-lab --embed-certs
}


// Удалить
// $ minikube --profile istio-lab stop && minikube --profile istio-lab delete


$ kubectl version --short
Client Version: v1.20.2
Server Version: v1.20.2


Устанавливаю istioctl на локальном хосте

$ cd ~/tmp/
$ curl -L https://istio.io/downloadIstio | sh - && chmod +x ./istio-1.9.0/bin/istioctl && sudo mv ./istio-1.9.0/bin/istioctl /usr/local/bin/


Запуск сервисов istio

UPD. Оказазось istio уже есть среди предустановленных расширений на minikube, и можно просто активироваь.

$ minikube addons --profile istio-lab enable istio

Но чего-то ранее не заработало из коробки на 16.9. Не хочу сейчас пробовать. Поэтому, будем ставить сами.


Дока:
https://istio.io/docs/setup/additional-setup/config-profiles/


$ istioctl profile list
Istio configuration profiles:
    default
    demo
    empty
    minimal
    openshift
    preview
    remote


// $ istioctl manifest install -y --set profile=demo
$ istioctl manifest install -y --set profile=default


$ kubectl label namespace default istio-injection=enabled


После этого, новые создаваемые pod будут “проксируемыми”. Т.е. старые нужно пересоздать.


$ kubectl get ns --show-labels
NAME              STATUS   AGE   LABELS
default           Active   26m   istio-injection=enabled
istio-system      Active   19m   istio-injection=disabled
kube-node-lease   Active   26m   <none>
kube-public       Active   26m   <none>
kube-system       Active   26m   <none>
metallb-system    Active   12m   app=metallb


Добавляю Metal LB

Metal LB позволит получить внешний IP в миникубе на локалхосте.


$ LATEST_VERSION=$(curl --silent "https://api.github.com/repos/metallb/metallb/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

$ echo ${LATEST_VERSION}


$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/${LATEST_VERSION}/manifests/namespace.yaml

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/${LATEST_VERSION}/manifests/metallb.yaml

# On first install only
$ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"


$ minikube --profile istio-lab ip
192.168.49.2


Задаем диапазон ip адресов, которые можно выдать виртуальному сервису. Нужно, чтобы он был в той же подсети, что и ip minikube.


$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: custom-ip-space
      protocol: layer2
      addresses:
      - 192.168.49.20-192.168.49.30
EOF


$ export INGRESS_HOST=$(kubectl \
 --namespace istio-system \
 get service istio-ingressgateway \
 --output jsonpath="{.status.loadBalancer.ingress[0].ip}")

$ echo ${INGRESS_HOST}


Всевозможные проверки

$ watch kubectl -n istio-system get all


// 12
$ kubectl get crds | grep istio | wc -l
12


$ kubectl get pods -n istio-system
NAME                                    READY   STATUS    RESTARTS   AGE
istio-ingressgateway-758985db4f-d2jdh   1/1     Running   0          2m
istiod-7c9c9d46d4-rh7fz                 1/1     Running   0          2m18s


$ kubectl get svc -n istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.106.144.8   192.168.49.20   15021:32220/TCP,80:32270/TCP,443:31357/TCP,15012:30385/TCP,15443:30134/TCP   3m27s
istiod                 ClusterIP      10.99.91.237   <none>          15010/TCP,15012/TCP,443/TCP,15014/TCP                                        3m45s


Дополнительные сервисы (Prometheus, Grafana, Kiali, Jaeger):

$ cd ~/tmp
$ curl -L https://istio.io/downloadIstio | sh
$ cd ~/tmp/istio-1.9.0/samples/addons/
$ kubectl apply -n istio-system -f ./


Чтобы запустился Kiali нужно повторить

$ kubectl apply -n istio-system -f ./kiali.yaml


$ kubectl -n istio-system get pods
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-784c89f4cf-zv7rd                1/1     Running   0          2m40s
istio-ingressgateway-758985db4f-d2jdh   1/1     Running   0          11m
istiod-7c9c9d46d4-rh7fz                 1/1     Running   0          11m
jaeger-7f78b6fb65-rwjcx                 1/1     Running   0          87s
kiali-dc84967d9-xndpn                   1/1     Running   0          87s
prometheus-7bfddb8dbf-bnwcf             2/2     Running   0          87s


$ kubectl -n istio-system port-forward svc/grafana 3000
$ kubectl -n istio-system port-forward svc/prometheus 9090
$ kubectl -n istio-system port-forward svc/kiali 20001


Пока непонятно как работать с jaeger

$ kubectl -n istio-system port-forward svc/jaeger-collector 14268


Zipkin и Prometheus Operator

$ cd ~/tmp/istio-1.9.0/samples/addons/extras
$ kubectl apply -n istio-system -f ./


$ kubectl apply -n istio-system -f ./prometheus-operator.yaml
unable to recognize "./prometheus-operator.yaml": no matches for kind "PodMonitor" in version "monitoring.coreos.com/v1"
unable to recognize "./prometheus-operator.yaml": no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"


В общем, нужно еще и добавлять из стандартной установки компоненты, чтобы он понимал, что за ServiceMonitor и PodMonitor.

Пока неактуально.