Kubernetes--初體驗

奮鬥狗發表於2020-10-25

通過簡單使用深入Kubernetes

叢集描述

​ 假如現在有一個由三臺機器搭建而成的Kubernetes叢集。三臺機器等同於三個節點。在Kubernetes中有著兩種角色master節點(即我們通常所認為的主節點)和node節點(從節點)

# 在任一一個節點上檢查叢集資訊
kubectl get nodes

# 輸出如下
NAME       STATUS     ROLES      AGE     VERSION
master     Ready      master     10m     v1.14.0
node01
node02

YAML檔案

​ 在Kubernetes中,各種資源都是通過yaml檔案來進行建立。比如,pod、rs、replicaset和deployment等。yaml的編寫區分大小寫。支援map/list的檔案進行編寫。

一個普通的yaml檔案

apiVersion: v1               #  版本資訊
kind: Pod                    #  當前要建立的資源型別,  Pod
metadata:         					 #  後設資料
  name: nginx								 #  pod的名字
  labels:                    #  pod擁有的label  ->  app: nginx
    app: nginx
spec:												 #  與pod容器相關的詳情定義
  containers:								 #  pod裡面擁有一個container,也可配置多個
  - name: nginx							 #  container name===nginx
    image: nginx						 #  所用到的映象  nginx
    ports:
    - containerPort: 80      #  配置container的埠為80

yaml檔案解釋說明

​ 編寫yaml檔案的時候要使用空格不要使用tab鍵。yaml中存在層級關係,左邊對齊表示同一層級。

#  - “空格” name這種形式的寫法表示陣列。以上為例,container屬性下有一個陣列,陣列中有 name image 和 ports
- name

深入瞭解Pod

​ 如果說操作docker的最小單元是容器,那麼和kubernetes打交道涉及到最多的就是pod

建立一個pod

​ 在叢集所在的伺服器中(任意一個節點),建立一個yaml檔案。名字可以自定義,不過一般遵循見名知意的原則。建立一個yaml檔案,名字命名為 ngxin_pod.yaml,內容如下。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80

根據 nginx_pod.yaml 檔案去建立 pod。以及相關操作。

kubectl apply/create -f nginx_pod.yaml

#  檢視pod資訊
kubectl get pods

#  pod詳情資訊
kubectl get pods -o wide

#  pod建立描述資訊,例如可檢視pod具體執行在那個節點上等詳細資訊。在對應節點上可檢視pod所對應的正在執行的容器
kubectl describe pod podName

#  刪除pod
kubectl delete -f nginx_pod.yaml

#  並且在叢集內部任意一個節點上訪問建立的pod,網路都是互通的。

ReplicationController(RC)

RC用來維護pod的數量,保證其在任意時刻都符合我們設定的預期值

​ 通過RC實現了叢集中pod的高可用,減少了手工運維工作。

have a try

一個示例yaml檔案

apiVersion: v1
kind: ReplicationController     #  kind型別選擇為  ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3                  #   指定副本數為 3
  selector:                    #   表示需要管理的pod的label,對應上面命名的 nginx
    app: nginx
  template:                    #   template表示建立  Pod的模板,用來定義Pod的相關資訊
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

​ 使用該yaml檔案,將會建立三個pod。並且每一個pod都擁有一個app:nginxlabel,同時每個Pod中都執行了一個nginx容器。當其中一個pod無法正常執行,Controller Manager能夠及時發現並根據RC的定義,去建立一個新的Pod。

​ 也可以在Pod正在執行的時候對Pod進行擴縮容

kubectl scale rc nginx --replicas=7

# 檢視 rc
kubectl get rc

# 刪除一個pod,驗證rc功能
kubectl delete pods podName

ReplicationSet(RS)

​ 隨著版本的更替,RC升級為另外一個概念:Replica Set。RS和RC的區別在於,RS支援基於集合的Label Selector。功能更為強大。

簡單示例

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: frontend
spec:
  matchLabels: 
    tier: frontend
  matchExpressions: 
    - {key:tier,operator: In,values: [frontend]}
  template:
  ...

​ 值得注意的是,一般不單獨使用ES。而是使用更高的資源物件Deployment,從而形成一整套Pod的操作流程和編排機制。無需擔心各種機制間的相容問題。

Deployment

​ Deployment相對RS和RC來說是更高等級的資源型別。我們可以隨時知道當前Pod的“部署”進度。

yaml示例

apiVersion: apps/v1
kind: Deployment               #  資源型別 Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3                  #  指定副本集數量
  selector:
    matchLabels:
      app: nginx
  template:                    #   建立pod模版
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
#  檢視  deployment
kubectl get deployment -o wide

#  更新映象版本
kubectl set image deployment nginx-deployment nginx=nginx:1.9.1

Namespace

​ 在kubernetes中,Pod屬於不同的Namespace。Namespace是一個邏輯上的概念。在建立Pod的時候可以給Pod指定Namespace

Kubernetes中有著預設的Namespace,名字為default。

#  獲取   default  下的pods
kubectl get pods

#  獲取指定Namespace下的 pods
kubectl get pods -n NamespaceName

#  獲取所有的  Namespace
kubectl get ns

建立Namespace

apiVersion: v1
kind: Namespace
metadata:
name: mns

​ 建立一個資源,指定在 mns 下

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: mns
......