Skip to content

Commit 496422c

Browse files
authored
Merge pull request #11 from doitintl/gke-autopilot
deploy on GKE autopilot
2 parents c00b855 + 3284dec commit 496422c

File tree

5 files changed

+124
-4
lines changed

5 files changed

+124
-4
lines changed

README.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
# Securely access AWS Services from GKE cluster
44

5-
> :attention: GKE Autopilot deployment is not supported due to the [limitations](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#webhooks_limitations)
6-
75
Ever wanted to access AWS services from Google Kubernetes cluster (GKE) without using AWS IAM credentials?
86

97
This solution can help you to get and exchange Google OIDC token for temporary AWS IAM security credentials are generated by AWS STS service. This approach allows you to access AWS services form a GKE cluster without pre-generated long-living AWS credentials.
@@ -89,6 +87,19 @@ certificatesigningrequest.certificates.k8s.io/gtoken-webhook-svc.default approve
8987
secret/gtoken-webhook-certs configured
9088
```
9189

90+
**Note** Gor GKE Autopilot, run the [webhook-create-self-signed-cert.sh](https://github.com/doitintl/gtoken/blob/master/deployment/webhook-create-self-signed-cert.sh) script to generate a self-signed certificate.
91+
92+
Export CA Bundle as environment variable:
93+
94+
```sh
95+
export CA_BUNDLE=[output value of the previous script "Encoded CA:"]
96+
```
97+
98+
Then, we’ll create the webhook service and deployment:
99+
100+
```yaml
101+
```
102+
92103
Create Kubernetes Service Account to be used with `gtoken-webhook`:
93104

94105
```sh

deployment/deployment.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ spec:
1818
- name: gtoken-webhook
1919
image: doitintl/gtoken-webhook
2020
imagePullPolicy: Always
21+
resources:
22+
requests:
23+
cpu: 250m
24+
memory: 512Mi
2125
args:
2226
- --log-level=debug
2327
- server
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
usage() {
6+
cat <<EOF
7+
Generate certificate suitable for use with an gtoken webhook service.
8+
9+
This script generates self-signed certificate for the webhook. See
10+
https://www.velotio.com/engineering-blog/managing-tls-certificate-for-kubernetes-admission-webhook
11+
detailed explantion and additional instructions.
12+
13+
The server key/cert k8s CA cert are stored in a k8s secret.
14+
15+
usage: ${0} [OPTIONS]
16+
17+
The following flags are required.
18+
19+
--service Service name of webhook.
20+
--namespace Namespace where webhook service and secret reside.
21+
--secret Secret name for CA certificate and server certificate/key pair.
22+
EOF
23+
exit 1
24+
}
25+
26+
while [[ $# -gt 0 ]]; do
27+
case ${1} in
28+
--service)
29+
service="$2"
30+
shift
31+
;;
32+
--secret)
33+
secret="$2"
34+
shift
35+
;;
36+
--namespace)
37+
namespace="$2"
38+
shift
39+
;;
40+
*)
41+
usage
42+
;;
43+
esac
44+
shift
45+
done
46+
47+
[ -z ${service} ] && service=gtoken-webhook-svc
48+
[ -z ${secret} ] && secret=gtoken-webhook-certs
49+
[ -z ${namespace} ] && namespace=default
50+
51+
if [ ! -x "$(command -v openssl)" ]; then
52+
echo "openssl not found"
53+
exit 1
54+
fi
55+
56+
csrName=${service}.${namespace}
57+
tmpdir=$(mktemp -d)
58+
echo "creating certs in tmpdir ${tmpdir} "
59+
60+
cat <<EOF >> ${tmpdir}/csr.conf
61+
[req]
62+
req_extensions = v3_req
63+
distinguished_name = req_distinguished_name
64+
[req_distinguished_name]
65+
[ v3_req ]
66+
basicConstraints = CA:FALSE
67+
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
68+
extendedKeyUsage = serverAuth
69+
subjectAltName = @alt_names
70+
[alt_names]
71+
DNS.1 = ${service}
72+
DNS.2 = ${service}.${namespace}
73+
DNS.3 = ${service}.${namespace}.svc
74+
EOF
75+
76+
# create CA and Server key/certificate
77+
openssl genrsa -out ${tmpdir}/ca.key 2048
78+
openssl req -x509 -newkey rsa:2048 -key ${tmpdir}/ca.key -out ${tmpdir}/ca.crt -days 1825 -nodes -subj "/CN=${service}.${namespace}.svc"
79+
80+
# create server key/certificate
81+
openssl genrsa -out ${tmpdir}/server.key 2048
82+
openssl req -new -key ${tmpdir}/server.key -subj "/CN=${service}.${namespace}.svc" -out ${tmpdir}/server.csr -config ${tmpdir}/csr.conf
83+
84+
# Self sign
85+
openssl x509 -extensions v3_req -req -days 1825 -in ${tmpdir}/server.csr -CA ${tmpdir}/ca.crt -CAkey ${tmpdir}/ca.key -CAcreateserial -out ${tmpdir}/server.crt -extfile ${tmpdir}/csr.conf
86+
87+
# create the secret with CA cert and server cert/key
88+
kubectl create secret generic ${secret} \
89+
--from-file=key.pem=${tmpdir}/server.key \
90+
--from-file=cert.pem=${tmpdir}/server.crt \
91+
--dry-run=client -o yaml |
92+
kubectl -n ${namespace} apply -f -
93+
94+
# -a means base64 encode
95+
caBundle=$(cat ${tmpdir}/ca.crt | openssl enc -a -A)
96+
97+
echo "Encoded CA:"
98+
echo -e "${caBundle} \n"

deployment/webhook-create-signed-cert.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,8 @@ kubectl create secret generic ${secret} \
129129
--from-file=cert.pem=${tmpdir}/server-cert.pem \
130130
--dry-run=client -o yaml |
131131
kubectl -n ${namespace} apply -f -
132+
133+
# get CA bundle for use by webhook bootstrap
134+
caBundle=$(kubectl config view --raw --flatten -o json | jq -r '.clusters[] | select(.name == "'$(kubectl config current-context)'") | .cluster."certificate-authority-data"')
135+
echo "Encoded CA:"
136+
echo -e "${caBundle} \n"

deployment/webhook-patch-ca-bundle.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ set -o errexit
66
set -o nounset
77
set -o pipefail
88

9-
10-
export CA_BUNDLE=$(kubectl config view --raw --flatten -o json | jq -r '.clusters[] | select(.name == "'$(kubectl config current-context)'") | .cluster."certificate-authority-data"')
9+
if [[ -z "${CA_BUNDLE}" ]]; then
10+
echo "CA_BUNDLE not set"
11+
exit 1
12+
fi
1113

1214
if command -v envsubst >/dev/null 2>&1; then
1315
envsubst

0 commit comments

Comments
 (0)