利用K8S技術棧打造我的私有云(連載之:K8S環境理解和練手)


【利用K8S技術棧打造我的私有云系列文章目錄】php

在前文中咱們已經搭建好了K8S集羣,接下來就來說述一下K8S的一些重要的概念和知識,並搞兩個例子在集羣中來實際練手感覺一把!html

注: 本文首發於 My 公衆號 CodeSheep ,可 長按掃描 下面的 當心心 來訂閱 ↓ ↓ ↓node

CodeSheep · 程序羊


K8S環境理解

kubernetes的概念很是多,組件也很多,本文主要闡述一下幾個最主要、平時用得最頻繁的概念,最詳細的學習文檔是官網教程!nginx

K8S設計架構

K8S架構

該圖描述的設計架構是一個典型的M-S架構,一主兩從,這和我搭建的集羣基本是一致的,主節點和從節點上運行哪些kube組件,其實在我搭建集羣那篇文章也已經講過了,下面來闡述一下kubernetes集羣裏的重要概念和操做命令。redis

Pod

Pod是Kubernetes中最小的管理元素,Pod是一組容器的集合,且一個Pod只能運行在一個Node上,Pod是kubernetes調度、部署、擴展的基本單位docker

  • kubectl run命令建立一個pod:kubectl run pod-example --image=nginx
  • kubectl create命令建立pod:kubectl create -f create_pod.yaml
  • 刪除pod:kubectl delete po pod名
  • 查看pod啓動狀況:kubectl get podskubectl get pods -o wide
  • 查看pod的詳細信息:kubectl discrible po pod名

Namespace

Namespace是對一組資源和對象的抽象集合,好比能夠用來將系統內部的對象劃分爲不一樣的項目組或用戶組。常見的pods, services, replication controllers和deployments等都是屬於某一個namespace的(默認是default),而node, persistentVolumes等則不屬於任何namespace。編程

  • 建立 kubectl create namespace namespace名
  • 刪除 kubectl delete namespaces namespace名
  • 查詢 kubectl get namespaces

Replication Controller(RC)

Replication Controller 保證了在全部時間內,都有特定數量的Pod副本正在運行,若是太多了,Replication Controller就殺死幾個,若是太少了,Replication Controller會新建幾個,和直接建立的pod不一樣的是,Replication Controller會替換掉那些刪除的或者被終止的pod,而無論刪除的緣由是什麼。json

其實其CURD的命令和上面都差很少,這裏不一一列出了c#

  • 建立:kubectl create -f create_rc.json
  • 查看rc啓動狀況:kubectl get rc

Service

Service 是一個定義了一組Pod的策略的抽象,能夠理解爲抽象到用戶層的一個宏觀服務。其實這個概念在Swarm集羣裏也有,能夠參照理解。api

Service的這樣一層抽象最起碼能夠抵禦兩個方面的問題:

  • Pod重啓後IP地址的變化(保持用咱們系統的客戶其IP不變)
  • 提供負載均衡能力

其CURD的命令和上面都差很少,這裏依然不一一列出

  • 建立service:kubectr create -f redis-master-service.json
  • 查看service的啓動狀況:kubectl get svc

這裏給一個Service的示例:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:  
    app: nginx
複製代碼

好了,理論的東西看多了可能有點蒙,只能多找點不一樣的材料閱讀並理解了。下面開始作幾個練手示例,這幾個例子都源自於K8S官網,對於理解理論概念很是有好處,下面開始動手吧!


關於Pod的實例練手

本例子建立一個包含兩個容器的POD,並在容器之間完成文件交換

  • yaml配置文件以下:
apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
複製代碼
  • 建立pod

kubectl create -f two-container-pod.yaml

  • 查看pod和容器的信息

kubectl get pod two-containers --output=yaml

執行完成輸出內容大體以下(通過縮減):

apiVersion: v1
kind: Pod
metadata:
  ...
  name: two-containers
  namespace: default
  ...
spec:
  ...
  containerStatuses:

  - containerID: docker://c1d8abd1 ...
    image: debian
    ...
    lastState:
      terminated:  // debian容器已中止
        ...
    name: debian-container
    ...

  - containerID: docker://96c1ff2c5bb ...
    image: nginx
    ...
    name: nginx-container
    ...
    state:
      running:  // nginx容器已運行
    ...
複製代碼

能夠看到debian容器已經中止了,nginx容器依然運行

  • 咱們進入nginx容器的/bin/bash並驗證nginx服務器

kubectl exec -it two-containers -c nginx-container -- /bin/bash

執行以下命令來安裝curl:

root@two-containers:/# apt-get update
root@two-containers:/# apt-get install curl procps
root@two-containers:/# ps aux
複製代碼

而後執行curl localhost,能夠得到輸出:

Hello from the debian container

可見debian容器中寫入的東西在nginx容器中得到了,所以文件交換也完成了

用Pod來作一件事很簡單吧!


關於RC和Service的實例練手

本示例演示的是:部署一個包含Redis集羣、基於PHP的留言板系統

  • 建立redis-master的RC

redis-master-controller.yaml內容:

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
spec:
  replicas: 1
  selector:
    name: redis-master
  template:
    metadata:
      name: redis-master
      labels:
        name: redis-master
    spec:
      containers:
      - name: redis-master
        image: kubeguide/redis-master
        ports:
        - containerPort: 6379
複製代碼

建立該RC並查看建立結果:

kubectl create -f redis-master-controller.yaml
kubectl get rc
kubectl get pods
複製代碼
  • 建立redis-master的service

redis-master-service.yaml內容:

apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    name: redis-master
複製代碼

建立該Service並查看:

kubectl create -f redis-master-service.yaml
kubectl get services
複製代碼
  • 建立redis-slave的RC

redis-slave-controller.yaml文件內容:

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-slave
spec:
  replicas: 2
  selector: # RC經過spec.selector來篩選要控制的Pod
    name: redis-slave
  template:
    metadata:
      name: redis-slave
      labels: # Pod的label,能夠看到這個label與spec.selector相同
        name: redis-slave
    spec:
      containers:
      - name: redis-slave
        image: kubeguide/guestbook-redis-slave
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 6379
複製代碼

建立該RC並查看:

kubectl create -f redis-slave-controller.yaml
kubectl get rc
kubectl get pods
複製代碼
  • 建立redis-slave的service

redis-slave-service.yaml文件內容:

apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    name: redis-slave
spec:
  ports:
  - port: 6379  
  selector:
    name: redis-slave
複製代碼

建立該Service並查看:

kubectl create -f redis-slave-service.yaml
kubectl get services
複製代碼
  • 建立frontend的RC

frontend-controller.yaml內容以下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  replicas: 3
  selector:
    name: frontend
  template:
    metadata:
      labels:
        name: frontend
    spec:
      containers:
      - name: frontend
        image: kubeguide/guestbook-php-frontend
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 80
複製代碼

建立該RC並查看

kubectl create -f frontend-controller.yaml
kubectl get rc
kubectl get pods
複製代碼
  • 建立frontend的Service

frontend-service.yaml文件內容以下:

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
  selector:
    name: frontend
複製代碼

建立該Service並查看

kubectl create -f frontend-service.yaml
kubectl get services
複製代碼
  • 訪問http://your-host:30001/

瀏覽器訪問結果

簡單的留言板系統就生成了!


後記

做者更多的SpringBt實踐文章在此:


若是有興趣,也能夠抽點時間看看做者一些關於容器化、微服務化方面的文章:


CodeSheep · 程序羊
相關文章
相關標籤/搜索