Fixes for multicluster tests (#8309)

This commit is contained in:
Nathan Mittler 2020-10-21 06:46:49 -07:00 committed by GitHub
parent 0cb8a2ee92
commit b28bb174de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 347 additions and 181 deletions

View File

@ -36,11 +36,44 @@ function set_multi_network_vars
export CTX_CLUSTER2="${KUBE_CONTEXTS[2]}" export CTX_CLUSTER2="${KUBE_CONTEXTS[2]}"
} }
# cleanup removes all resources created by the tests. # configure_trust creates a hierarchy of
function cleanup() function configure_trust
{ {
# Remove generated yaml files. # Keeps the certs under a separate directory.
rm -f "cluster1.yaml" "cluster2.yaml" mkdir -p certs
pushd certs || exit
# Create the root cert.
make -f ../tools/certs/Makefile.selfsigned.mk root-ca
# Create and deploy intermediate certs for cluster1 and cluster2.
make -f ../tools/certs/Makefile.selfsigned.mk cluster1-cacerts
make -f ../tools/certs/Makefile.selfsigned.mk cluster2-cacerts
# Create the istio-system namespace in each cluster so that we can create the secrets.
kubectl --context="$CTX_CLUSTER1" create namespace istio-system
kubectl --context="$CTX_CLUSTER2" create namespace istio-system
# Deploy secret to each cluster
kubectl --context="$CTX_CLUSTER1" create secret generic cacerts -n istio-system \
--from-file=cluster1/ca-cert.pem \
--from-file=cluster1/ca-key.pem \
--from-file=cluster1/root-cert.pem \
--from-file=cluster1/cert-chain.pem
kubectl --context="$CTX_CLUSTER2" create secret generic cacerts -n istio-system \
--from-file=cluster2/ca-cert.pem \
--from-file=cluster2/ca-key.pem \
--from-file=cluster2/root-cert.pem \
--from-file=cluster2/cert-chain.pem
popd || exit # Return to the previous directory.
}
# cleanup removes all resources created by the tests.
function cleanup
{
# Remove temp files.
rm -f cluster1.yaml cluster2.yaml certs
# Delete the namespaces on both clusters concurrently # Delete the namespaces on both clusters concurrently
delete_namespaces_cluster1 & delete_namespaces_cluster1 &
@ -50,47 +83,62 @@ function cleanup()
# _delete_namespaces_cluster1 removes the istio-system and sample namespaces on both # _delete_namespaces_cluster1 removes the istio-system and sample namespaces on both
# CLUSTER1. # CLUSTER1.
function delete_namespaces_cluster1() function delete_namespaces_cluster1
{ {
kubectl delete ns istio-system sample --context="${CTX_CLUSTER1}" --ignore-not-found kubectl delete ns istio-system sample --context="${CTX_CLUSTER1}" --ignore-not-found
} }
# _delete_namespaces_cluster2 removes the istio-system and sample namespaces on both # _delete_namespaces_cluster2 removes the istio-system and sample namespaces on both
# CLUSTER2. # CLUSTER2.
function delete_namespaces_cluster2() function delete_namespaces_cluster2
{ {
kubectl delete ns istio-system sample --context="${CTX_CLUSTER2}" --ignore-not-found kubectl delete ns istio-system sample --context="${CTX_CLUSTER2}" --ignore-not-found
} }
# verify_load_balancing verifies that traffic is load balanced properly # verify_load_balancing verifies that traffic is load balanced properly
# between CLUSTER1 and CLUSTER2. # between CLUSTER1 and CLUSTER2.
function verify_load_balancing() function verify_load_balancing
{ {
# Deploy HelloWorld and Sleep. # Deploy the HelloWorld service.
snip_deploy_the_helloworld_service_1 snip_deploy_the_helloworld_service_1
snip_deploy_the_helloworld_service_2 snip_deploy_the_helloworld_service_2
snip_deploy_the_helloworld_service_3 snip_deploy_the_helloworld_service_3
# Deploy HelloWorld v1 and v2
snip_deploy_helloworld_v1_1 snip_deploy_helloworld_v1_1
snip_deploy_helloworld_v2_1 snip_deploy_helloworld_v2_1
# Deploy Sleep
snip_deploy_sleep_1 snip_deploy_sleep_1
snip_deploy_sleep_3
# Wait for the deployments in CLUSTER1 # Wait for all the deployments.
(KUBECONFIG="${KUBECONFIG_CLUSTER1}"; _wait_for_deployment sample helloworld-v1) _wait_for_deployment sample helloworld-v1 "${CTX_CLUSTER1}"
(KUBECONFIG="${KUBECONFIG_CLUSTER1}"; _wait_for_deployment sample sleep) _wait_for_deployment sample sleep "${CTX_CLUSTER1}"
_wait_for_deployment sample helloworld-v2 "${CTX_CLUSTER2}"
_wait_for_deployment sample sleep "${CTX_CLUSTER2}"
# Wait for the deployments in CLUSTER2 # Verify everything is deployed as expected.
(KUBECONFIG="${KUBECONFIG_CLUSTER2}"; _wait_for_deployment sample helloworld-v2) VERIFY_RETRIES=0 # Don't retry.
(KUBECONFIG="${KUBECONFIG_CLUSTER2}"; _wait_for_deployment sample sleep) echo "Verifying helloworld v1 deployment"
_verify_like snip_deploy_helloworld_v1_2 "$snip_deploy_helloworld_v1_2_out"
echo "Verifying helloworld v2 deployment"
_verify_like snip_deploy_helloworld_v2_2 "$snip_deploy_helloworld_v2_2_out"
echo "Verifying sleep deployment in ${CTX_CLUSTER1}"
_verify_like snip_deploy_sleep_2 "$snip_deploy_sleep_2_out"
echo "Verifying sleep deployment in ${CTX_CLUSTER2}"
_verify_like snip_deploy_sleep_3 "$snip_deploy_sleep_3_out"
unset VERIFY_RETRIES # Restore default
local EXPECTED_RESPONSE_FROM_CLUSTER1="Hello version: v1, instance:" local EXPECTED_RESPONSE_FROM_CLUSTER1="Hello version: v1, instance:"
local EXPECTED_RESPONSE_FROM_CLUSTER2="Hello version: v2, instance:" local EXPECTED_RESPONSE_FROM_CLUSTER2="Hello version: v2, instance:"
# Verify we hit both clusters from CLUSTER1 # Verify we hit both clusters from CLUSTER1
echo "Verifying load balancing from ${CTX_CLUSTER1}"
_verify_contains snip_verifying_crosscluster_traffic_1 "$EXPECTED_RESPONSE_FROM_CLUSTER1" _verify_contains snip_verifying_crosscluster_traffic_1 "$EXPECTED_RESPONSE_FROM_CLUSTER1"
_verify_contains snip_verifying_crosscluster_traffic_1 "$EXPECTED_RESPONSE_FROM_CLUSTER2" _verify_contains snip_verifying_crosscluster_traffic_1 "$EXPECTED_RESPONSE_FROM_CLUSTER2"
# Verify we hit both clusters from CLUSTER2 # Verify we hit both clusters from CLUSTER2
echo "Verifying load balancing from ${CTX_CLUSTER2}"
_verify_contains snip_verifying_crosscluster_traffic_3 "$EXPECTED_RESPONSE_FROM_CLUSTER1" _verify_contains snip_verifying_crosscluster_traffic_3 "$EXPECTED_RESPONSE_FROM_CLUSTER1"
_verify_contains snip_verifying_crosscluster_traffic_3 "$EXPECTED_RESPONSE_FROM_CLUSTER2" _verify_contains snip_verifying_crosscluster_traffic_3 "$EXPECTED_RESPONSE_FROM_CLUSTER2"
} }

View File

@ -112,7 +112,7 @@ Service workloads communicate directly (pod-to-pod) across cluster boundaries.
Create the Istio configuration for `cluster1`: Create the Istio configuration for `cluster1`:
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster1.yaml $ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -136,7 +136,7 @@ $ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml
Create the Istio configuration for `cluster2`: Create the Istio configuration for `cluster2`:
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster2.yaml $ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -200,7 +200,7 @@ traffic. The gateway in each cluster must be reachable from the other cluster.
Create the Istio configuration for `cluster1`: Create the Istio configuration for `cluster1`:
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster1.yaml $ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -249,7 +249,7 @@ $ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
Create the Istio configuration for `cluster2`: Create the Istio configuration for `cluster2`:
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster2.yaml $ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -333,7 +333,7 @@ traffic.
Create the Istio configuration for `cluster1`: Create the Istio configuration for `cluster1`:
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster1.yaml $ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -374,6 +374,28 @@ $ kubectl apply --context="${CTX_CLUSTER1}" -f \
@samples/multicluster/expose-istiod.yaml@ @samples/multicluster/expose-istiod.yaml@
{{< /text >}} {{< /text >}}
<h3>Enable API Server Access to cluster2</h3>
Before we can configure the remote cluster, we first have to give the control
plane in `cluster1` access to the API Server in `cluster2`. This will do the
following:
- Enables the control plane to authenticate connection requests from
workloads running in `cluster2`. Without API Server access, the control
plane will reject the requests.
- Enables discovery of service endpoints running in `cluster2`.
To provide API Server access to `cluster2`, we generate a remote secret and
apply it to `cluster1`:
{{< text bash >}}
$ istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
{{< /text >}}
<h3>Configure cluster2 as a remote</h3> <h3>Configure cluster2 as a remote</h3>
Save the address of `cluster1`s ingress gateway. Save the address of `cluster1`s ingress gateway.
@ -388,7 +410,7 @@ $ export DISCOVERY_ADDRESS=$(kubectl \
Now create a remote configuration for `cluster2`. Now create a remote configuration for `cluster2`.
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster2.yaml $ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -408,18 +430,6 @@ Apply the configuration to `cluster2`:
$ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml $ istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
{{< /text >}} {{< /text >}}
<h3>Enable Endpoint Discovery for cluster2</h3>
Create a remote secret that will allow the control plane in `cluster1` to access the
API Server in `cluster2` for endpoints.
{{< text bash >}}
$ istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
{{< /text >}}
{{< /tab >}} {{< /tab >}}
{{< tab name="Primary-Remote, Multi-Network" category-value="primary-remote-multi-network" >}} {{< tab name="Primary-Remote, Multi-Network" category-value="primary-remote-multi-network" >}}
@ -452,7 +462,7 @@ same east-west gateway.
Create the Istio configuration for `cluster1`: Create the Istio configuration for `cluster1`:
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster1.yaml $ cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -503,6 +513,28 @@ $ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@ @samples/multicluster/expose-services.yaml@
{{< /text >}} {{< /text >}}
<h3>Enable API Server Access to cluster2</h3>
Before we can configure the remote cluster, we first have to give the control
plane in `cluster1` access to the API Server in `cluster2`. This will do the
following:
- Enables the control plane to authenticate connection requests from
workloads running in `cluster2`. Without API Server access, the control
plane will reject the requests.
- Enables discovery of service endpoints running in `cluster2`.
To provide API Server access to `cluster2`, we generate a remote secret and
apply it to `cluster1`:
{{< text bash >}}
$ istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
{{< /text >}}
<h3>Configure cluster2 as a remote with services exposed</h3> <h3>Configure cluster2 as a remote with services exposed</h3>
Save the address of `cluster1`s ingress gateway. Save the address of `cluster1`s ingress gateway.
@ -517,7 +549,7 @@ $ export DISCOVERY_ADDRESS=$(kubectl \
Now create a remote configuration on `cluster2`. Now create a remote configuration on `cluster2`.
{{< text bash >}} {{< text bash >}}
$ cat <<EOF > ./cluster2.yaml $ cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -552,18 +584,6 @@ $ kubectl --context="${CTX_CLUSTER2}" apply -n istio-system -f \
@samples/multicluster/expose-services.yaml@ @samples/multicluster/expose-services.yaml@
{{< /text >}} {{< /text >}}
<h3>Enable Endpoint Discovery for cluster2 on network2</h3>
Create a remote secret that will allow the control plane in `cluster1` to
access the API Server in `cluster2` for endpoints.
{{< text bash >}}
$ istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
{{< /text >}}
{{< /tab >}} {{< /tab >}}
{{< /tabset >}} {{< /tabset >}}
@ -608,10 +628,10 @@ Create the `HelloWorld` service in both clusters:
{{< text bash >}} {{< text bash >}}
$ kubectl apply --context="${CTX_CLUSTER1}" \ $ kubectl apply --context="${CTX_CLUSTER1}" \
-f @samples/helloworld/helloworld.yaml@ \ -f @samples/helloworld/helloworld.yaml@ \
-l app=helloworld -n sample -l service=helloworld -n sample
$ kubectl apply --context="${CTX_CLUSTER2}" \ $ kubectl apply --context="${CTX_CLUSTER2}" \
-f @samples/helloworld/helloworld.yaml@ \ -f @samples/helloworld/helloworld.yaml@ \
-l app=helloworld -n sample -l service=helloworld -n sample
{{< /text >}} {{< /text >}}
### Deploy `HelloWorld` `V1` ### Deploy `HelloWorld` `V1`
@ -621,13 +641,13 @@ Deploy the `helloworld-v1` application to `cluster1`:
{{< text bash >}} {{< text bash >}}
$ kubectl apply --context="${CTX_CLUSTER1}" \ $ kubectl apply --context="${CTX_CLUSTER1}" \
-f @samples/helloworld/helloworld.yaml@ \ -f @samples/helloworld/helloworld.yaml@ \
-l app=helloworld -l version=v1 -n sample -l version=v1 -n sample
{{< /text >}} {{< /text >}}
Confirm the `helloworld-v1` pod status: Confirm the `helloworld-v1` pod status:
{{< text bash >}} {{< text bash >}}
$ kubectl get pod --context="${CTX_CLUSTER1}" -n sample $ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=helloworld
NAME READY STATUS RESTARTS AGE NAME READY STATUS RESTARTS AGE
helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
{{< /text >}} {{< /text >}}
@ -641,13 +661,13 @@ Deploy the `helloworld-v2` application to `cluster2`:
{{< text bash >}} {{< text bash >}}
$ kubectl apply --context="${CTX_CLUSTER2}" \ $ kubectl apply --context="${CTX_CLUSTER2}" \
-f @samples/helloworld/helloworld.yaml@ \ -f @samples/helloworld/helloworld.yaml@ \
-l app=helloworld -l version=v2 -n sample -l version=v2 -n sample
{{< /text >}} {{< /text >}}
Confirm the status the `helloworld-v2` pod status: Confirm the status the `helloworld-v2` pod status:
{{< text bash >}} {{< text bash >}}
$ kubectl get pod --context="${CTX_CLUSTER2}" -n sample $ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=helloworld
NAME READY STATUS RESTARTS AGE NAME READY STATUS RESTARTS AGE
helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
{{< /text >}} {{< /text >}}
@ -669,6 +689,7 @@ Confirm the status `Sleep` pod on `cluster1`:
{{< text bash >}} {{< text bash >}}
$ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=sleep $ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE
sleep-754684654f-n6bzf 2/2 Running 0 5s sleep-754684654f-n6bzf 2/2 Running 0 5s
{{< /text >}} {{< /text >}}
@ -678,6 +699,7 @@ Confirm the status of the `Sleep` pod on `cluster2`:
{{< text bash >}} {{< text bash >}}
$ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=sleep $ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE
sleep-754684654f-dzl9j 2/2 Running 0 5s sleep-754684654f-dzl9j 2/2 Running 0 5s
{{< /text >}} {{< /text >}}

View File

@ -25,38 +25,59 @@ source content/en/docs/setup/install/multicluster/common.sh
set_multi_network_vars set_multi_network_vars
function install_istio_on_cluster1 { function install_istio_on_cluster1 {
snip_install_istio_7 echo "Installing Istio on Primary cluster: ${CTX_CLUSTER1}"
echo y | snip_install_istio_8
# Expose services through the east-west gateway. snip_install_istio_7
snip_install_istio_9 echo y | snip_install_istio_8
snip_install_istio_10
echo "Creating the east-west gateway"
snip_install_istio_9
echo "Waiting for the east-west gateway to have an external IP"
_wait_for_gateway_ip istio-system istio-eastwestgateway "${CTX_CLUSTER1}"
echo "Exposing services via the east-west gateway"
snip_install_istio_10
} }
function install_istio_on_cluster2 { function install_istio_on_cluster2 {
snip_install_istio_11 echo "Installing Istio on Primary cluster: ${CTX_CLUSTER2}"
echo y | snip_install_istio_12
# Expose services through the east-west gateway. snip_install_istio_11
snip_install_istio_13 echo y | snip_install_istio_12
snip_install_istio_14
echo "Creating the east-west gateway"
snip_install_istio_13
echo "Exposing services via the east-west gateway"
snip_install_istio_14
} }
# Install Istio on the 2 clusters. Executing in function install_istio {
# parallel to reduce test time. # Install Istio on the 2 clusters. Executing in
install_istio_on_cluster1 & # parallel to reduce test time.
install_istio_on_cluster2 & install_istio_on_cluster1 &
wait install_istio_on_cluster2 &
wait
}
# Configure endpoint discovery. function configure_endpoint_discovery {
snip_install_istio_15 # Configure endpoint discovery.
snip_install_istio_16 snip_install_istio_15
snip_install_istio_16
}
# Verify that traffic is properly load balanced. time configure_trust
verify_load_balancing time install_istio
time configure_endpoint_discovery
time verify_load_balancing
# @cleanup # @cleanup
source content/en/docs/setup/install/multicluster/common.sh source content/en/docs/setup/install/multicluster/common.sh
set +e # ignore cleanup errors set +e # ignore cleanup errors
set_multi_network_vars set_multi_network_vars
cleanup time cleanup
# Everything should be removed once cleanup completes. Use a small
# number of retries for comparing cluster snapshots before/after the test.
export VERIFY_RETRIES=1

View File

@ -25,30 +25,42 @@ source content/en/docs/setup/install/multicluster/common.sh
set_single_network_vars set_single_network_vars
function install_istio_on_cluster1 { function install_istio_on_cluster1 {
snip_install_istio_1 echo "Installing Istio on Primary cluster: ${CTX_CLUSTER1}"
echo y | snip_install_istio_2 snip_install_istio_1
echo y | snip_install_istio_2
} }
function install_istio_on_cluster2 { function install_istio_on_cluster2 {
snip_install_istio_3 echo "Installing Istio on Primary cluster: ${CTX_CLUSTER2}"
echo y | snip_install_istio_4 snip_install_istio_3
echo y | snip_install_istio_4
} }
# Install Istio on the 2 clusters. Executing in function install_istio {
# parallel to reduce test time. # Install Istio on the 2 clusters. Executing in
install_istio_on_cluster1 & # parallel to reduce test time.
install_istio_on_cluster2 & install_istio_on_cluster1 &
wait install_istio_on_cluster2 &
wait
}
# Configure endpoint discovery. function configure_endpoint_discovery {
snip_install_istio_5 # Configure endpoint discovery.
snip_install_istio_6 snip_install_istio_5
snip_install_istio_6
}
# Verify that traffic is properly load balanced. time configure_trust
verify_load_balancing time install_istio
time configure_endpoint_discovery
time verify_load_balancing
# @cleanup # @cleanup
source content/en/docs/setup/install/multicluster/common.sh source content/en/docs/setup/install/multicluster/common.sh
set +e # ignore cleanup errors set +e # ignore cleanup errors
set_single_network_vars set_single_network_vars
cleanup time cleanup
# Everything should be removed once cleanup completes. Use a small
# number of retries for comparing cluster snapshots before/after the test.
export VERIFY_RETRIES=1

View File

@ -25,39 +25,55 @@ source content/en/docs/setup/install/multicluster/common.sh
set_multi_network_vars set_multi_network_vars
function install_istio_on_cluster1 { function install_istio_on_cluster1 {
snip_install_istio_25 echo "Installing Istio on Primary cluster: ${CTX_CLUSTER1}"
echo y | snip_install_istio_26 snip_install_istio_25
echo y | snip_install_istio_26
# Expose istiod and services via east-west gateway. echo "Creating the east-west gateway"
snip_install_istio_27 snip_install_istio_27
snip_install_istio_28
snip_install_istio_29 echo "Waiting for the east-west gateway to have an external IP"
_wait_for_gateway_ip istio-system istio-eastwestgateway "${CTX_CLUSTER1}"
echo "Exposing istiod via the east-west gateway"
snip_install_istio_28
echo "Exposing services via the east-west gateway"
snip_install_istio_29
} }
function install_istio_on_cluster2 { function install_istio_on_cluster2 {
snip_install_istio_30 echo "Installing Istio on Remote cluster: ${CTX_CLUSTER2}"
snip_install_istio_31 snip_install_istio_31
echo y | snip_install_istio_32 snip_install_istio_32
echo y | snip_install_istio_33
# Expose services via east-west gateway echo "Creating the east-west gateway"
snip_install_istio_33 snip_install_istio_34
snip_install_istio_34
echo "Waiting for the east-west gateway to have an external IP"
_wait_for_gateway_ip istio-system istio-eastwestgateway "${CTX_CLUSTER2}"
echo "Exposing services via the east-west gateway"
snip_install_istio_35
} }
# Install Istio on the 2 clusters. Executing in function configure_api_server_access {
# parallel to reduce test time. snip_install_istio_30
install_istio_on_cluster1 & }
install_istio_on_cluster2 &
wait
# Configure endpoint discovery. time configure_trust
snip_install_istio_35 time install_istio_on_cluster1
time configure_api_server_access
# Verify that traffic is properly load balanced. time install_istio_on_cluster2
verify_load_balancing time verify_load_balancing
# @cleanup # @cleanup
source content/en/docs/setup/install/multicluster/common.sh source content/en/docs/setup/install/multicluster/common.sh
set +e # ignore cleanup errors set +e # ignore cleanup errors
set_multi_network_vars set_multi_network_vars
cleanup time cleanup
# Everything should be removed once cleanup completes. Use a small
# number of retries for comparing cluster snapshots before/after the test.
export VERIFY_RETRIES=1

View File

@ -25,34 +25,43 @@ source content/en/docs/setup/install/multicluster/common.sh
set_single_network_vars set_single_network_vars
function install_istio_on_cluster1 { function install_istio_on_cluster1 {
snip_install_istio_17 echo "Installing Istio on Primary cluster: ${CTX_CLUSTER1}"
echo y | snip_install_istio_18 snip_install_istio_17
echo y | snip_install_istio_18
# Expose istiod via east-west gateway. echo "Creating the east-west gateway"
snip_install_istio_19 snip_install_istio_19
snip_install_istio_20
echo "Waiting for the east-west gateway to have an external IP"
_wait_for_gateway_ip istio-system istio-eastwestgateway "${CTX_CLUSTER1}"
echo "Exposing istiod via the east-west gateway"
snip_install_istio_20
} }
function install_istio_on_cluster2 { function install_istio_on_cluster2 {
snip_install_istio_21 echo "Installing Istio on Remote cluster: ${CTX_CLUSTER2}"
snip_install_istio_22 snip_install_istio_22
echo y | snip_install_istio_23 snip_install_istio_23
echo y | snip_install_istio_24
} }
# Install Istio on the 2 clusters. Executing in function configure_api_server_access {
# parallel to reduce test time. snip_install_istio_21
install_istio_on_cluster1 & }
install_istio_on_cluster2 &
wait
# Configure endpoint discovery. time configure_trust
snip_install_istio_24 time install_istio_on_cluster1
time configure_api_server_access
# Verify that traffic is properly load balanced. time install_istio_on_cluster2
verify_load_balancing time verify_load_balancing
# @cleanup # @cleanup
source content/en/docs/setup/install/multicluster/common.sh source content/en/docs/setup/install/multicluster/common.sh
set +e # ignore cleanup errors set +e # ignore cleanup errors
set_single_network_vars set_single_network_vars
cleanup time cleanup
# Everything should be removed once cleanup completes. Use a small
# number of retries for comparing cluster snapshots before/after the test.
export VERIFY_RETRIES=1

View File

@ -26,7 +26,7 @@ export CTX_CLUSTER2=cluster2
} }
snip_install_istio_1() { snip_install_istio_1() {
cat <<EOF > ./cluster1.yaml cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -44,7 +44,7 @@ istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml
} }
snip_install_istio_3() { snip_install_istio_3() {
cat <<EOF > ./cluster2.yaml cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -76,7 +76,7 @@ istioctl x create-remote-secret \
} }
snip_install_istio_7() { snip_install_istio_7() {
cat <<EOF > ./cluster1.yaml cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -106,7 +106,7 @@ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
} }
snip_install_istio_11() { snip_install_istio_11() {
cat <<EOF > ./cluster2.yaml cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -150,7 +150,7 @@ istioctl x create-remote-secret \
} }
snip_install_istio_17() { snip_install_istio_17() {
cat <<EOF > ./cluster1.yaml cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -180,14 +180,21 @@ kubectl apply --context="${CTX_CLUSTER1}" -f \
} }
snip_install_istio_21() { snip_install_istio_21() {
istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
}
snip_install_istio_22() {
export DISCOVERY_ADDRESS=$(kubectl \ export DISCOVERY_ADDRESS=$(kubectl \
--context="${CTX_CLUSTER1}" \ --context="${CTX_CLUSTER1}" \
-n istio-system get svc istio-eastwestgateway \ -n istio-system get svc istio-eastwestgateway \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}') -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
} }
snip_install_istio_22() { snip_install_istio_23() {
cat <<EOF > ./cluster2.yaml cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -201,19 +208,12 @@ spec:
EOF EOF
} }
snip_install_istio_23() { snip_install_istio_24() {
istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
} }
snip_install_istio_24() {
istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
}
snip_install_istio_25() { snip_install_istio_25() {
cat <<EOF > ./cluster1.yaml cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -248,14 +248,21 @@ kubectl --context="${CTX_CLUSTER1}" apply -n istio-system -f \
} }
snip_install_istio_30() { snip_install_istio_30() {
istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
}
snip_install_istio_31() {
export DISCOVERY_ADDRESS=$(kubectl \ export DISCOVERY_ADDRESS=$(kubectl \
--context="${CTX_CLUSTER1}" \ --context="${CTX_CLUSTER1}" \
-n istio-system get svc istio-eastwestgateway \ -n istio-system get svc istio-eastwestgateway \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}') -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
} }
snip_install_istio_31() { snip_install_istio_32() {
cat <<EOF > ./cluster2.yaml cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1 apiVersion: install.istio.io/v1alpha1
kind: IstioOperator kind: IstioOperator
spec: spec:
@ -269,29 +276,22 @@ spec:
EOF EOF
} }
snip_install_istio_32() { snip_install_istio_33() {
istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml
} }
snip_install_istio_33() { snip_install_istio_34() {
MESH=mesh1 CLUSTER=cluster2 NETWORK=network2 \ MESH=mesh1 CLUSTER=cluster2 NETWORK=network2 \
samples/multicluster/gen-eastwest-gateway.sh | \ samples/multicluster/gen-eastwest-gateway.sh | \
istioctl manifest generate -f - | \ istioctl manifest generate -f - | \
kubectl apply --context="${CTX_CLUSTER2}" -f - kubectl apply --context="${CTX_CLUSTER2}" -f -
} }
snip_install_istio_34() { snip_install_istio_35() {
kubectl --context="${CTX_CLUSTER2}" apply -n istio-system -f \ kubectl --context="${CTX_CLUSTER2}" apply -n istio-system -f \
samples/multicluster/expose-services.yaml samples/multicluster/expose-services.yaml
} }
snip_install_istio_35() {
istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"
}
snip_deploy_the_helloworld_service_1() { snip_deploy_the_helloworld_service_1() {
kubectl create --context="${CTX_CLUSTER1}" namespace sample kubectl create --context="${CTX_CLUSTER1}" namespace sample
kubectl create --context="${CTX_CLUSTER2}" namespace sample kubectl create --context="${CTX_CLUSTER2}" namespace sample
@ -307,20 +307,20 @@ kubectl label --context="${CTX_CLUSTER2}" namespace sample \
snip_deploy_the_helloworld_service_3() { snip_deploy_the_helloworld_service_3() {
kubectl apply --context="${CTX_CLUSTER1}" \ kubectl apply --context="${CTX_CLUSTER1}" \
-f samples/helloworld/helloworld.yaml \ -f samples/helloworld/helloworld.yaml \
-l app=helloworld -n sample -l service=helloworld -n sample
kubectl apply --context="${CTX_CLUSTER2}" \ kubectl apply --context="${CTX_CLUSTER2}" \
-f samples/helloworld/helloworld.yaml \ -f samples/helloworld/helloworld.yaml \
-l app=helloworld -n sample -l service=helloworld -n sample
} }
snip_deploy_helloworld_v1_1() { snip_deploy_helloworld_v1_1() {
kubectl apply --context="${CTX_CLUSTER1}" \ kubectl apply --context="${CTX_CLUSTER1}" \
-f samples/helloworld/helloworld.yaml \ -f samples/helloworld/helloworld.yaml \
-l app=helloworld -l version=v1 -n sample -l version=v1 -n sample
} }
snip_deploy_helloworld_v1_2() { snip_deploy_helloworld_v1_2() {
kubectl get pod --context="${CTX_CLUSTER1}" -n sample kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=helloworld
} }
! read -r -d '' snip_deploy_helloworld_v1_2_out <<\ENDSNIP ! read -r -d '' snip_deploy_helloworld_v1_2_out <<\ENDSNIP
@ -331,11 +331,11 @@ ENDSNIP
snip_deploy_helloworld_v2_1() { snip_deploy_helloworld_v2_1() {
kubectl apply --context="${CTX_CLUSTER2}" \ kubectl apply --context="${CTX_CLUSTER2}" \
-f samples/helloworld/helloworld.yaml \ -f samples/helloworld/helloworld.yaml \
-l app=helloworld -l version=v2 -n sample -l version=v2 -n sample
} }
snip_deploy_helloworld_v2_2() { snip_deploy_helloworld_v2_2() {
kubectl get pod --context="${CTX_CLUSTER2}" -n sample kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=helloworld
} }
! read -r -d '' snip_deploy_helloworld_v2_2_out <<\ENDSNIP ! read -r -d '' snip_deploy_helloworld_v2_2_out <<\ENDSNIP
@ -355,6 +355,7 @@ kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=sleep
} }
! read -r -d '' snip_deploy_sleep_2_out <<\ENDSNIP ! read -r -d '' snip_deploy_sleep_2_out <<\ENDSNIP
NAME READY STATUS RESTARTS AGE
sleep-754684654f-n6bzf 2/2 Running 0 5s sleep-754684654f-n6bzf 2/2 Running 0 5s
ENDSNIP ENDSNIP
@ -363,6 +364,7 @@ kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=sleep
} }
! read -r -d '' snip_deploy_sleep_3_out <<\ENDSNIP ! read -r -d '' snip_deploy_sleep_3_out <<\ENDSNIP
NAME READY STATUS RESTARTS AGE
sleep-754684654f-dzl9j 2/2 Running 0 5s sleep-754684654f-dzl9j 2/2 Running 0 5s
ENDSNIP ENDSNIP

2
go.mod
View File

@ -27,6 +27,6 @@ replace github.com/imdario/mergo => github.com/imdario/mergo v0.3.5
replace github.com/evanphx/json-patch => github.com/evanphx/json-patch v0.0.0-20190815234213-e83c0a1c26c8 replace github.com/evanphx/json-patch => github.com/evanphx/json-patch v0.0.0-20190815234213-e83c0a1c26c8
require ( require (
istio.io/istio v0.0.0-20201014161623-394493e824eb istio.io/istio v0.0.0-20201020214016-6ba5c6b9a1e7
istio.io/pkg v0.0.0-20200922180714-670b76a68558 istio.io/pkg v0.0.0-20200922180714-670b76a68558
) )

25
go.sum
View File

@ -1233,15 +1233,15 @@ honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
istio.io/api v0.0.0-20190515205759-982e5c3888c6/go.mod h1:hhLFQmpHia8zgaM37vb2ml9iS5NfNfqZGRt1pS9aVEo= istio.io/api v0.0.0-20190515205759-982e5c3888c6/go.mod h1:hhLFQmpHia8zgaM37vb2ml9iS5NfNfqZGRt1pS9aVEo=
istio.io/api v0.0.0-20200812202721-24be265d41c3/go.mod h1:88HN3o1fSD1jo+Z1WTLlJfMm9biopur6Ct9BFKjiB64= istio.io/api v0.0.0-20200812202721-24be265d41c3/go.mod h1:88HN3o1fSD1jo+Z1WTLlJfMm9biopur6Ct9BFKjiB64=
istio.io/api v0.0.0-20201007205536-38d3c76a5557 h1:EDgHyV3kq988v2vb4p4j/D0saXf1JGh43uWhEkD4x+M= istio.io/api v0.0.0-20201020011337-0d3a960deddb h1:/oFtAb7roeWXlZh9CDWM4pQsPeDfunzxVg4aldSLw84=
istio.io/api v0.0.0-20201007205536-38d3c76a5557/go.mod h1:88HN3o1fSD1jo+Z1WTLlJfMm9biopur6Ct9BFKjiB64= istio.io/api v0.0.0-20201020011337-0d3a960deddb/go.mod h1:88HN3o1fSD1jo+Z1WTLlJfMm9biopur6Ct9BFKjiB64=
istio.io/client-go v0.0.0-20200908160912-f99162621a1a h1:clPn0fz+rXq5Ytj6Ppb1ygUKeU0RImT4ZbT1oMd1G04= istio.io/client-go v0.0.0-20200908160912-f99162621a1a h1:clPn0fz+rXq5Ytj6Ppb1ygUKeU0RImT4ZbT1oMd1G04=
istio.io/client-go v0.0.0-20200908160912-f99162621a1a/go.mod h1:SO65MWt7I45dvUwuDowoiB0SVcGpfWZfUTlopvYpbZc= istio.io/client-go v0.0.0-20200908160912-f99162621a1a/go.mod h1:SO65MWt7I45dvUwuDowoiB0SVcGpfWZfUTlopvYpbZc=
istio.io/gogo-genproto v0.0.0-20190930162913-45029607206a/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= istio.io/gogo-genproto v0.0.0-20190930162913-45029607206a/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs=
istio.io/gogo-genproto v0.0.0-20200908160912-66171252e3db h1:btPv5pCusFxbWrmiLNLEThH8IzWunUeZ1r5M1O22vBc= istio.io/gogo-genproto v0.0.0-20200908160912-66171252e3db h1:btPv5pCusFxbWrmiLNLEThH8IzWunUeZ1r5M1O22vBc=
istio.io/gogo-genproto v0.0.0-20200908160912-66171252e3db/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= istio.io/gogo-genproto v0.0.0-20200908160912-66171252e3db/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs=
istio.io/istio v0.0.0-20201014161623-394493e824eb h1:TtFRcM8eYDPvZOArA1Ykne9JMzXSPMPBOqVnoT/oUUM= istio.io/istio v0.0.0-20201020214016-6ba5c6b9a1e7 h1:6CJDE2X7mH6pcNpNNniD8r9ZSnDZn7xo6Ay3VewfkJ0=
istio.io/istio v0.0.0-20201014161623-394493e824eb/go.mod h1:bOY51cI9r95WV7gSP4r/bWzaxcCjaXuNGBvLEJQ0wJc= istio.io/istio v0.0.0-20201020214016-6ba5c6b9a1e7/go.mod h1:nPwhi1qIogLf4pxXfdh86h+A4TM4SU5JfxSsvroaXIQ=
istio.io/pkg v0.0.0-20200922180714-670b76a68558 h1:ATDshla3gX4b0X8oMs0rrFry9qJshrzTnFkBV42CcFk= istio.io/pkg v0.0.0-20200922180714-670b76a68558 h1:ATDshla3gX4b0X8oMs0rrFry9qJshrzTnFkBV42CcFk=
istio.io/pkg v0.0.0-20200922180714-670b76a68558/go.mod h1:p6wktGBjkjL3spRSsyfOh0XkuKb8IuBX61rERHfmSbU= istio.io/pkg v0.0.0-20200922180714-670b76a68558/go.mod h1:p6wktGBjkjL3spRSsyfOh0XkuKb8IuBX61rERHfmSbU=
k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8=
@ -1250,10 +1250,10 @@ k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
k8s.io/api v0.18.3 h1:2AJaUQdgUZLoDZHrun21PW2Nx9+ll6cUzvn3IKhSIn0= k8s.io/api v0.18.3 h1:2AJaUQdgUZLoDZHrun21PW2Nx9+ll6cUzvn3IKhSIn0=
k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA=
k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI=
k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc=
k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
k8s.io/api v0.19.1 h1:oZf4bYsBdjC49PdTwNfLmrfUFCwKUi94HY/+emXI8Qw= k8s.io/api v0.19.1 h1:oZf4bYsBdjC49PdTwNfLmrfUFCwKUi94HY/+emXI8Qw=
k8s.io/api v0.19.1/go.mod h1:+u/k4/K/7vp4vsfdT7dyl8Oxk1F26Md4g5F26Tu85PU= k8s.io/api v0.19.1/go.mod h1:+u/k4/K/7vp4vsfdT7dyl8Oxk1F26Md4g5F26Tu85PU=
k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms=
k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo= k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo=
k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M=
@ -1265,10 +1265,10 @@ k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftc
k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk=
k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ=
k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/apimachinery v0.19.1 h1:cwsxZazM/LA9aUsBaL4bRS5ygoM6bYp8dFk22DSYQa4= k8s.io/apimachinery v0.19.1 h1:cwsxZazM/LA9aUsBaL4bRS5ygoM6bYp8dFk22DSYQa4=
k8s.io/apimachinery v0.19.1/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apimachinery v0.19.1/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/apimachinery v0.19.2 h1:5Gy9vQpAGTKHPVOh5c4plE274X8D/6cuEiTO2zve7tc=
k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw=
k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg=
@ -1280,15 +1280,16 @@ k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
k8s.io/client-go v0.18.1/go.mod h1:iCikYRiXOj/yRRFE/aWqrpPtDt4P2JVWhtHkmESTcfY= k8s.io/client-go v0.18.1/go.mod h1:iCikYRiXOj/yRRFE/aWqrpPtDt4P2JVWhtHkmESTcfY=
k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q=
k8s.io/client-go v0.19.0 h1:1+0E0zfWFIWeyRhQYWzimJOyAk2UT7TiARaLNwJCf7k=
k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU=
k8s.io/client-go v0.19.1 h1:xfFwj+YFKa8rcihlFYZABjxcy7Sm/wJQ+GxW3JyVtKI= k8s.io/client-go v0.19.1 h1:xfFwj+YFKa8rcihlFYZABjxcy7Sm/wJQ+GxW3JyVtKI=
k8s.io/client-go v0.19.1/go.mod h1:AZOIVSI9UUtQPeJD3zJFp15CEhSjRgAuQP5PWRJrCIQ= k8s.io/client-go v0.19.1/go.mod h1:AZOIVSI9UUtQPeJD3zJFp15CEhSjRgAuQP5PWRJrCIQ=
k8s.io/client-go v0.19.2 h1:gMJuU3xJZs86L1oQ99R4EViAADUPMHHtS9jFshasHSc=
k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
k8s.io/code-generator v0.19.1/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= k8s.io/code-generator v0.19.1/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c=
k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14=
@ -1333,8 +1334,8 @@ sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526h
sigs.k8s.io/controller-tools v0.4.0/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= sigs.k8s.io/controller-tools v0.4.0/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU=
sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
sigs.k8s.io/service-apis v0.0.0-20200916220245-b060b8df63c9 h1:9z7RSE6mFtwzhHvuZWqki6KSLp9g94jt17ysvft/nEU= sigs.k8s.io/service-apis v0.0.0-20201013190827-799dbbe3a3ba h1:tmIsMOyPg1eOSRDFMinrHktWafHyosZcxK/hnFS5HFo=
sigs.k8s.io/service-apis v0.0.0-20200916220245-b060b8df63c9/go.mod h1:yfIjKFwmoJxpP4m4qOmdBLgJvlSw61GDYuKTuRo7O1c= sigs.k8s.io/service-apis v0.0.0-20201013190827-799dbbe3a3ba/go.mod h1:QkiV/PnK7YbN5zqYqXnh5wByTTT1LYJ5scwdIs62qWs=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=

View File

@ -70,16 +70,50 @@ _set_ingress_environment_variables() {
# kubectl wait --for=condition=Ready pod --all --timeout=60s # kubectl wait --for=condition=Ready pod --all --timeout=60s
# Wait for rollout of named deployment # Wait for rollout of named deployment
# usage: _wait_for_deployment <namespace> <deployment name> # usage: _wait_for_deployment <namespace> <deployment name> <optional: context>
_wait_for_deployment() { _wait_for_deployment() {
local namespace="$1" local namespace="$1"
local name="$2" local name="$2"
if ! kubectl -n "$namespace" rollout status deployment "$name" --timeout 5m; then local context="${3:-}"
if ! kubectl --context="$context" -n "$namespace" rollout status deployment "$name" --timeout 5m; then
echo "Failed rollout of deployment $name in namespace $namespace" echo "Failed rollout of deployment $name in namespace $namespace"
exit 1 exit 1
fi fi
} }
# Wait for the given gateway to be allocated an external IP.
# usage: _wait_for_gateway_ip <namespace> <service name> <optional: context>
_wait_for_gateway_ip() {
local namespace="$1"
local service="$2"
local context="${3:-}"
local max_time=${MAX_SECONDS:-300} # Default to 5 min.
local delay=5
local start_time=$(date +%s)
local current_time=$start_time
local end_time=$((start_time + max_time))
while true; do
local ip=$(kubectl --context="${context}" get svc "${service}" -n "${namespace}" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# Verify that the IP is set.
if [[ -n "${ip}" ]]; then
echo "IP Assigned for $service.$namespace: ${ip}"
return
fi
current_time=$(date +%s)
if (( current_time > end_time )); then
echo "Failed waiting for $service.$namespace: ${ip}"
exit 1
fi
sleep "${delay}"
done
}
# Wait for Istio config to propagate # Wait for Istio config to propagate
# usage: _wait_for_istio <kind> <namespace> <name> # usage: _wait_for_istio <kind> <namespace> <name>
_wait_for_istio() { _wait_for_istio() {

View File

@ -313,6 +313,8 @@ __create_cluster_snapshots() {
} }
__cluster_cleanup_check() { __cluster_cleanup_check() {
VERIFY_RETRIES=${VERIFY_RETRIES:-9}
# Get the list of KUBECONFIG files as an array. # Get the list of KUBECONFIG files as an array.
IFS=':' read -r -a KFILES <<< "${KUBECONFIG}" IFS=':' read -r -a KFILES <<< "${KUBECONFIG}"
for KFILE in "${KFILES[@]}"; do for KFILE in "${KFILES[@]}"; do
@ -330,7 +332,6 @@ __cluster_cleanup_check() {
rm "${SNAPSHOT_FILE}" rm "${SNAPSHOT_FILE}"
# Verify that we've restored the original cluster state. # Verify that we've restored the original cluster state.
VERIFY_RETRIES=9
(KUBECONFIG="${KFILE}"; _verify_like __cluster_state "${SNAPSHOT}") (KUBECONFIG="${KFILE}"; _verify_like __cluster_state "${SNAPSHOT}")
echo "Finished cleanup check against snapshot ${SNAPSHOT_FILE}" echo "Finished cleanup check against snapshot ${SNAPSHOT_FILE}"
done done