commit
19ec7bf0d1
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
|
@ -0,0 +1,467 @@
|
||||||
|
# Use Istio on Karmada
|
||||||
|
|
||||||
|
This document uses an example to demonstrate how to use [Istio](https://istio.io/) on Karmada.
|
||||||
|
|
||||||
|
Follow this guide to install the Istio control plane on `karmada-host` (the primary cluster) and configure `member1` and `member2` (the remote cluster) to use the control plane in `karmada-host`. All clusters reside on the network1 network, meaning there is direct connectivity between the pods in both clusters.
|
||||||
|
|
||||||
|
<image src="images/istio-on-karmada.png" caption="Istio on Karmada" />
|
||||||
|
|
||||||
|
## Install Karmada
|
||||||
|
|
||||||
|
### Install karmada control plane
|
||||||
|
|
||||||
|
Following the steps [Install karmada control plane](https://github.com/karmada-io/karmada#install-karmada-control-plane) in Quick Start, you can get a Karmada.
|
||||||
|
|
||||||
|
## Deploy Istio
|
||||||
|
|
||||||
|
***
|
||||||
|
If you are testing multicluster setup on `kind` you can use [MetalLB](https://metallb.universe.tf/installation/) to make use of `EXTERNAL-IP` for `LoadBalancer` services.
|
||||||
|
***
|
||||||
|
|
||||||
|
### Install istioctl
|
||||||
|
Please refer to the [istioctl](https://istio.io/latest/docs/setup/getting-started/#download) Installation.
|
||||||
|
|
||||||
|
### Prepare CA certificates
|
||||||
|
|
||||||
|
Following the steps [plug-in-certificates-and-key-into-the-cluster](https://istio.io/latest/docs/tasks/security/cert-management/plugin-ca-cert/#plug-in-certificates-and-key-into-the-cluster) to configure Istio CA.
|
||||||
|
|
||||||
|
Replace the cluster name `cluster1` with `primary`, the output will looks like as follwing:
|
||||||
|
```bash
|
||||||
|
root@karmada-demo istio-on-karmada# tree certs
|
||||||
|
certs
|
||||||
|
├── primary
|
||||||
|
│ ├── ca-cert.pem
|
||||||
|
│ ├── ca-key.pem
|
||||||
|
│ ├── cert-chain.pem
|
||||||
|
│ └── root-cert.pem
|
||||||
|
├── root-ca.conf
|
||||||
|
├── root-cert.csr
|
||||||
|
├── root-cert.pem
|
||||||
|
├── root-cert.srl
|
||||||
|
└── root-key.pem
|
||||||
|
```
|
||||||
|
### Install Istio on karmada-apiserver
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada apiserver`:
|
||||||
|
|
||||||
|
```
|
||||||
|
# export KUBECONFIG=$HOME/.kube/karmada.config
|
||||||
|
|
||||||
|
# kubectl config use-context karmada-apiserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a secret `cacerts` in `istio-system` namespace:
|
||||||
|
```bash
|
||||||
|
kubectl create namespace istio-system
|
||||||
|
kubectl create secret generic cacerts -n istio-system \
|
||||||
|
--from-file=certs/primary/ca-cert.pem \
|
||||||
|
--from-file=certs/primary/ca-key.pem \
|
||||||
|
--from-file=certs/primary/root-cert.pem \
|
||||||
|
--from-file=certs/primary/cert-chain.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a propagation policy for `cacert` secret:
|
||||||
|
```bash
|
||||||
|
cat <<EOF | kubectl apply -f -
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: cacerts-propagation
|
||||||
|
namespace: istio-system
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
name: cacerts
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member1
|
||||||
|
- member2
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to install istio CRDs on karmada apiserver:
|
||||||
|
```bash
|
||||||
|
cat <<EOF | istioctl install -y --set profile=minimal -f -
|
||||||
|
apiVersion: install.istio.io/v1alpha1
|
||||||
|
kind: IstioOperator
|
||||||
|
spec:
|
||||||
|
meshConfig:
|
||||||
|
accessLogFile: /dev/stdout
|
||||||
|
values:
|
||||||
|
global:
|
||||||
|
meshID: mesh1
|
||||||
|
multiCluster:
|
||||||
|
clusterName: primary
|
||||||
|
network: network1
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
Karmada apiserver will not deploy a real istiod pod, you should press `ctrl+c` to exit installation when `Processing resources for Istiod`.
|
||||||
|
```bash
|
||||||
|
✔ Istio core installed
|
||||||
|
- Processing resources for Istiod.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Install Istio on karmada host
|
||||||
|
|
||||||
|
1. Create secret on karmada-host
|
||||||
|
|
||||||
|
Karmada host is not a member cluster, we need create the `cacerts` secret for `istiod`.
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada host`:
|
||||||
|
|
||||||
|
```
|
||||||
|
# export KUBECONFIG=$HOME/.kube/karmada.config
|
||||||
|
|
||||||
|
# kubectl config use-context karmada-host
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a secret `cacerts` in `istio-system` namespace:
|
||||||
|
```bash
|
||||||
|
kubectl create namespace istio-system
|
||||||
|
kubectl create secret generic cacerts -n istio-system \
|
||||||
|
--from-file=certs/primary/ca-cert.pem \
|
||||||
|
--from-file=certs/primary/ca-key.pem \
|
||||||
|
--from-file=certs/primary/root-cert.pem \
|
||||||
|
--from-file=certs/primary/cert-chain.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Create istio-kubeconfig on karmada-host
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get secret -nkarmada-system kubeconfig --template={{.data.kubeconfig}} | base64 -d > kind-karmada.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create secret generic istio-kubeconfig --from-file=config=kind-karmada.yaml -nistio-system
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Install istio control plane
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat <<EOF | istioctl install -y --set profile=minimal -f -
|
||||||
|
apiVersion: install.istio.io/v1alpha1
|
||||||
|
kind: IstioOperator
|
||||||
|
spec:
|
||||||
|
meshConfig:
|
||||||
|
accessLogFile: /dev/stdout
|
||||||
|
values:
|
||||||
|
global:
|
||||||
|
meshID: mesh1
|
||||||
|
multiCluster:
|
||||||
|
clusterName: primary
|
||||||
|
network: network1
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Expose istiod service
|
||||||
|
|
||||||
|
Run the following command to create a service for the `istiod` service:
|
||||||
|
```bash
|
||||||
|
cat <<EOF | kubectl apply -f -
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: istiod-elb
|
||||||
|
namespace: istio-system
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: https-dns
|
||||||
|
port: 15012
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 15012
|
||||||
|
selector:
|
||||||
|
app: istiod
|
||||||
|
istio: pilot
|
||||||
|
sessionAffinity: None
|
||||||
|
type: LoadBalancer
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
Export DISCOVERY_ADDRESS:
|
||||||
|
```bash
|
||||||
|
export DISCOVERY_ADDRESS=$(kubectl get svc istiod-elb -nistio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
|
||||||
|
# verify
|
||||||
|
echo $DISCOVERY_ADDRESS
|
||||||
|
```
|
||||||
|
|
||||||
|
### Prepare member1 cluster secret
|
||||||
|
|
||||||
|
1. Export `KUBECONFIG` and switch to `karmada member1`:
|
||||||
|
```bash
|
||||||
|
export KUBECONFIG="$HOME/.kube/members.config"
|
||||||
|
kubectl config use-context member1
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Create istio remote secret for member1:
|
||||||
|
```bash
|
||||||
|
istioctl x create-remote-secret --name=member1 > istio-remote-secret-member1.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Prepare member2 cluster secret
|
||||||
|
|
||||||
|
1. Export `KUBECONFIG` and switch to `karmada member2`:
|
||||||
|
```bash
|
||||||
|
export KUBECONFIG="$HOME/.kube/members.config"
|
||||||
|
kubectl config use-context member2
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Create istio remote secret for member1:
|
||||||
|
```bash
|
||||||
|
istioctl x create-remote-secret --name=member2 > istio-remote-secret-member2.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Apply istio remote secret
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada apiserver`:
|
||||||
|
|
||||||
|
```
|
||||||
|
# export KUBECONFIG=$HOME/.kube/karmada.config
|
||||||
|
|
||||||
|
# kubectl config use-context karmada-apiserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Apply istio remote secret:
|
||||||
|
```bash
|
||||||
|
kubectl apply -f istio-remote-secret-member1.yaml
|
||||||
|
|
||||||
|
kubectl apply -f istio-remote-secret-member2.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Install istio remote
|
||||||
|
|
||||||
|
1. Install istio remote member1
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada member1`:
|
||||||
|
```bash
|
||||||
|
export KUBECONFIG="$HOME/.kube/members.config"
|
||||||
|
kubectl config use-context member1
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat <<EOF | istioctl install -y -f -
|
||||||
|
apiVersion: install.istio.io/v1alpha1
|
||||||
|
kind: IstioOperator
|
||||||
|
spec:
|
||||||
|
values:
|
||||||
|
global:
|
||||||
|
meshID: mesh1
|
||||||
|
multiCluster:
|
||||||
|
clusterName: member1
|
||||||
|
network: network1
|
||||||
|
remotePilotAddress: ${DISCOVERY_ADDRESS}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Install istio remote member2
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada member2`:
|
||||||
|
```bash
|
||||||
|
export KUBECONFIG="$HOME/.kube/members.config"
|
||||||
|
kubectl config use-context member2
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat <<EOF | istioctl install -y -f -
|
||||||
|
apiVersion: install.istio.io/v1alpha1
|
||||||
|
kind: IstioOperator
|
||||||
|
spec:
|
||||||
|
values:
|
||||||
|
global:
|
||||||
|
meshID: mesh1
|
||||||
|
multiCluster:
|
||||||
|
clusterName: member2
|
||||||
|
network: network1
|
||||||
|
remotePilotAddress: ${DISCOVERY_ADDRESS}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deploy bookinfo application
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada apiserver`:
|
||||||
|
|
||||||
|
```
|
||||||
|
# export KUBECONFIG=$HOME/.kube/karmada.config
|
||||||
|
|
||||||
|
# kubectl config use-context karmada-apiserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Create an `istio-demo` namespace:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create namespace istio-demo
|
||||||
|
```
|
||||||
|
|
||||||
|
Label the namespace that will host the application with `istio-injection=enabled`:
|
||||||
|
```bash
|
||||||
|
kubectl label namespace istio-demo istio-injection=enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
Deploy your application using the `kubectl` command:
|
||||||
|
```bash
|
||||||
|
kubectl apply -nistio-demo -f https://raw.githubusercontent.com/istio/istio/release-1.12/samples/bookinfo/platform/kube/bookinfo.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to create default destination rules for the Bookinfo services:
|
||||||
|
```bash
|
||||||
|
kubectl apply -nistio-demo -f https://raw.githubusercontent.com/istio/istio/release-1.12/samples/bookinfo/networking/destination-rule-all.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to create virtual service for the Bookinfo services:
|
||||||
|
```bash
|
||||||
|
kubectl apply -nistio-demo -f https://raw.githubusercontent.com/istio/istio/release-1.12/samples/bookinfo/networking/virtual-service-all-v1.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to create propagation policy for the Bookinfo services:
|
||||||
|
```bash
|
||||||
|
cat <<EOF | kubectl apply -nistio-demo -f -
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: service-propagation
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
name: productpage
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
name: details
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
name: reviews
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
name: ratings
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member1
|
||||||
|
- member2
|
||||||
|
---
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: produtpage-propagation
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: productpage-v1
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
name: bookinfo-productpage
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member1
|
||||||
|
---
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: details-propagation
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: details-v1
|
||||||
|
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
name: bookinfo-details
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member2
|
||||||
|
---
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: reviews-propagation
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: reviews-v1
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: reviews-v2
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: reviews-v3
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
name: bookinfo-reviews
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member1
|
||||||
|
- member2
|
||||||
|
---
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: ratings-propagation
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: ratings-v1
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
name: bookinfo-ratings
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member2
|
||||||
|
EOF
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Deploy `fortio` application using the `kubectl` command:
|
||||||
|
```bash
|
||||||
|
kubectl apply -nistio-demo -f https://raw.githubusercontent.com/istio/istio/release-1.12/samples/httpbin/sample-client/fortio-deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to create propagation policy for the `fortio` services:
|
||||||
|
```bash
|
||||||
|
cat <<EOF | kubectl apply -nistio-demo -f -
|
||||||
|
apiVersion: policy.karmada.io/v1alpha1
|
||||||
|
kind: PropagationPolicy
|
||||||
|
metadata:
|
||||||
|
name: fortio-propagation
|
||||||
|
spec:
|
||||||
|
resourceSelectors:
|
||||||
|
- apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
name: fortio
|
||||||
|
- apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: fortio-deploy
|
||||||
|
placement:
|
||||||
|
clusterAffinity:
|
||||||
|
clusterNames:
|
||||||
|
- member1
|
||||||
|
- member2
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Export `KUBECONFIG` and switch to `karmada member1`:
|
||||||
|
```bash
|
||||||
|
export KUBECONFIG="$HOME/.kube/members.config"
|
||||||
|
kubectl config use-context member1
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to verify `productpage` application installation:
|
||||||
|
```bash
|
||||||
|
export FORTIO_POD=`kubectl get po -nistio-demo | grep fortio | awk '{print $1}'`
|
||||||
|
kubectl exec -it ${FORTIO_POD} -nistio-demo -- fortio load -t 3s productpage:9080/productpage
|
||||||
|
```
|
||||||
|
|
||||||
|
## What's next
|
||||||
|
|
||||||
|
Folling the [guide](https://istio.io/latest/docs/examples/bookinfo/#confirm-the-app-is-accessible-from-outside-the-cluster) to confirm the app is accessible from outside the cluster.
|
Loading…
Reference in New Issue