Google云的平台工程

GCP(Google Cloud Platform)是Google云,为其内部(Google search、Gmail、YouTube等)和外部客户提供IaaS、PaaS以及Serverless computing等云服务的平台。

本文将带领你走进GCP,并深入体验其产品功能,感受Google云的产品设计理念以及相关架构思想。从而可以淬其精华,为我所用。本文的主要内容如下:

1. 注册Free Trial账号

云的产品体系非常庞大,注册一个GCP的Free Trial账号非常有必要。有了账号,我们可以解锁大部分GCP功能。注册不难,前往cloud.google.com按照要求注册就可以。

但有一点需要注意,在注册过程中,需要进行信用卡预授权(Authorize)300美元,这个钱试用期之后会退给你。试用期限是3个月,所以这3个月中所有的资源消耗都是免费的,当然这些资源也是有限的,不过用来运行一些demo和跑一些tutorial还是足够用了。

2.在GKE部署hello-app

2.1 根据tutorial完成hello-app的部署

这是一个Learn Tutorial,如下图所示,即它会用页面引导的方式,手把手教你怎么在GKE里面部署一个web应用。

2.2 体验autoscale

按照上面的tutorial部署完web-app之后,你会发现初始时这个deployment的replicas是3,但是过一段时间就会变成1。这是因为autoscale这个插件在搞鬼,当它检测到3个pods的CPU使用率都小于80%的时候,它就会将pods的数量从3缩容到1。

这里直接修改AutoScaler配置可能会报不能有两个AutoScaler错误,这时可以先Delete再Save就可以了。

你也可以使用kubectl get hpa来查看autoscaler情况,对于我们这个案例来说,将显示如下内容,其中minipods是2正是我们上面在console上设置的值。
NAME                 REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hello-app-hpa-ryrw   Deployment/hello-app   0%/80%    2         5         2          4h41m

其中hpa是CRD对象HorizontalPodAutoscaler,更多关于autoscale的内容可以参看autoscale文档。

2.3 更新hello-app

在这个tutorial里面,这个hello-app的代码是从github上clone下来的,在cloud shell中的路径是kubernetes-engine-samples/hello-app,这是一个非常简单的go http server,按照tutorial我们是打了一个hello-app v1的镜像,然后我们在us-west4这个Region创建了一个Artifact Repository,并把hello-app v1镜像push到这个Repository了。

现在,我们可以增加一个计数功能,打一个v2版本的新image,然后对workload进行滚动更新,其具体步骤如下:

  1. 修改kubernetes-engine-samples/hello-app/main.go代码:

var count int

func hello(w http.ResponseWriter, r *http.Request) {
    log.Printf("Serving request: %s", r.URL.Path)
    host, _ := os.Hostname()
    count++
    fmt.Fprintf(w, "Visited count: %d\n", count)
    fmt.Fprintf(w, "Version: 2.0.0\n")
    fmt.Fprintf(w, "Hostname: %s\n", host)
}
  1. 可以在本地通过go run main.go启动服务,然后运行命令curl localhost:8080测试一下改动是否ok

  2. 测试没有问题,通过下面命令重新打v2版本的docker镜像

docker build -t ${REGION}-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .

# 或者替换变量
docker build -t us-west4-docker.pkg.dev/my-second-project-398309/hello-repo/hello-app:v2 .

注意:其中REGION和PROJECT_ID这两个环境变量是在2.1的过程中设置过的,可以通过echo ${PROJECT_ID}验证一下,因为如果cloud shell重新连接的话,环境变量会丢失,需要重新设置。

  1. 将新的image上传到我们项目的repository

docker push ${REGION}-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2

# 或者替换变量
docker push us-west4-docker.pkg.dev/my-second-project-398309/hello-repo/hello-app:v2

5. 进行滚动更新(Rolling update)
在kubenetes的环境里,我们一般会通过修改yaml文件,将里面的container使用的image修改成我们上面上传的v2版本,然后kubectl apply一下,控制面会帮助我们完成更新。因为我们这个tutorial是基于GUI console的,所以我们也可以在界面上完成更新操作。具体就是点击Actions里面的Rolling update,然后将Container Image换成我们的v2版本,点击update就可以完成更新任务。


完成这些动作之后,通过访问hello-app-service暴露的公网endpoint,访问一下,如果返回页面上有统计访问计数功能,说明我们的更新是完成了。

3. 体验Terraform

3.1 基础概念

Terraform是一个IT基础架构自动化编排工具,可以用代码来管理维护IT资源。它编写了描述云资源拓扑的配置文件中的基础结构,例如虚拟机、存储账户和网络接口。也就是我们通常说的IAC(Infrastructure As Code)。
其中Provider和Resource这两个最重要的概念,我们要理解。

  1. Provider:Terraform是一个框架,它可以支撑所有的云厂商,不同的云厂商是不同的Provider。

  2. Resource:Resource是infrastructure的各类组件,可以是物理组件比如服务器,也可以是逻辑组件比如安全组等。在描述Resource block的时候,有两个String字段,它们分别表示Resource type和Resource name。比如:

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}

The resource type is google_compute_network and the name is vpc_network. The prefix of the type maps to the name of the provider. In the example configuration, Terraform manages the google_compute_network resource with the google provider. Together, the resource type and resource name form a unique ID for the resource. For example, the ID for your network is google_compute_network.vpc_network

如果想要更近一步了解provider和resource的概念,可以查看hashicorp的官方文档。如果需要查看GCP的terraform Resource定义可以查看GCP的Terraform文档。同样,华为云也有自己的Terraform指南。

接下来,让我们根据Terraform Tutorial一起体验一下其强大的IaC功能。

3.2 使用Terraform创建VPC

根据tutorial,我们要新建一个main.tf文件,首先创建VPC网络。具体内容参考tutorial

3.3 使用Terraform创建虚机

然后是创建Compute Engine虚拟机资源,具体内容参考tutorial
此时我们的main.tf内容如下:

# Create VPC network and subnet
resource "google_compute_network" "vpc_network" {
  name                    = "my-custom-mode-network"
  auto_create_subnetworks = false
  mtu                     = 1460
}

resource "google_compute_subnetwork" "default" {
  name          = "my-custom-subnet"
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-west1"
  network       = google_compute_network.vpc_network.id
}

3.4 执行Terraform

执行一般需要3步:

  1. 第一步是使用terraform init来添加必要的插件并构建.terraform目录。

  2. 第二步使用terraform plan来验证main.tf的语法是否正确,显示将要创建的资源。

  3. 第三步是使用terraform apply来实施资源的创建。

注意:因为我们使用的是free trial账号,能创建的资源非常有限,可能会出现配额不足的情况。此时,我们可以通过Quota配额管理,来查看配额使用情况。如果是配额原因的话,可以释放资源再尝试。

3.5 用Terraform创建一个可部署Web应用的环境

接下来,我们会创建一个web应用,将其部署到虚拟机。这需要我们做以下准备:

  1. 添加自定义SSH防火墙规则,可以让我们远程SSH到虚拟机。对于华为云来说,就是安全组(Security Group)

# 在原来main.tf的基础上,追加以下内容,在执行terraform apply的时候,
# 已创建的资源会被ignore,只会创建新添加的resource

# add ssh firewall rule
resource "google_compute_firewall" "ssh" {
  name = "allow-ssh"
  allow {
    ports    = ["22"]
    protocol = "tcp"
  }
  direction     = "INGRESS"
  network       = google_compute_network.vpc_network.id
  priority      = 1000
  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["ssh"]
}

使用ssh登录到flask-vm的虚拟机

  1. 构建Flask应用

  2. 创建app.py文件

  3. 写一个简单hello world http server

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_cloud():
      return 'Hello Terraform!'
    
    app.run(host='0.0.0.0')
  4. 运行python3 app.py。Flask默认为通过localhost:5000暴露服务

  5. 在虚拟机上开放5000端口
    为了执行上面的配置,我们需要在原来main.tf的基础上追加以下内容,然后执行terraform apply。

# expose 5000 port 
resource "google_compute_firewall" "flask" {
  name    = "flask-app-firewall"
  network = google_compute_network.vpc_network.id

  allow {
    protocol = "tcp"
    ports    = ["5000"]
  }
  source_ranges = ["0.0.0.0/0"]
}

# A variable for extracting the external IP address of the VM
output "Web-server-URL" {
 value = join("",["http://",google_compute_instance.default.network_interface.0.access_config.0.nat_ip,":5000"])
}

然后我们部署一个简单的Python Flask应用来验证我们的web server是否OK,至此我们整个实验也就完成了。

4. 实现GitOps形式的CICD

4.1 基本概念

Cloud build是GCP的提供的serverless CI/CD平台,可以在上面完成代码托管、构建、artifiact registry,测试和部署等ops工作。
术语 GitOps 一词由 Weaveworks 首先提出,如果说DevOps是一种理念的话,那么GitOps则是对DevOps理念的落地实践,主要是通过IaC(Infrastructure as Code)的方式将基础实施创建,CI/CD等运维动作“代码化”(比如Cloud build的配置,Terraform的配置,kubenetes的配置等),然后用Git对这些配置脚本进行管理。
因此,实现GitOps的前提条件就是我们的infrastructure要可以声明式管理(Be declaratively managed)。

4.2 实现概述

本实验的参考Tutorial,本教程使用两个 Git 代码库:

  1. app 代码库:包含应用本身的源代码

  2. env 代码库:包含 Kubernetes 部署的清单

我们将 app 代码库和 env 代码库分开,是因为它们具有不同的生命周期和用途。app 代码库的主要用户是真人,此代码库专用于特定应用。env 代码库的主要用户是自动化系统(例如 Cloud Build),并且此代码库可能由多个应用共享。env 代码库可以有多个分支,每个分支映射到特定环境。

这里为了演示,我们只有一个环境,真实场景可以有多个环境。

4.3 用Cloud Build实现GitOps CI

所谓的CI,Continuous integration refers to the build and unit testing stages of the software release process. Every revision that is committed triggers an automated build and test.
在GCP里面,是通过触发器(Trigger)来感知GIT里面提交代码的变化,然后在这个trigger上配置Cloud Build流水线配置文件:

steps:
# This step runs the unit tests on the app
- name: 'python:3.7-slim'
  id: Test
  entrypoint: /bin/sh
  args:
  - -c
  - 'pip install flask && python test_app.py -v'

# This step builds the container image.
- name: 'gcr.io/cloud-builders/docker'
  id: Build
  args:
  - 'build'
  - '-t'
  - 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/hello-cloudbuild:$SHORT_SHA'
  - '.'

# This step pushes the image to Artifact Registry
# The PROJECT_ID and SHORT_SHA variables are automatically
# replaced by Cloud Build.
- name: 'gcr.io/cloud-builders/docker'
  id: Push
  args:
  - 'push'
  - 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/hello-cloudbuild:$SHORT_SHA'

上面的脚本,实际上就是一个典型的CI流程,即测试、打镜像包、上传镜像。

4.4 用Cloud Build实现GitOps CD

所谓的CD(Continuous Delivery),简单来说就是在CI的基础上多出了deployment部署的动作,在tutorial中这个动作也是通过git代码仓库触发的。
为达此目的,我们需要新建一个代码仓,同样我们需要给这个代码仓配置一个触发器,这个触发器的作用就是在接收到新的镜像变化时,将其部署到GKE集群。然而这个触发动作,需要我们在之前CI cloudbuild.yaml后面追加以下内容,其主要职责就是将新的镜像写入CD的配置文件,并push到CD的配置代码仓,从而触发CD执行。

# This step clones the hello-cloudbuild-env repository
- name: 'gcr.io/cloud-builders/gcloud'
  id: Clone env repository
  entrypoint: /bin/sh
  args:
  - '-c'
  - |
    gcloud source repos clone hello-cloudbuild-env && \
    cd hello-cloudbuild-env && \
    git checkout candidate && \
    git config user.email $(gcloud auth list --filter=status:ACTIVE --format='value(account)')

# This step generates the new manifest
- name: 'gcr.io/cloud-builders/gcloud'
  id: Generate manifest
  entrypoint: /bin/sh
  args:
  - '-c'
  - |
     sed "s/GOOGLE_CLOUD_PROJECT/${PROJECT_ID}/g" kubernetes.yaml.tpl | \
     sed "s/COMMIT_SHA/${SHORT_SHA}/g" > hello-cloudbuild-env/kubernetes.yaml

# This step pushes the manifest back to hello-cloudbuild-env
- name: 'gcr.io/cloud-builders/gcloud'
  id: Push manifest
  entrypoint: /bin/sh
  args:
  - '-c'
  - |
    set -x && \
    cd hello-cloudbuild-env && \
    git add kubernetes.yaml && \
    git commit -m "Deploying image us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/hello-cloudbuild:${SHORT_SHA}
    Built from commit ${COMMIT_SHA} of repository hello-cloudbuild-app
    Author: $(git log --format='%an <%ae>' -n 1 HEAD)" && \
    git push origin candidate

此时我们已经将kubernetes.yaml写入hello-cloudbuild-env的candidate分支。为了执行部署动作,我们需要新建另一个触发器(Trigger),这里我们将其命名为cloudbuild-delivery.yaml,其内容如下:

# [START cloudbuild-delivery]
steps:
# This step deploys the new version of our container image
# in the hello-cloudbuild Kubernetes Engine cluster.
- name: 'gcr.io/cloud-builders/kubectl'
  id: Deploy
  args:
  - 'apply'
  - '-f'
  - 'kubernetes.yaml'
  env:
  - 'CLOUDSDK_COMPUTE_REGION=us-central1'
  - 'CLOUDSDK_CONTAINER_CLUSTER=hello-cloudbuild'

# This step copies the applied manifest to the production branch
# The COMMIT_SHA variable is automatically
# replaced by Cloud Build.
- name: 'gcr.io/cloud-builders/git'
  id: Copy to production branch
  entrypoint: /bin/sh
  args:
  - '-c'
  - |
    set -x && \
    # Configure Git to create commits with Cloud Build's service account
    git config user.email $(gcloud auth list --filter=status:ACTIVE --format='value(account)') && \
    # Switch to the production branch and copy the kubernetes.yaml file from the candidate branch
    git fetch origin production && git checkout production && \
    git checkout $COMMIT_SHA kubernetes.yaml && \
    # Commit the kubernetes.yaml file with a descriptive commit message
    git commit -m "Manifest from commit $COMMIT_SHA
    $(git log --format=%B -n 1 $COMMIT_SHA)" && \
    # Push the changes back to Cloud Source Repository
    git push origin production
# [END cloudbuild-delivery]

这样,当hello-cloudbuild-env这个代码仓接收到代码提交,就会触发部署动作,把最新的docker镜像部署到auto-pilot集群,并且可以通过service访问。一切正常的话,最后会把最新部署脚本写入production分支。

4.5 结果验证

  • 修改代码

sed -i 's/Hello Cloud Build/Hello huawei/g' app.py
  sed -i 's/Hello Cloud Build/Hello huawei/g' test_app.py
  
  sed -i 's/Hello huawei/Hello Cloud Build/g' app.py
  sed -i 's/Hello huawei/Hello Cloud Build/g' test_app.py
  • 提交变更,或者MR
    git add app.py test_app.py
    git commit -m “Hello Cloud Build”
    git push

  • 查看CICD
    https://console.cloud.google.com/cloud-build/builds

  • 查看容器部署 kubectl get pods

  • 查看service:http://34.172.165.210/

5 GKE Autopilot

可以根据创建Autopilot集群指南来创建Autopilot集群。

可以根据部署无状态负载指南来部署一个无状态应用。

我们还是选用2.1中创建的Docker镜像来部署,我们可以在Cloud Shell中创建一个deployment.yaml,其内如如下:

apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: my-app
  spec:
    replicas: 3
    selector:
      matchLabels:
        run: my-app
    template:
      metadata:
        labels:
          run: my-app
      spec:
        containers:
        - name: hello-app
          image: us-west1-docker.pkg.dev/polynomial-text-398202/hello-repo/hello-app:v1

然后使用kubectl apply -f deployment.ymal进行部署,然后用kubectl get pods查看部署情况:

NAME                      READY   STATUS    RESTARTS   AGE
my-app-7fcfbd5c8d-55jcf   1/1     Running   0          61m
my-app-7fcfbd5c8d-lrxcn   1/1     Running   0          61m
my-app-7fcfbd5c8d-wfzzz   1/1     Running   0          61m
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sandstorm 是国外一款开源的项目,是由我们熟知的开发Protocol Buffers的前谷歌工程师 Kenton Varda 创立的,旨在基本改变现有的网络应用方式,目前已被数百个技术公司使用。后续又发展了Cap'n Proto。什么是 sandstorm.io?Sandstorm 将会使你用个人服务像用手机一样的简单。使用者可以使用一个简单的APP 商店安装一些像邮箱、文件编辑、博客软件等等。没有配置文件,没有命令行;所有的东西都是通过你的浏览器完成的。换句话说,Sandstorm 不仅向使用者提供一些服务器,还会让使用者选择他所使用的软件。也就是说:使用者所有的数据都储存在一个地方,而不是零散的分落在网上 如果开发者停止运行它们,APP也不会消失APP 的开发者不会暗中侦查使用者、拿使用者做实验或者用使用者的数据进行广告宣传在此之前,只有具有高级系统管理知识的人才能使用它们的服务器,现在Sandstorm 却能使每个人都可以使用它。不仅使用简单而且很创新。我们直接在APP平台里建立了通用的功能和强有力的工具:每一个APP里都有一个安全沙盒,这样就能保证恶意APP不会损害你的服务器 Sandstorm 提供了一个统一的登录系统,因此你没必要分别进入不同的APPAPP可以很简单的整合不统一的分享模型而不是独自的运行。事实上,Sandstorm 的沙盒模型使安全分享任意APP案例成为了可能,即使APP本身并不能实现分享。APP提供了一些基础设施以供联合,这样它们就可在你的允许下安全有效的通过网络接口去发现,去互相讨论,去连接其他的服务器。作为一个私有平台,创建 Sandstorm 的真正动力在于帮助开源组织和独立开发者打造属于他们自己的Web应用。在今天较为流行的SaaS模型中,独立开发者不借助外力是不可能取得成功的。尽管这些百折不挠的人们还是在继续开发,但是有一个问题就是:他们开发 出来的软件根本不可能到达广大用户的手中。为了使低预算的软件能够成功,也为了推进开源运动的发展,用户需要在不依赖开发者的前提下运行软件,这在桌面端 和智能手机上很容易实现。但是对服务端的应用来说,这很难实现,因为不是所有人都有自己的服务器。如今的社会状况就是,只有那些有时间、金钱和相关技术的人才能拥有自己的个人主机。甚至许多技术人员都没有,因为从创建主机到管理主机是一件痛苦的事。Sandstorm 的出现正是为了解决这个问题——人人都能轻松拥有自己的个人主机。“唯一的解决之道在于人人都能拥有自己的服务器,在服务器上可以安装任何自己喜欢的应用。”目前 Sandstorm 有什么目前Sandstorm 已经在使用。它在 Github上提供公开并且可利用的资源。使用者可以自行配置或者在Sandstorm 网站上向其的服务器寻求一些帮助。处于安全原因,Sandstorm开始在APP怎么与外部世界相互作用上进行了大规模的整合并且也逐步授权一些功能,目前已经向Sandstorm提供了一些公开资源的APP。目标Sandstorm 的目标是建立一个独立的APP市场;网络电源管理系统;GPG登录系统;文档加密系统和端对端的加密系统。Sandstorm 支持联合创新,认为通过对网络APP的创新可以使每一个人更好的也更便捷的使用由他们自己控制的网络服务器。Sandstorm.io 的下一个目标就是使人们在运行个人Web App上变得更加简单。它允许用户有自己的服务器,通过一个类似App Store的界面进入,用户可以安装自己的App,就像在你的手机上安装App一样。安全问题对于传统的服务器,安装一个APP就有可能存在一个漏洞,从而就有可能遭到黑客的攻击。针对这一系列的安全问题Sandstorm开发了安全沙盒, 这一安全沙盒可以让你的信息与其他的系统进行隔离,当你需要使用其中的信息时它会向Sandstorm发出信号申请使用,从而保证使用者的信息安全。Sandstorm 是怎样工作的?Sandstorm 拥有一些和 Linux基本相似的功能板块,便于使用者更熟悉的使用。Sandstorm 希望开发的APP都有自己独立的沙盒,每一个文件都存储在一个独立的沙盒里,当一个服务器在运行的时候其他的服务器就被关闭。风险与挑战具有吸引力的开发项目都是很难的。风险之一是开发者不愿意去触碰Sandstorm,所以Sandstorm就需要有自己的开发和维持团队;其二是 Sandstorm将花费更长的时间去完成而不是去预测,所以Sandstorm就需要不仅完成现有的APP,更需要去预测更多的未来部分,如APP商店,网络电源盒子等。转载自 FreeBuf.COM 标签:Sandstorm
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值