# Cityeyes to k8s Kevin(5f) A40503 0X000, ITRI ICL --- ## First idea --- ## Containerization --- ## Container-centric management --- <!-- .slide: data-transition="zoom" data-background="#FFF" --> ![image alt](https://assets.spotinst.com/app/uploads/2018/05/17182248/Kubernetes.png "kubernetes") --- ## Why do I need Kubernetes and what can it do? ---- Kubernetes has a number of features. It can be thought of as: - <span>a container platform<!-- .element: class="fragment" data-fragment-index="1" --></span> - <span>a microservices platform<!-- .element: class="fragment" data-fragment-index="2" --></span> - <span>a portable cloud platform and a lot more.<!-- .element: class="fragment" data-fragment-index="3" --></span> ---- <span> **Platform as a Service (PaaS)** <!-- .element: class="fragment" data-fragment-index="1" --></span> <span> **Infrastructure as a Service (IaaS)** <!-- .element: class="fragment" data-fragment-index="2" --></span> --- <!-- .slide: data-background="#FFF" --> ## Concepts about Kubernetes ---- ## Cluster ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/800/1*KoMzLETQeN-c63x7xzSKPw.png "few-concepts-about-kubernetes") ---- ## Persistent Volumes ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/600/1*kF57zE9a5YCzhILHdmuRvQ.png "few-concepts-about-kubernetes") ---- ## Containers ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/800/1*ILinzzMdnD5oQ6Tu2bfBgQ.png "few-concepts-about-kubernetes") ---- ## Pods ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/800/1*8OD0MgDNu3Csq0tGpS8Obg.png "few-concepts-about-kubernetes") ---- ## Deployments ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/800/1*iTAVk3glVD95hb-X3HiCKg.png "few-concepts-about-kubernetes") ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://tachingchen.com/img/kubernetes-rolling-update-with-deployment/deployment.png) ---- ### How to deploy on specific node ? ---- <!-- .slide: data-background="#FFF" --> ![image alt ](https://cdn-images-1.medium.com/max/1200/1*SlO0L1NDF85nnXoWj5SlvQ.png =750x630) --- ## Kubernetes architecture ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/1000/1*4YUmbI8KKBIuNQve8jcwJg.png "Kubernetes architecture") ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://upload.wikimedia.org/wikipedia/commons/b/be/Kubernetes.png "Kubernetes architecture") --- ## Deeplook ---- ## Components ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://i.imgur.com/At1xrGs.png "CityEyes Components") ---- <!-- .slide: data-transition="fade-in convex-out" data-background="#FFF" --> ![image alt](https://i.imgur.com/abseUxk.png "CityEyes Conatiners") --- ## Try to simplify <!-- .slide: data-background="https://i.imgflip.com/s00vb.jpg" --> ---- <!-- .slide: data-transition="fade-in convex-out" data-background="#FFF" --> ![image alt](https://i.imgur.com/p308kMF.png "Transform_samba") ---- <!-- .slide: data-transition="fade-in convex-out" data-background="#FFF" --> ![image alt](https://i.imgur.com/KA5a650.png "Transform_database") ---- <!-- .slide: data-transition="fade-in convex-out" data-background="#FFF" --> ![image alt](https://i.imgur.com/h4r5dA7.png "Transform_map") ---- ![image alt ](https://i.imgur.com/GWWwZDA.png "org_map_container") ![image alt ](https://i.imgur.com/oK7Govh.png "new_map_container") ---- <!-- .slide: data-transition="fade-in convex-out" data-background="#FFF" --> ![image alt ](https://i.imgur.com/6YnxbDC.png "Transform_deeplook") ---- ![image alt ](https://i.imgur.com/JINAk1N.png "Org_size") *** ![image alt ](https://i.imgur.com/ZUQN315.png "paas_size") ![image alt ](https://i.imgur.com/4kg4SQU.png "rabbitmq_size") ![image alt ](https://i.imgur.com/FgZ62qd.png "cityeyes_size") ---- ## Build small containers ---- <!-- .slide: data-transition="fade-in convex-out" data-background="#FFF" --> ![image alt ](https://raw.githubusercontent.com/docker-library/docs/8e31eb93a02d504d0cfe1da435aa31b377fc627d/tomcat/logo.png) ![image alt ](https://i.imgur.com/XFHFlCM.png) ---- [Kubernetes best practices: How and why to build small container images](https://www.youtube.com/watch?v=wGz_cbtCiEA) ---- ### Monolithic ![image alt ](https://cdn-1.wp.nginx.com/wp-content/uploads/2016/04/Richardson-microservices-part1-1_monolithic-architecture.png "Monolithic" =530x580) ---- <!-- .slide: data-transition="zoom" --> ### Microservices ![image alt ](https://cdn-1.wp.nginx.com/wp-content/uploads/2016/04/Richardson-microservices-part1-2_microservices-architecture.png "Microservices" =530x580) --- ## Deploy <!-- .slide: data-background="https://davidjellison.files.wordpress.com/2013/10/deploy-button.jpg" --> ---- ### Deploy ways - <span> Deploy from file(yaml) <!-- .element: class="fragment" data-fragment-index="1" --></span> - <span> Deploy from package manager <!-- .element: class="fragment" data-fragment-index="2" --></span> ---- #### Deploy from file(yaml) ---- nginx-deployment.yaml ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 ``` ---- ```shell $ kubectl create -f nginx-deployment.yaml ``` ---- ```shell NAME READY STATUS RESTARTS AGE pod/nginx-deployment-787d795c5b-9sb49 1/1 Running 0 8d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx NodePort 10.104.140.140 <none> 80:32000/TCP 8d NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 1 1 1 1 8d NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-787d795c5b 1 1 1 8d ``` ---- #### Deploy from package manager ---- <!-- .slide: data-background="#FFF" --> ![image alt ](https://cdn-images-1.medium.com/max/1600/1*eBG8XpHztwns7GR9qtz0Pg.png) ---- <!-- .slide: data-transition="zoom" data-background="#FFF" --> ![image alt ](https://avatars1.githubusercontent.com/u/15859888?s=400&v=4 "Helm") ---- <!-- .slide: data-background="#FFF" --> ![image alt ](https://www.helm.sh/assets/images/chart-illustration.png) ---- ![image alt ](https://pbs.twimg.com/media/DYvzE2CWkAMzNm3.jpg "kubeapps hub" =560x600) ---- ![image alt ](https://i.imgur.com/BNpguIZ.png) ---- ![image alt ](https://i.imgur.com/DRRFWdm.png) ---- ![image alt ](https://i.imgur.com/whJ2Pd0.png "value.yaml" =650x600) ---- ```shell $ helm install --name jenkins stable/jenkins -f values.yaml ``` ---- ```shell NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins LoadBalancer 10.106.218.56 <pending> 8080:32707/TCP 2h ``` ---- ![image alt ](https://i.imgur.com/w3zC6VV.png) --- ## <font color="green">Configure</font> <!-- .slide: data-background="http://exploreflask.com/en/latest/_images/configuration.png" --> ---- ## Configmap/Sercet ---- <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/BfJqJ3X.jpg) ---- ## Secret Example ---- ### pgadmin-secret.yaml ```yaml apiVersion: v1 kind: Secret metadata: name: pgadmin-secret namespace: default type: Opaque data: username: YWRtaW5AYWRtaW4uY29t # admin@admin.com | base64 password: YWRtaW4= # admin | base64 ``` ---- ```shell $ kubectl create -f pgadmin-secret.yaml ``` ---- ### pgadmin-deployment.yaml ```yaml ... spec: containers: - name: pgadmin image: dpage/pgadmin4 env: - name: PGADMIN_DEFAULT_EMAIL valueFrom: secretKeyRef: name: pgadmin-secret key: username - name: PGADMIN_DEFAULT_PASSWORD valueFrom: secretKeyRef: name: pgadmin-secret key: password ports: - containerPort: 80 ... ``` ---- ## Configmap Example ---- ### config.properties ### (engine - orchestrator) ```shell LogServiceURL=http\://paas\:8080/PaaS/service/REST PaasServiceURL=http\://paas\:8080/PaaS/service/REST JobServiceURL=null ##RabbitMQ Connection RabbitMQServiceHost=mq-rabbitmq RabbitMQServicePort=5672 RabbitQMServiceVHost=/ RabbitMQServiceUsername=snake_eyes RabbitMQServicePassword=123456 ##RabbitMQ Priority Settings RabbitMQAssignQueue=-1 RabbitMQPriorityEnable=TRUE PriorityRangeBound_1st=20 PriorityRangeBound_2nd=60 PriorityRangeBound_top=140 CNName=classify DefaultTaskEnginePath= LogExpiryDay=10 ... ``` ---- ```shell $ kubectl create configmap engine-classify --from-file=config.properties ``` ---- ### engine_classify.yaml ```shell ... volumes: - name: config configMap: name: engine-classify ... ``` ```shell ... volumeMounts: - name: config mountPath: /root/config.properties subPath: config.properties ... ``` ---- ### ! <!-- .slide: data-background="https://i.imgflip.com/4j4d5.jpg" --> ![image alt ](https://i.imgur.com/JIgiJ9I.png) ---- ### engine_classify.yaml <!-- .slide: data-background="https://i.imgflip.com/quwu6.jpg" --> ```shell ... volumes: - name: config configMap: name: engine-classify ... ``` ```shell ... volumeMounts: - name: config mountPath: /root/tmp_config ... ``` ```shell ... command: ["/bin/bash","-c"] args: - ln -s -f /root/tmp_config/config.properties /root/config.properties; ... ``` --- ## Volume <!-- .slide: data-background="https://i.imgflip.com/2f9cmh.jpg" --> ---- <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/sBYPQZI.png) ---- <!-- .slide: data-background="#000" --> ![image alt ](https://i.imgur.com/e7jZeGN.png) ---- <!-- .slide: data-background="#000" --> ![image alt ](https://i.imgur.com/x8LCJ2t.png) ---- ### Types of Persistent Volumes ``` - GCEPersistentDisk - AWSElasticBlockStore - AzureFile - AzureDisk - FC (Fibre Channel) - Flexvolume - Flocker - NFS - iSCSI - RBD (Ceph Block Device) - CephFS - Cinder (OpenStack block storage) - Glusterfs - VsphereVolume - Quobyte Volumes - HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster) - Portworx Volumes - ScaleIO Volumes - StorageOS ``` ---- ### One node <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/oXV3Frk.png) ---- ### Cross node <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/Hsue2QR.png) ---- ### Cross node solution <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/2ltBHJA.png) ---- ### NFS Persistent Volumes <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/BOFZMHo.png) --- <!-- .slide: data-background="https://usan.com/wp-content/uploads/2013/09/customer-self-service.jpg" --> ---- ### Service Type ---- ### ClusterIP ![image alt ](https://cdn-images-1.medium.com/max/800/1*I4j4xaaxsuchdvO66V3lAg.png =560x600) ---- ### ClusterIP Example ```yaml apiVersion: v1 kind: Service metadata: name: nfs-server spec: clusterIP: 10.100.95.27 ports: - name: nfs port: 2049 - name: mountd port: 20048 - name: rpcbind port: 111 selector: role: nfs-server ``` ---- ### NodePort ![image alt ](https://cdn-images-1.medium.com/max/800/1*CdyUtG-8CfGu2oFC5s0KwA.png =560x600) ---- ### NodePort Example ```yaml apiVersion: v1 kind: Service metadata: name: deeplook labels: app: deeplook spec: type: NodePort ports: - port: 8080 nodePort: 32010 selector: app: deeplook ``` ---- ### LoadBalancer ![image alt ](https://cdn-images-1.medium.com/max/800/1*P-10bQg_1VheU9DRlvHBTQ.png =560x600) ---- <!-- .slide: data-background="#FFF" --> | | | |-|-| |![image alt ](https://pragmaticintegrator.files.wordpress.com/2016/07/elb-icon.png)|![image alt ](https://www.servian.com/wp-content/uploads/2018/02/Cloud-Load-Balancing.png)| ---- ### Ingress ![image alt ](https://cdn-images-1.medium.com/max/1600/1*KIVa4hUVZxg-8Ncabo8pdg.png =750x580) ---- ### Ingress Example ```yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/add-base-url: "true" nginx.ingress.kubernetes.io/rewrite-target: / name: manage namespace: default spec: rules: - http: paths: - path: /media/ backend: serviceName: nginx servicePort: 80 - path: /map/ backend: serviceName: map servicePort: 80 - path: /rabbitmq backend: serviceName: mq-rabbitmq servicePort: 15672 ``` ---- [Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?](https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0) --- ## Log <!-- .slide: data-background="https://www.wur.nl/upload_mm/9/2/e/d5625cbd-9d40-4bf3-8f78-e2a352af5e9d_shutterstock_logs_a9e60c17_490x330.jpg" --> ---- ### docker log ---- ```shell $ kubectl logs nginx-deployment-86678d658d-jmbmb ``` ---- ## EFK & EFK <!-- .slide: data-background="#FFF" --> ![image alt ](https://image.slidesharecdn.com/log-elk-d3-pub-160919035739/95/experiences-in-elk-with-d3js-for-large-log-analysis-and-visualization-37-638.jpg) ---- <!-- .slide: data-background="#FFF" --> |Before Fluentd|After Fluentd| |:-:|:-:| |![image alt ](https://www.fluentd.org/images/fluentd-before.png)| ![image alt ](https://docs.fluentd.org/images/fluentd-architecture.png)| ---- ### Simplified schema of an EFK <!-- .slide: data-background="#FFF" --> ![image alt ](https://blog.ptrk.io/content/images/2018/04/elk.png =680x500) ---- ![image alt ](https://i.imgur.com/XuNqYUN.png) ---- ![image alt ](https://i.imgur.com/6Xz2rPF.png) ---- <span>docker exec -it <container> sh<!-- .element: class="fragment" data-fragment-index="1" --></span> <span> => tail -n -f <log files><!-- .element: class="fragment" data-fragment-index="2" --></span> <span> ![image alt ](https://imgflip.com/s/meme/Y-U-No.jpg)<!-- .element: class="fragment" data-fragment-index="3" --> </span> ---- ![image alt ](https://i.imgur.com/QTguh1K.png) ---- ![image alt ](https://i.imgflip.com/n9sjc.jpg) ---- ### Streaming sidecar container <!-- .slide: data-background="http://i.giphy.com/90F8aUepslB84.gif" --> ![image alt ](https://d33wubrfki0l68.cloudfront.net/c51467e219320fdd46ab1acb40867b79a58d37af/b5414/images/docs/user-guide/logging/logging-with-streaming-sidecar.png) ---- {%pdf https://static.googleusercontent.com/media/research.google.com/zh-TW//pubs/archive/45406.pdf %} ---- ```shell $ kubectl logs --tail=55 -lapp=engine-classify -c engine-classify-agent ``` ---- ![image alt ](https://i.imgur.com/7JSlDHb.png) ---- ![image alt](https://i.imgflip.com/174vmk.jpg) --- ## Deploy Deeplook <!-- .slide: data-background="https://i.imgflip.com/woiri.jpg" --> ---- ### Clone project ```shell $ git clone https://gitlab.com/Aquamars/Deeplook_k8s.git ``` ---- ### Follow: [Deeplook_k8s Deploy](https://gitlab.com/Aquamars/Deeplook_k8s/tree/master/Deploy) --- ## Initial data ---- <!-- .slide: data-background="#FFF" --> ![image alt ](https://i.imgur.com/z38hO4Q.png) --- ## Deploy Cityeyes & Paas ---- ### Deploy from code ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://i.imgur.com/fJxNVhY.png) ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://i.imgur.com/RWRlooQ.png "Deploy from code") ---- My project on private repository... ![image alt](https://i.imgflip.com/e9d70.jpg "thinking gorilla") ---- ## Use Token <!-- .slide: data-background="#FFF" --> ![image alt](https://i.imgur.com/5EMmdXQ.png "token") ---- ```shell $ git clone --single-branch -b v1.1.0 https://0123456789012345678901234567890123456789@github.com/ITRI-ICL-DivX/deeplook_cityeyes.git ``` ---- ### Container 1 (git clone project) ```yaml initContainers: - name: gitclone image: alpine/git command: ["sh","-c","rm -rf /git/* && git clone --single-branch -b v1.1.0 https://2e990ac7f19037aca1b3672ee443f597a23e2995@github.com/ITRI-ICL-DivX/deeplook_cityeyes.git && sleep 2"] volumeMounts: - name: git-repo mountPath: /git ``` ---- ### Container 2 (build project) ```yaml containers: - name: build-war image: maven:3.5.4-jdk-8-alpine command: ["sh","-c"] args: - cd /usr/src/mymaven/deeplook_cityeyes; sed -i "s|\/hot||g" ./src/main/webapp/OpenLayers/GlobleVal.js; sh /usr/src/mymaven/deeplook_cityeyes/settingScript --paas_url paas --db_url cityeyes-postgresql/postgres --samba 140.96.29.86/media/ --map_url 140.96.29.86/map/styles/osm-bright --acl_url acl:8080; mvn clean package -nsu -Dmaven.test.skip=true; cp /usr/src/mymaven/deeplook_cityeyes/target/CityEyes.war /target; while :; do sleep 2073600; done; volumeMounts: - name: maven-repo mountPath: /root/.m2 - name: git-repo mountPath: /usr/src/mymaven - name: after-build mountPath: /target ``` ---- ### Container 3 (running system) ```yaml - name: cityeyes image: tomcat:8-jre8 env: - name: CATALINA_OPTS value: "-Duser.timezone=Asia/Taipei" volumeMounts: - name: after-build mountPath: /usr/local/tomcat/webapps - name: git-repo mountPath: /repo - name: media-root mountPath: /var/www/html/ ports: - containerPort: 8080 ``` ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://i.imgur.com/RWRlooQ.png "Deploy from code") ---- ![image alt](https://i.imgflip.com/e95jl.jpg) --- # Deployment Strategies ---- ## Rolling-update <!-- .slide: data-background="https://www.cat-gifs.com/w3/Funny-Kitten-GIF-Playful-Kitty-rolling-in-a-fitness-carpet-enjoying-a-new-game-with-his-human.gif" --> ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://cloudonaut.io/images/2016/01/rolling_update-1.gif) ---- ## Canary deployment <!-- .slide: data-background="https://i.imgflip.com/2cczo7.jpg" --> ---- <!-- .slide: data-background="#FFF" --> ![image alt](http://container-solutions.com/content/uploads/2017/12/canary.gif) ---- ## Blue-Green deployment <!-- .slide: data-background="https://58generalclass.files.wordpress.com/2017/08/img_0359.jpg" --> ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://martinfowler.com/bliki/images/blueGreenDeployment/blue_green_deployments.png) --- # Can do more ---- ## Monitor <!-- .slide: data-background="#FFF" --> ![image alt](https://www.icinga.com/wp-content/uploads/2018/03/grafana-logo.png)![image alt](https://cdn.iconscout.com/icon/free/png-256/prometheus-282488.png) ---- ## Auto Deploy <!-- .slide: data-background="#FFF" --> ![image alt](https://cdn-images-1.medium.com/max/874/1*gcLMYQFhTVYabmIy7Bz-_Q.png =550x500) ---- ## Image registry <!-- .slide: data-background="#FFF" --> ![image alt](https://miro.medium.com/max/1280/1*wcGVRmWde2zYZCrnt3vwjw.png) ---- ## Manager tensorflow <!-- .slide: data-background="#FFF" --> ![image alt](https://i.imgur.com/XEJF5by.png) ---- # Service Mesh ![image alt](https://istio.io/img/logo.png =500x500) ---- # more and more... --- # DevOps ---- <!-- .slide: data-background="#FFF" --> ![image alt](https://d2myx53yhj7u4b.cloudfront.net/sites/default/files/IC-DevOps-Loop-Illustrations.jpg) ---- ![image alt](https://blogs.gartner.com/cameron_haight/files/2014/10/devopspatternsandpractices.png) --- ## References#1 [Explain the "size" and "virtual size"(issuecomment)](https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362) [Why do I need Kubernetes and what can it do?](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#why-do-i-need-kubernetes-and-what-can-it-do) [Kubernetes Objects](https://kubernetes.io/docs/concepts/#kubernetes-objects) [Container size on disk](https://docs.docker.com/v17.09/engine/userguide/storagedriver/imagesandcontainers/#container-size-on-disk) [Introduction to microservices](https://www.nginx.com/blog/introduction-to-microservices/) [Draft-vs-gitkube-vs-helm-vs-ksonnet-vs-metaparticle-vs-skaffold](https://blog.hasura.io/draft-vs-gitkube-vs-helm-vs-ksonnet-vs-metaparticle-vs-skaffold-f5aa9561f948) [Helm](https://helm.sh/) [volumes-configmap](https://kubernetes.io/docs/concepts/storage/volumes/#configmap) [types-of-persistent-volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes) ---- ## References#2 [Kubernetes Volumes](https://www.youtube.com/watch?v=VB7vI9OT-WQ&t=9s) [NFS Persistent Volumes with Kubernetes ](https://medium.com/platformer-blog/nfs-persistent-volumes-with-kubernetes-a-case-study-ce1ed6e2c266) [Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?](https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0) [EFK stack? Like ELK?](https://blog.ptrk.io/how-to-deploy-an-efk-stack-to-kubernetes/) [using-a-sidecar-container-with-the-logging-agent](https://kubernetes.io/docs/concepts/cluster-administration/logging/#using-a-sidecar-container-with-the-logging-agent) [Design patterns for container-based distributed systems](https://static.googleusercontent.com/media/research.google.com/zh-TW//pubs/archive/45406.pdf) [kubernetes-best-practices](https://speakerdeck.com/thesandlord/kubernetes-best-practices) ---- ## References#3 [creating-a-personal-access-token-for-the-command-line](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) [Blue/Green Deployment, Rolling update and Canary Deployment](https://www.jianshu.com/p/022685baba7d) [Hahow blue green deployment](https://tech.hahow.in/%E6%B7%BA%E8%AB%87-hahow-%E8%97%8D%E7%B6%A0%E9%83%A8%E7%BD%B2-1c99d42336a9) [Deployment Strategies](https://container-solutions.com/deployment-strategies/) [BlueGreenDeployment](https://martinfowler.com/bliki/BlueGreenDeployment.html) [istio](https://github.com/istio/istio) [service-mesh-istio](http://www.inwinstack.com/zh/2018/01/12/service-mesh-istio/) [devops](https://www.smartsheet.com/devops) [Getting Your Arms Around DevOps](https://blogs.gartner.com/cameron_haight/2014/10/13/getting-your-arms-around-devops-devops-patterns-and-practices/) --- # The End <!-- .slide: data-background="https://i.makeagif.com/media/3-20-2015/9ttdrX.gif" -->
{"metaMigratedAt":"2023-06-14T17:23:57.558Z","metaMigratedFrom":"YAML","title":"Cityeyes to k8s","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","description":"Kevin(5f)A405030X000, ITRI ICL","contributors":"[{\"id\":\"1243785e-0704-4596-839d-0e4e3f26a70a\",\"add\":48407,\"del\":25464}]"}
    1105 views