反手來個K8S入門到跑路

前言

放假前一兩天發現騰訊雲託管K8S集群上線好一陣子了, 還支持把原有主機遷入k8s集群, 索性開始搞事了.

先簡單科普一下, 什麼是k8s?

k8s 科普時間

Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.

It groups containers that make up an application into logical units for easy management and discovery.

Kubernetes builds upon 15 years of experience of running production workloads at Google,

combined with best-of-breed ideas and practices from the community. 來自:kubernetes.io/

Kubernetes是一個開源的,用於管理雲平台中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),
Kubernetes提供了應用部署,規劃,更新,維護的一種機制。

Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平台中的容器按照用戶的期望狀態運行著
(比如用戶想讓apache一直運行,用戶不需要關心怎麼去做,Kubernetes會自動去監控,然後去重啟,新建.

總之,讓apache一直提供服務),管理員可以載入一個微型服務,讓規劃器來找到合適的位置.

同時,Kubernetes也系統提升工具以及人性化方面,讓用戶能夠方便的部署自己的應用(就像canary deployments)。

-- [https://www.kubernetes.org.cn/k8s](https://www.kubernetes.org.cn/k8s)

用人話來說, 首先我們以前已經把所有的服務(server/api)都Docker容器化了,

k8s就是一套用來做容器服務管理/編排的系統.

那麼我們現在開始吧.

神說, 要有k8s.

  • 初始化自己的騰訊雲/阿里雲k8s 容器服務

登錄一下自己的某雲平台, 找一下"容器服務", 新建集群, 選"託管集群", 點點點之後完成配置.

然後把自己已有的機器加入到上面的集群裡面去, 基本也是在界面上點點點就好.

簡單科普一下k8s裡面對於機器的定義

一個機器在k8s是一個節點,節點分成兩種類型,

  • 一類是master節點, 跑著一堆k8s核心服務(etcd之類的, 具體的自己去了解吧);

  • 一類是worker節點,用於跑我們自己的業務服務(如,某個爬蟲)

一般情況下, 我們把服務扔給k8s運行起來的時候, 實際上都是在worker節點上起一個Docker容器實例 + 相關的配置.

這邊雲平台的託管集群就是master節點我們不管了, 雲平台負責好, 需要的機器和配置都給他們搞;

我們把自己的已經買過的機器或者新買的機器加入到集群裡面, 自己用就完事了.

所以....

我又來搞事了.

神說, 讓我們要開始了

等下, 上面點完了, 先把本地的kubectl搞掂.

  • 哈? 什麼是kubectl.
  • 哦, 管理k8s的命令行工具.
  • 沒有圖形界面嗎?

  • 有, 不過某雲做的很難用, 原生的湊合能看, 便於理解概念的情況下, 還是先用ctl搞起吧.

安裝教程: 通過 Kubectl 連接集群

假裝到這裡應該都弄好了.

## 輸入kubectl version 查看客戶端和服務端版本信息, 能正常輸出信息證明都work了
? codelover-blog git:(master) ? kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-18T11:37:06Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"12+", GitVersion:"v1.12.4-tke.1.1", GitCommit:"900490ac7b7ae6a13aa6599d43258f1164e9c458", GitTreeState:"clean", BuildDate:"2019-01-30T10:22:33Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}

又到概念時間 Pod/Service

  • Kubernetes Pod概述

  • Kubernetes Services概述

用人話來說,

Pod就是一堆app(一個/多個Docker容器實例)的集合;

Service就是在k8s內網壞境"對外"提供服務的一個實體;

我們直接在舉個栗子來說明一下.

  • 一個支持水平擴展的Web API服務, 我們為了高可用需要給它部署了三個實例, 這裡就是一個Pod, 由三個實例組成
  • "對外"(其他服務或者app需要訪問它)來說, 我們需要直接訪問它但是有沒必要知道它有幾個實例, 這個時候就有一個Service來承載它, Service負責把請求直接轉發到Pod中, Pod裡面有多少實例對Service和對調用者來說都是透明的.

所以我們來部署我們的第一套服務吧.

神說, 要開始入門了!

將下面的文件保存成sample.yaml, 然後執行 "kubectl apply -f sample.yaml"

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
# 給pod打上標籤, 定義service 需要用
labels:
run: first-web-size
name: first-web-size
spec:
# 實例個數
replicas: 2
selector:
matchLabels:
run: first-web-size
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
run: first-web-size
spec:
containers:
# 微軟 dotnet core 樣例鏡像
- image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
imagePullPolicy: IfNotPresent
name: first-web-size
terminationMessagePath: /dev/termination-log
livenessProbe:
httpGet:
path: /v1/health
port: 80
initialDelaySeconds: 120
periodSeconds: 30
# CPU + 內存限制
resources:
# 最高使用500m的CPU, 超過就限制CPU;最高用512M內存, 超過就炸應用
limits:
cpu: 500m
memory: 512Mi
# 要求給50m的CPU調度和128M內存才可以啟動
requests:
cpu: 50m
memory: 128Mi
# 這裡是私有鏡像倉庫需要自己配置的一下秘鑰什麼之類的, 配置過程見k8s官方文檔
# imagePullSecrets:
# - name: regcred
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: first-web-size
annotations:
# 這裡:後面的值填騰訊雲的子網id, 這樣service就在騰訊雲私有網路子網裡面有自己的 ip了
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxx
spec:
selector:
# 過濾標籤, 在上面定義pod的時候也寫了對應的label
run: first-web-size
ports:
- protocol: TCP
# service對外提供訪問的埠
port: 80
# pod的埠
targetPort: 80
type: LoadBalancer
externalTrafficPolicy: Cluster

將上面的文件保存成sample.yaml, 然後執行 "kubectl apply -f sample.yaml", 可以看到下面的Log

? _posts git:(master) ? kubectl apply -f sample.yaml
deployment.extensions/first-web-size created
service/first-web-size created
? _posts git:(master) ? kubectl get pod
first-web-size-797fb6f8cc-q79df 1/1 Running 0 68s
first-web-size-797fb6f8cc-thwm7 1/1 Running 0 68s
? _posts git:(master) ? kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
first-web-size LoadBalancer 10.3.255.248 <pending> 80:31054/TCP 101s

我們在上面可以看到, 有first-web-size這個Pod有兩個實例, 有一個Service

這個時候登錄和集群在同一個內網的伺服器上面

執行 curl 10.3.255.248 能看到對應的訪問HTML

root@VM-0-6-ubuntu:~# curl http://10.3.255.248
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width_=device-width, initial-scale=1.0" />
<title>Home Page - aspnetapp</title>

怎麼對外提供訪問等我下次分享了.

用完了要刪掉這些東西請執行 "kubectl delete -f sample.yaml"

拜...

我去做飯了.

推薦閱讀:

相关文章