Skip to content

Instantly share code, notes, and snippets.

@kazuhito-m
Last active February 28, 2020 11:22
Show Gist options
  • Save kazuhito-m/10998e1bc41c25039fb5d6fba7161101 to your computer and use it in GitHub Desktop.
Save kazuhito-m/10998e1bc41c25039fb5d6fba7161101 to your computer and use it in GitHub Desktop.
gke/k8sのマニフェスト例
# k8sのアプリケーション群に与える環境変数のテンプレート
#
# 各環境ではこれを元として、書き換えたものを配置・参照するように。
#
apiVersion: v1
kind: ConfigMap
metadata:
name: thisproject-config
data:
ENVIRONMENT: local # 環境名
DOMAIN_WEBAPP: xxx.webapp.thisproject.com
DOMAIN_EUCAPI: xxx.eucapi.thisproject.com
CONNECTIONSTRING_SERVER: x.x.x.x # DBサーバのIP(CloudSQL作成後に埋める)
CONNECTIONSTRING_PORT: "5432"
CONNECTIONSTRING_USER: postgres
CONNECTIONSTRING_PASS: postgres
MIGRATION_BEFORE_DESTROY_DATABASE: "false" # マイグレーション実行前にデータをクリアするか
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 2
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp-container
image: asia.gcr.io/thisproject-development/webapp:latest
imagePullPolicy: Always
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: config
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: eucapi
spec:
replicas: 2
selector:
matchLabels:
app: eucapi
template:
metadata:
labels:
app: eucapi
spec:
containers:
- name: eucapi-container
image: asia.gcr.io/thisproject-development/eucapi:latest
imagePullPolicy: Always
ports:
- containerPort: 80
readinessProbe: # http:/localhost/ が 200 を返さないので要る設定
httpGet:
path: /helth
port: 80
initialDelaySeconds: 5
periodSeconds: 5
envFrom:
- configMapRef:
name: config
---
apiVersion: batch/v1
kind: Job
metadata:
name: migration-job
spec:
template:
spec:
containers:
- name: migration-job-container
image: asia.gcr.io/thisproject-development/migration:latest
envFrom:
- configMapRef:
name: config
restartPolicy: Never
backoffLimit: 5
---
apiVersion: "v1"
kind: "Service"
metadata:
name: "webapp-service"
annotations:
beta.cloud.google.com/backend-config: '{"ports": {"80":"thisproject-backend-config"}}'
spec:
type: NodePort
ports:
- name: http
protocol: "TCP"
port: 80
targetPort: 80
selector:
app: "webapp"
---
apiVersion: "v1"
kind: "Service"
metadata:
name: "eucapi-service"
annotations:
beta.cloud.google.com/backend-config: '{"ports": {"80":"thisproject-backend-config"}}'
spec:
type: NodePort
ports:
- name: http
protocol: "TCP"
port: 80
targetPort: 80
selector:
app: "eucapi"
---
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
name: cert-webapp
spec:
domains:
- __DOMAIN_WEBAPP__ # 自力書き換えする部分
---
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
name: cert-eucapi
spec:
domains:
- __DOMAIN_EUCAPI__ # 自力書き換えする部分
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: thisproject-ingress
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.global-static-ip-name: "ip-thisproject"
networking.gke.io/managed-certificates: "cert-webapp,cert-eucapi"
spec:
rules:
- host: __DOMAIN_WEBAPP__ # 自力書き換えする部分
http:
paths:
- path: /*
backend:
serviceName: webapp-service
servicePort: 80
- host: __DOMAIN_EUCAPI__ # 自力書き換えする部分
http:
paths:
- path: /*
backend:
serviceName: eucapi-service
servicePort: 80
---
# あとで「Google Cloud Armor」等を差し挟むエントリポイント
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
name: thisproject-backend-config
spec:
timeoutSec: 600
securityPolicy:
name: ""
---
# あとで追加された「集計サービス」コンテナ
apiVersion: apps/v1
kind: Deployment
metadata:
name: aggriegation
spec:
replicas: 2
selector:
matchLabels:
app: aggriegation
template:
metadata:
labels:
app: aggriegation
spec:
containers:
- name: aggriegation-container
image: asia.gcr.io/thisproject-development/aggriegation:latest
imagePullPolicy: Always
ports:
- containerPort: 50500
envFrom:
- configMapRef:
name: config
---
apiVersion: "v1"
kind: "Service"
metadata:
name: "aggriegation-service"
spec:
type: NodePort
ports:
- name: http
protocol: "TCP"
port: 50500
targetPort: 50500
selector:
app: "aggriegation"
#!/bin/sh -x
#
# 環境ごと情報をあつめ、アプリケーション用マニュフェストファイルを書き換えるスクリプト。
#
# FIXME とてつもなく急場しのぎ&ダーティーな手段である…ことは自覚しているので、洗練されたソリューションに置き換える。
# FIXME "kustomize" が有望だが…割と「ピンポイントで書き換える」に向いてないので、どうしたものか。
# 引数から値収集
CONTAINER_VERSION=${1}
CONFIGMAP_YAML_FILE=${2}
# 次に「各環境毎のk8sのConfigMapファイル」を読み出し、変数定義化する。
for param in $(grep '^ [A-Z]*' ${CONFIGMAP_YAML_FILE} | sed 's/^ *//' | grep -v '^#.*' | sed 's/#.*//' | sed 's/: /=/'); do
export ${param}
done
# kickしたディレクトリから、このスクリプトのあるディレクトリに移動。
cd $(cd $(dirname $0);pwd)
# マニフェストのyamlから「必要な部分」を書き換え。
cat ./manifest.yaml \
| sed "s/__DOMAIN_WEBAPP__/${DOMAIN_WEBAPP}/g" \
| sed "s/__DOMAIN_EUCAPI__/${DOMAIN_EUCAPI}/g" \
| sed "s/:latest/:${CONTAINER_VERSION}/g"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment