Configure WorkloadGroup and Sidecar for the Workload on-premise
You will deploy the ratings application on a VM on-premise
and onboard it into the service mesh.
Create a WorkloadGroup
Execute the following command to create a WorkloadGroup:
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadGroup
metadata:
name: ratings
namespace: bookinfo
labels:
app: ratings
spec:
template:
labels:
app: ratings
class: vm
serviceAccount: bookinfo-ratings
EOF
The field spec.template.network is omitted to indicate to the Istio control
plane that the VM on-premise has direct connectivity to the Kubernetes Pods.
The field spec.template.serviceAccount declares that the workload have the
identity of the service account bookinfo-ratings within the Kubernetes cluster.
The service account bookinfo-ratings was created during the
deployment of the Istio bookinfo example earlier
Create the Sidecar Configuration
Execute the following command to create a new sidecar configuration:
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: bookinfo-ratings-no-iptables
namespace: bookinfo
spec:
workloadSelector: # (1)
labels:
app: ratings
class: vm
ingress:
- defaultEndpoint: 127.0.0.1:9080 # (2)
port:
name: http
number: 9080 # (3)
protocol: HTTP
egress:
- bind: 127.0.0.2 # (4)
port:
number: 9080 # (5)
hosts:
- ./* # (6)
EOF
The above sidecar configuration will only apply to workloads that have the
labels app=ratings and class=vm (1). The WorkloadGroup you have created
has these labels.
Istio proxy will be configured to listen on <host IP>:9080 (3) and will
forward incoming requests to the application that listens on 127.0.0.1:9080 (2).
And finally the proxy will be configured to listen on 127.0.0.2:9080 (4) (5) to
proxy outgoing requests out of the application to other services (6) that have port 9080 (5).
Allow Workloads to authenticate themselves by means of a JWT Token
For the purposes of this guide, you will be using Sample JWT Credential Plugin
to provide your on-premise workload with a JWT Token credential.
In this section you will configure Workload Onboarding Plane to trust JWT Tokens
issued by the Sample JWT Credential Plugin.
Execute the following command to download Sample JWT Credential Plugin locally:
curl -fL "https://dl.cloudsmith.io/public/tetrate/onboarding-examples/raw/files/onboarding-agent-sample-jwt-credential-plugin_0.0.1_$(uname -s)_$(uname -m).tar.gz" \
| tar -xz onboarding-agent-sample-jwt-credential-plugin
Execute the following command to generate a unique signing key for use by the
Sample JWT Credential Plugin:
./onboarding-agent-sample-jwt-credential-plugin generate key \
-o ./sample-jwt-issuer
The above command will generate 2 files:
./sample-jwt-issuer.jwk- signing key (secret part) - for configuringSample JWT Credential Pluginon the VM on-premise./sample-jwt-issuer.jwks- JWKS document (public part) - for configuringWorkload Onboarding Plane
Execute the following command to configure Workload Onboarding Plane to trust
JWT Tokens signed by the key generated above:
cat << EOF > controlplane.patch.yaml
spec:
meshExpansion:
onboarding:
workloads:
authentication:
jwt:
issuers:
- issuer: https://sample-jwt-issuer.example
jwks: |
$(cat sample-jwt-issuer.jwks | awk '{print " "$0}')
shortName: my-corp
tokenFields:
attributes:
jsonPath: .custom_attributes
EOF
kubectl patch controlplane controlplane -n istio-system --type merge --patch-file controlplane.patch.yaml
NOTE: For the above command to work, you need to use kubectl v1.20+.
Allow Workloads to Join the WorkloadGroup
You will need to create an OnboardingPolicy
resource to explicitly authorize workloads deployed outside of Kubernetes to join the mesh.
Execute the following command:
cat << EOF | kubectl apply -f -
apiVersion: authorization.onboarding.tetrate.io/v1alpha1
kind: OnboardingPolicy
metadata:
name: allow-onpremise-vms
namespace: bookinfo # (1)
spec:
allow:
- workloads:
- jwt:
issuer: "https://sample-jwt-issuer.example" # (2)
onboardTo:
- workloadGroupSelector: {} # (3)
EOF
The above policy applies to any on-premise workload that authenticates
itself by means of a JWT Token issued by an issuer with ID
https://sample-jwt-issuer.example (2), and allows them to join any
WorkloadGroup (3) in the namespace bookinfo (1)