1. 程式人生 > 其它 >極客時間雲原生訓練營【網盤下載】

極客時間雲原生訓練營【網盤下載】

Download: 極客時間雲原生訓練營【網盤下載】

雲原生介紹

伴隨雲端計算的滾滾浪潮,雲原生(Cloud Native)的概念應運而生,雲原生很火,火得一塌糊塗,都9102年了,如果你還不懂雲原生,那真的Out了。

什麼是雲原生?
雲原生是一種構建和執行應用程式的方法,是一套技術體系和方法論。雲原生(CloudNative)是一個組合詞,Cloud+Native。

Cloud表示應用程式位於雲中,而不是傳統的資料中心;Native表示應用程式從設計之初即考慮到雲的環境,原生為雲而設計,在雲上以最佳姿勢執行,充分利用和發揮雲平臺的彈性+分散式優勢。

雲原生為什麼越來越重要?
未來的天下,一定是雲原生的
未來的軟體,從誕生起,就是生在雲上,長在雲上的。這個說法絕對不是沒有根據的,看看現在的網際網路大廠在做的事情,你就知道了:

Kubernetes 作為雲原生的核心平臺,吸引了越來越多的程式設計師去了解、學習、掌握它。我知道的很多人,因為會使用 Kubernetes,跳槽薪資非常不錯。

雲原生Kubernetes實戰開發

Flink on TKE 半托管服務,極致的Flink雲原生使用體驗

Flink on TKE 半托管服務提供了Flink叢集部署、日誌、監控、儲存等一站式的服務,使用者可以將其他線上業務與Flink執行在同一個叢集中,從而最大程度提高資源資源使用率,達到統一資源、統一技術棧、統一運維等能力。

我們基於 TKE 容器平臺構建 Flink Kubernetes 計算叢集。根據已有的 Flink 作業執行情況,我們發現絕大多數 Flink 作業主要是耗費記憶體,而CPU利用率普遍較低,在機型選擇上我們推薦選擇記憶體型機器。

apiVersion: flinkoperator.Kubernetes.io/v1beta1
kind: FlinkCluster
metadata:
  name: flink-hello-world
spec:
  image:
    name: flink:1.11.3
  jobManager:
    resources:
      limits:
        memory: "1024Mi"
        cpu: "200m"
  taskManager:
    replicas: 2
    resources:
      limits:
        memory: "2024Mi"
        cpu: "200m"
  job:
    jarFile: /opt/flink/examples/streaming/helloword.jar
    className: org.apache.flink.streaming.examples.wordcount.WordCount
    args: ["--input", "/opt/flink/README.txt"]
    parallelism: 2
  flinkProperties:
    taskmanager.numberOfTaskSlots: "2"

通過上述的宣告式 API 方式提交部署,我們可以看到使用者 jar 包需要事先打到 image 裡,作為平臺提供方,當然不可能讓每個使用者自己去打 docker image,有些使用者甚至都不知道怎麼用 docker,所以我們應該對使用者遮蔽 docker image,使用者只需要上傳 jar 包等資源即可。Flink Operator 提供了 initContainer 選項,藉助它我們可以實現自動下載使用者上傳資源,但是為了簡單,我們直接修改 docker entrypoint 啟動指令碼,先下載使用者上傳的資源,再啟動 Flink 相關程序,使用者上傳的資源通過環境變數宣告。例如:

apiVersion: flinkoperator.Kubernetes.io/v1beta1
kind: FlinkCluster
metadata:
  name: flink-hello-world
spec:
  image:
    name: flink:1.11.3
  envVars:
    - name: FLINK_USER_JAR
      value: hdfs://xxx/path/to/helloword.jar
    - name: FLINK_USER_DEPENDENCIES
      value: hdfs://xxx/path/to/config.json,hdfs://xxx/path/to/vocab.txt
  ...

極客時間雲原生訓練營 - Kubernetes 架構

Kubernetes 最初源於谷歌內部的 Borg,提供了面向應用的容器叢集部署和管理系統。Kubernetes 的目標旨在消除編排物理 / 虛擬計算,網路和儲存基礎設施的負擔,並使應用程式運營商和開發人員完全將重點放在以容器為中心的原語上進行自助運營。Kubernetes 也提供穩定、相容的基礎(平臺),用於構建定製化的 workflows 和更高階的自動化任務。 Kubernetes 具備完善的叢集管理能力,包括多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建負載均衡器、故障發現和自我修復能力、服務滾動升級和線上擴容、可擴充套件的資源自動排程機制、多粒度的資源配額管理能力。Kubernetes 還提供完善的管理工具,涵蓋開發、部署測試、運維監控等各個環節。

// ImageService defines the public APIs for managing images.
service ImageService {
// ListImages lists existing images.
rpc ListImages(ListImagesRequest) returns (ListImagesResponse) {}
// ImageStatus returns the status of the image. If the image is not
// present, returns a response with ImageStatusResponse.Image set to
// nil.
rpc ImageStatus(ImageStatusRequest) returns (ImageStatusResponse) {}
// PullImage pulls an image with authentication config.
rpc PullImage(PullImageRequest) returns (PullImageResponse) {}
// RemoveImage removes the image.
// This call is idempotent, and must not return an error if the image has
// already been removed.
rpc RemoveImage(RemoveImageRequest) returns (RemoveImageResponse) {}
// ImageFSInfo returns information of the filesystem that is used to store images.
rpc ImageFsInfo(ImageFsInfoRequest) returns (ImageFsInfoResponse) {}
}

極客時間雲原生訓練營 - Kubernetes叢集擴充套件

使用自定義資源擴充套件 API
自定義資源是對 Kubernetes API 的擴充套件,kubernetes 中的每個資源都是一個 API 物件的集合,例如我們在 YAML 檔案裡定義的那些 spec 都是對 kubernetes 中的資源物件的定義,所有的自定義資源可以跟 kubernetes 中內建的資源一樣使用 kubectl 操作。

TPR
假如我們要建立一個名為 cron-tab.stable.example.com 的 TPR,yaml 檔案定義如下:

apiVersion: extensions/v1beta1
kind: ThirdPartyResource
metadata:
  name: cron-tab.stable.example.com
description: "A specification of a Pod to run on a cron style schedule"
versions:
- name: v1
kind: ThirdPartyResource
apiVersion: extensions/v1beta1
metadata:
  name: d-tab.l5d.io
description: stores dtabs used by namerd
versions:
- name: v1alpha1

CRD

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  # 名稱必須符合下面的格式:<plural>.<group>
  name: crontabs.stable.example.com
spec:
  # REST API 使用的組名稱:/apis/<group>/<version>
  group: stable.example.com
  # REST API 使用的版本號:/apis/<group>/<version>
  version: v1
  # Namespaced 或 Cluster
  scope: Namespaced
  names:
    # URL 中使用的複數名稱: /apis/<group>/<version>/<plural>
    plural: crontabs
    # CLI 中使用的單數名稱
    singular: crontab
    # CamelCased 格式的單數型別。在清單檔案中使用
    kind: CronTab