Skip to content

Instantly share code, notes, and snippets.

@hiiamyes
Last active November 30, 2017 02:17
Show Gist options
  • Save hiiamyes/cef2e54269276f6ce85a47bdb22fc05a to your computer and use it in GitHub Desktop.
Save hiiamyes/cef2e54269276f6ce85a47bdb22fc05a to your computer and use it in GitHub Desktop.
gek web deployment
#!/bin/bash
project="pronect-name"
zone="us-east1-b"
cluster="cluster-name"
namespace="namespace-if-needed"
tput setaf 2; echo "Deploying..."
tput sgr0;
gcloud container clusters get-credentials $cluster --zone $zone --project $project
# ref:
# https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
# https://kubernetes-v1-4.github.io/docs/user-guide/kubectl/kubectl_apply/
kubectl apply -f "./scripts/gke/beta/namespaces.yaml"
kubectl --namespace=$namespace apply -f "./deployment.yaml"
kubectl --namespace=$namespace apply -f "./service.yaml"
kubectl --namespace=$namespace delete -f "./ingress.yaml"
kubectl --namespace=$namespace apply -f "./ingress.yaml"
tput setaf 2; echo "Complete"
tput sgr0;
# https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
# https://kubernetes.io/docs/api-reference/v1.8/
apiVersion: apps/v1beta1 # use apps/v1beta1 for versions before 1.8.0
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: web
spec: # https://kubernetes.io/docs/api-reference/v1.8/#podspec-v1-core
imagePullSecrets:
- name: gcr-json-key
containers: # https://kubernetes.io/docs/api-reference/v1.8/#container-v1-core
- name: web
image: asia.gcr.io/project-name/web:latest
imagePullPolicy: Always # https://kubernetes.io/docs/concepts/containers/images/#updating-images
ports: # https://kubernetes.io/docs/api-reference/v1.8/#containerport-v1-core
- containerPort: 3000
# https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
# https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod
apiVersion: v1
data:
.dockercfg: eyJodHRwczovL2FzaWEuZ2NyLmlvIjp7InVzZXJuYW1lIjoiX2pzb25fa2V5IiwicGFzc3dvcmQiOiJ7XG4gIFwidHlwZVwiOiBcInNlcnZpY2VfYWNjb3VudFwiLFxuICBcInByb2plY3RfaWRcIjogXCJpbmxpbmUtZGV2XCIsXG4gIFwicHJpdmF0ZV9rZXlfaWRcIjogXCJkNzg5OTgwZGJmMDIxN2Y3MTc5NjUwMmRiZDExOWZmMmI0YzdjNzY5XCIsXG4gIFwicHJpdmF0ZV9rZXlcIjogXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cXG5NSUlFdndJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLa3dnZ1NsQWdFQUFvSUJBUUM1RGlxczBUVGIrZUJzXFxuNi8zOTlsTTJlbUNqSlBSTjdHa2FEOWdXNS9zTDJtbkN1eGRMSVdueldRYWczUmZySmRsRHg3end6NTVrVTdDblxcbkVzR2dDMEdVRk4wbTVRRUNpZG5kbHFoSFBMbVpsYTJZMndoTlByRm82OE9UM21VTUpNcGV4RUFuQWFidjRuVC9cXG5adkl6VDFsUVNTRzdMMFM0YzdUYU5mN2ttRWhsSGlKRFhjTnYxREI0U2hBbFdJMHVHVmlIeC9LTlJ4cUFqdGxzXFxuVTZyR3hCdTYxQmlGTnYzZnZ3TlZXeUFnMHQvR3BPRmJ3UHROKzkrc0pvU3U1V3NtU0xiVmt2U0pWNFdmSGVOL1xcbjU0dDlQWnU5SWVFazlma1poWUlidk5mN2kzVkV2WWNKNFkrSkhiS1hnUlAvUEpYVXM2OG4vaHlySW81SlZ2UWJcXG42OVQ3NGhqWEFnTUJBQUVDZ2dFQUZzSG12cHoxdHEycWkwcVVVRFNJTkRWbGgvcWw3cVZKb1pKY1BTam5KeVNEXFxuaUJhUS9VVE5Ma2QrK0s1bjRCdWw5ZDlzM1dKeTlKeVVKMSszbnhKelRKNHFPanZFWFljTlcySkpMSVdMdjViNFxcbkk4bWY0anY0L2xHc0doV3A4STNmc3pySU51UE5uMGVHb3RnS3BnTzJsSmlCeE83QnNUdE5mTjVTQzlPc1ozN1JcXG5BVXlrQjU0bkZuOGpnRk1lcVp5dStaUzUvRWZGVlpWUWZ1ZFBncmNLdXBJcUFXWk8wNzRXeitFQkVkUzZOMVBUXFxubVM3TTZ0NmlkeExSdDFjM2ZhUDdXdVdzQnA5UVJOaWJ6akxScm5mTEtiVHBqNUp3NS90T3J5SzRyczRua3VjQVxcbmQzU0J5UjVwTFEwdlNoS3NiNEVicGlLS2VIVUlXQmFMd2w0SnR4RkxsUUtCZ1FEcXJzTWtyMTk0RTVrRUtBR0hcXG5nT1ZsdGFhb3lBZ21vajdpbkhlQndGR0VOWkJCU0lQZEJjY2tncjB0NHFReWN0dE9aMndoVXVvMUZqM3VSWWgrXFxuWFJsZk9vU0cvNVpXeTdsbkpBRWlkTTNlWDRMR1lKUFY1b3lyOW5iRklQQnhOUHNDendIODNpQnhSdHpqK0hoWlxcbk1rbVhQN1h3TVJNUG9OOEMxV0pDcDk1Q0V3S0JnUURKM1dMUkRxOHN5WEJrUzBTNkJobERvcU1HYmwwb0EyUk9cXG5hTk1VRzZIajBFTThIZVVSMDFraEdVd1RxZUpBZ0w5bFo2Y3FBUTRJM3FOMTNWR1hNL1dzM1F0eHpRMGVIT25qXFxuaEpYZ2lQUVVTWWRPRlB2YjRFU3UzeHhQWVFET2dZMFVBbzZaZGh5OVVtaWVwc01EZ0cwQ3dzZGVURjVHY3NKdVxcbjc0cjdnckVHclFLQmdRRG9pTHV4V05mRzJkeFBRdmlvOUMzWXh0SFpBVU1hVEw3MHVVYXMyUXVzYllwL05VUDdcXG5ONk5uNk9kY1ZPcVBWa0U1QWI4aGtjK2hSR1dlOTJUVW1KandROEpYSlY4b3Azb1EyWnNLTWlSZWg5TERqNlJNXFxuV01IZ0Rqa0hBS2xkOHJvWXdWYmQ0SmJTeHYxT0liL1YyYjhUVDd5TnY0SjhoTkVVTkt6RkVTSm40d0tCZ1FDN1xcblJWNEtNa1JER1hIaUtZM053aUNvQlhhV1hjYWdlMTBQL09GdGN5RWlGckI1VWdhVUhlMCs3cGdNV2Z0aStjNFdcXG5CaTRub3FqaGc2SkRreG5CVzF2Y2pZaXpmNVplekZZVFU0b3pydm80NCtuWmYxQVVNSituVjZhTTRhSDg4bVR1XFxuSGwwcWMwL0FOM2FGVUpIMGFxMDI5WG85dWoxdnY4RXZaNTBaTGFxTFZRS0JnUUNUY0MwaEMwUE5WczhRc1ROelxcblBMZVI4S0FKMG9PazNRSFo1WlhFdHpJWS9WRTd1cW9PdFBCeGI0V1ZMN0FsVkQ4UzRYRjBsZkJmZFFCcTJ1VjJcXG5ES0dCZzMvMGpyVXNoanNQY3h0V3RwQkxMSlMxaWpuZTBsNXIrNUZhQStwcExTcGxLaFhzandHUWVsZkdrSUdCXFxuNEJPN2lwY1dOS1JBRXV1amxhUmJVQVFjZmc9PVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cXG5cIixcbiAgXCJjbGllbnRfZW1haWxcIjogXCJnY3ItcHVsbEBpbmxpbmUtZGV2LmlhbS5nc2VydmljZWFjY291bnQuY29tXCIsXG4gIFwiY2xpZW50X2lkXCI6IFwiMTE0NjQ4MDM4NzA4MzY4MTYxNzY3XCIsXG4gIFwiYXV0aF91cmlcIjogXCJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vby9vYXV0aDIvYXV0aFwiLFxuICBcInRva2VuX3VyaVwiOiBcImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlblwiLFxuICBcImF1dGhfcHJvdmlkZXJfeDUwOV9jZXJ0X3VybFwiOiBcImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92MS9jZXJ0c1wiLFxuICBcImNsaWVudF94NTA5X2NlcnRfdXJsXCI6IFwiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vcm9ib3QvdjEvbWV0YWRhdGEveDUwOS9nY3ItcHVsbCU0MGlubGluZS1kZXYuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb21cIlxufSIsImVtYWlsIjoiaXRAaW5saW5lLnR3IiwiYXV0aCI6IlgycHpiMjVmYTJWNU9uc0tJQ0FpZEhsd1pTSTZJQ0p6WlhKMmFXTmxYMkZqWTI5MWJuUWlMQW9nSUNKd2NtOXFaV04wWDJsa0lqb2dJbWx1YkdsdVpTMWtaWFlpTEFvZ0lDSndjbWwyWVhSbFgydGxlVjlwWkNJNklDSmtOemc1T1Rnd1pHSm1NREl4TjJZM01UYzVOalV3TW1SaVpERXhPV1ptTW1JMFl6ZGpOelk1SWl3S0lDQWljSEpwZG1GMFpWOXJaWGtpT2lBaUxTMHRMUzFDUlVkSlRpQlFVa2xXUVZSRklFdEZXUzB0TFMwdFhHNU5TVWxGZG5kSlFrRkVRVTVDWjJ0eGFHdHBSemwzTUVKQlVVVkdRVUZUUTBKTGEzZG5aMU5zUVdkRlFVRnZTVUpCVVVNMVJHbHhjekJVVkdJclpVSnpYRzQyTHpNNU9XeE5NbVZ0UTJwS1VGSk9OMGRyWVVRNVoxYzFMM05NTW0xdVEzVjRaRXhKVjI1NlYxRmhaek5TWm5KS1pHeEVlRGQ2ZDNvMU5XdFZOME51WEc1RmMwZG5RekJIVlVaT01HMDFVVVZEYVdSdVpHeHhhRWhRVEcxYWJHRXlXVEozYUU1UWNrWnZOamhQVkROdFZVMUtUWEJsZUVWQmJrRmhZblkwYmxRdlhHNWFka2w2VkRGc1VWTlRSemRNTUZNMFl6ZFVZVTVtTjJ0dFJXaHNTR2xLUkZoalRuWXhSRUkwVTJoQmJGZEpNSFZIVm1sSWVDOUxUbEo0Y1VGcWRHeHpYRzVWTm5KSGVFSjFOakZDYVVaT2RqTm1kbmRPVmxkNVFXY3dkQzlIY0U5R1luZFFkRTRyT1N0elNtOVRkVFZYYzIxVFRHSldhM1pUU2xZMFYyWklaVTR2WEc0MU5IUTVVRnAxT1VsbFJXczVabXRhYUZsSlluWk9aamRwTTFaRmRsbGpTalJaSzBwSVlrdFlaMUpRTDFCS1dGVnpOamh1TDJoNWNrbHZOVXBXZGxGaVhHNDJPVlEzTkdocVdFRm5UVUpCUVVWRFoyZEZRVVp6U0cxMmNIb3hkSEV5Y1drd2NWVlZSRk5KVGtSV2JHZ3ZjV3czY1ZaS2IxcEtZMUJUYW01S2VWTkVYRzVwUW1GUkwxVlVUa3hyWkNzclN6VnVORUoxYkRsa09YTXpWMHA1T1VwNVZVb3hLek51ZUVwNlZFbzBjVTlxZGtWWVdXTk9WekpLU2t4SlYweDJOV0kwWEc1Sk9HMW1OR3AyTkM5c1IzTkhhRmR3T0VrelpuTjZja2xPZFZCT2JqQmxSMjkwWjB0d1owOHliRXBwUW5oUE4wSnpWSFJPWms0MVUwTTVUM05hTXpkU1hHNUJWWGxyUWpVMGJrWnVPR3BuUmsxbGNWcDVkU3RhVXpVdlJXWkdWbHBXVVdaMVpGQm5jbU5MZFhCSmNVRlhXazh3TnpSWGVpdEZRa1ZrVXpaT01WQlVYRzV0VXpkTk5uUTJhV1I0VEZKME1XTXpabUZRTjFkMVYzTkNjRGxSVWs1cFlucHFURkp5Ym1aTVMySlVjR28xU25jMUwzUlBjbmxMTkhKek5HNXJkV05CWEc1a00xTkNlVkkxY0V4Uk1IWlRhRXR6WWpSRlluQnBTMHRsU0ZWSlYwSmhUSGRzTkVwMGVFWk1iRkZMUW1kUlJIRnljMDFyY2pFNU5FVTFhMFZMUVVkSVhHNW5UMVpzZEdGaGIzbEJaMjF2YWpkcGJraGxRbmRHUjBWT1drSkNVMGxRWkVKalkydG5jakIwTkhGUmVXTjBkRTlhTW5kb1ZYVnZNVVpxTTNWU1dXZ3JYRzVZVW14bVQyOVRSeTgxV2xkNU4yeHVTa0ZGYVdSTk0yVllORXhIV1VwUVZqVnZlWEk1Ym1KR1NWQkNlRTVRYzBONmQwZzRNMmxDZUZKMGVtb3JTR2hhWEc1TmEyMVlVRGRZZDAxU1RWQnZUamhETVZkS1EzQTVOVU5GZDB0Q1oxRkVTak5YVEZKRWNUaHplVmhDYTFNd1V6WkNhR3hFYjNGTlIySnNNRzlCTWxKUFhHNWhUazFWUnpaSWFqQkZUVGhJWlZWU01ERnJhRWRWZDFSeFpVcEJaMHc1YkZvMlkzRkJVVFJKTTNGT01UTldSMWhOTDFkek0xRjBlSHBSTUdWSVQyNXFYRzVvU2xobmFWQlJWVk5aWkU5R1VIWmlORVZUZFRONGVGQlpVVVJQWjFrd1ZVRnZObHBrYUhrNVZXMXBaWEJ6VFVSblJ6QkRkM05rWlZSR05VZGpjMHAxWEc0M05ISTNaM0pGUjNKUlMwSm5VVVJ2YVV4MWVGZE9aa2N5WkhoUVVYWnBiemxETTFsNGRFaGFRVlZOWVZSTU56QjFWV0Z6TWxGMWMySlpjQzlPVlZBM1hHNU9OazV1Tms5a1kxWlBjVkJXYTBVMVFXSTRhR3RqSzJoU1IxZGxPVEpVVlcxS2FuZFJPRXBZU2xZNGIzQXpiMUV5V25OTFRXbFNaV2c1VEVScU5sSk5YRzVYVFVoblJHcHJTRUZMYkdRNGNtOVpkMVppWkRSS1lsTjRkakZQU1dJdlZqSmlPRlJVTjNsT2RqUktPR2hPUlZWT1MzcEdSVk5LYmpSM1MwSm5VVU0zWEc1U1ZqUkxUV3RTUkVkWVNHbExXVE5PZDJsRGIwSllZVmRZWTJGblpURXdVQzlQUm5SamVVVnBSbkpDTlZWbllWVklaVEFyTjNCblRWZG1kR2tyWXpSWFhHNUNhVFJ1YjNGcWFHYzJTa1JyZUc1Q1Z6RjJZMnBaYVhwbU5WcGxla1paVkZVMGIzcHlkbTgwTkN0dVdtWXhRVlZOU2l0dVZqWmhUVFJoU0RnNGJWUjFYRzVJYkRCeFl6QXZRVTR6WVVaVlNrZ3dZWEV3TWpsWWJ6bDFhakYyZGpoRmRsbzFNRnBNWVhGTVZsRkxRbWRSUTFSalF6Qm9RekJRVGxaek9GRnpWRTU2WEc1UVRHVlNPRXRCU2pCdlQyc3pVVWhhTlZwWVJYUjZTVmt2VmtVM2RYRnZUM1JRUW5oaU5GZFdURGRCYkZaRU9GTTBXRVl3YkdaQ1ptUlJRbkV5ZFZZeVhHNUVTMGRDWnpNdk1HcHlWWE5vYW5OUVkzaDBWM1J3UWt4TVNsTXhhV3B1WlRCc05YSXJOVVpoUVN0d2NFeFRjR3hMYUZoemFuZEhVV1ZzWmtkclNVZENYRzQwUWs4M2FYQmpWMDVMVWtGRmRYVnFiR0ZTWWxWQlVXTm1aejA5WEc0dExTMHRMVVZPUkNCUVVrbFdRVlJGSUV0RldTMHRMUzB0WEc0aUxBb2dJQ0pqYkdsbGJuUmZaVzFoYVd3aU9pQWlaMk55TFhCMWJHeEFhVzVzYVc1bExXUmxkaTVwWVcwdVozTmxjblpwWTJWaFkyTnZkVzUwTG1OdmJTSXNDaUFnSW1Oc2FXVnVkRjlwWkNJNklDSXhNVFEyTkRnd016ZzNNRGd6TmpneE5qRTNOamNpTEFvZ0lDSmhkWFJvWDNWeWFTSTZJQ0pvZEhSd2N6b3ZMMkZqWTI5MWJuUnpMbWR2YjJkc1pTNWpiMjB2Ynk5dllYVjBhREl2WVhWMGFDSXNDaUFnSW5SdmEyVnVYM1Z5YVNJNklDSm9kSFJ3Y3pvdkwyRmpZMjkxYm5SekxtZHZiMmRzWlM1amIyMHZieTl2WVhWMGFESXZkRzlyWlc0aUxBb2dJQ0poZFhSb1gzQnliM1pwWkdWeVgzZzFNRGxmWTJWeWRGOTFjbXdpT2lBaWFIUjBjSE02THk5M2QzY3VaMjl2WjJ4bFlYQnBjeTVqYjIwdmIyRjFkR2d5TDNZeEwyTmxjblJ6SWl3S0lDQWlZMnhwWlc1MFgzZzFNRGxmWTJWeWRGOTFjbXdpT2lBaWFIUjBjSE02THk5M2QzY3VaMjl2WjJ4bFlYQnBjeTVqYjIwdmNtOWliM1F2ZGpFdmJXVjBZV1JoZEdFdmVEVXdPUzluWTNJdGNIVnNiQ1UwTUdsdWJHbHVaUzFrWlhZdWFXRnRMbWR6WlhKMmFXTmxZV05qYjNWdWRDNWpiMjBpQ24wPSJ9fQ==
kind: Secret
metadata:
name: gcr-json-key
type: kubernetes.io/dockercfg
# https://github.com/jetstack/kube-lego#ingress-controllers
# https://github.com/jetstack/kube-lego/blob/master/examples/gce/echoserver/ingress-tls.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: web-beta # https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip#step_2b_using_an_ingress
# kubernetes.io/tls-acme: "true"
kubernetes.io/ingress.class: "gce" # https://github.com/kubernetes/ingress-nginx#annotation-ingressclass
# ingress.kubernetes.io/force-ssl-redirect: "true"
labels:
app: web
spec:
# https://github.com/jetstack/kube-lego#how-kube-lego-works
# https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
# tls:
# - secretName: web-tls # The secretName statements have to be unique per namespace
# hosts:
# - web.com
backend:
serviceName: web-service
servicePort: 80
apiVersion: v1
kind: Namespace
metadata:
name: namespace-if-needed
# https://kubernetes.io/docs/api-reference/v1.8/#service-v1-core
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web
spec: # https://kubernetes.io/docs/api-reference/v1.8/#servicespec-v1-core
type: NodePort
ports: # https://kubernetes.io/docs/api-reference/v1.8/#serviceport-v1-core
- port: 80
targetPort: 3000
selector:
app: web
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment