Kubernetes管理基本教程

本文不對Kubernetes作過多介紹,直接講Kubernetes的各類YAML基本撰寫規範。 基本概念請見: http://www.infoq.com/cn/articles/Kubernetes-system-architecture-introduction
全部的Resource的定義文檔在這裏都有 http://kubernetes.io/v1.0/docs/api-reference/definitions.html 例如:你要查詢Pod聲明裏面有哪些字段,那麼頗有用. 很少廢話。html

1. 建立Container / Pod##

Kubernetes的編排基本單元是Pod,故而哪怕你只有一個Container,也要建立一個Pod來容納這個Container.nginx

apiVersion: v1
kind: Pod
metadata:
  name: hello-world # pod資源名稱,集羣unique的
spec:  # specification of the pod’s contents
  restartPolicy: Never # 運行這個容器一次,而後就結束這個pod
  containers:
  - name: hello # 只是這個container的nickname
    image: "ubuntu:14.04" # image 名, 默認使用Docker Hub
    command: ["/bin/echo","hello」,」world"]

部分解釋見上,其中command覆蓋了Docker容器的Entrypoint, Command參數(對應於Docker的Cmd)可使用args來聲明:golang

command: ["/bin/echo"]
    args: ["hello","world"]

建立pod則爲:shell

$ kubectl create -f ./hello-world.yaml --validate # 將會進行驗證而且給出WARN,可是出問題的話,依然會建立Pod,會輸出WARN信息
pods/hello-world

Container環境變量和變量展開####

apiVersion: v1
kind: Pod
metadata:
  name: hello-world
spec:  # specification of the pod’s contents
  restartPolicy: Never
  containers:
  - name: hello
    image: "ubuntu:14.04"
    env: # 這是一個環境變量
    - name: MESSAGE
      value: "hello world"
    command: ["/bin/sh","-c"] # Kubernetes並不會自動運行shell,須要手動指定
    args: ["/bin/echo \"${MESSAGE}\""] # 這是用到的環境變量展開

若是沒有shell咱們的環境變量依然能夠用$(ENVVAR)來展開。例如:ubuntu

command: ["/bin/echo"]
    args: ["$(MESSAGE)"]

##2. 查看Pod的狀態##api

$ kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
hello-world   0/1       Pending   0          0s

狀態以下:bash

unscheduled - 一開始建立POD,還沒選擇到節點來運行Pod,而後當即schedule
scheduled - Pod已經被Scheduled,準備在目標節點pull鏡像
running - 從鏡像啓動容器成功, READY列表示多少個容器正常
ExitCode:0 - 正常退出,容器再也不運行app

##3. 刪除Pod##spa

$ kubectl delete pod hello-world
pods/hello-world

或者 resource/name 格式來刪除rest

$ kubectl delete pods/hello-world
pods/hello-world

會把容器和其輸出的日誌都刪除。

##4. 建立Replication Controller## Replication Controller能夠保證『副本數量正確』的Pod在運行,下面簡稱RC/rc。下面是2副本的Nginx:

apiVersion: v1
kind: ReplicationController # 再也不是Pod
metadata:
  name: my-nginx
spec:
  replicas: 2
  template: # 這是一個PodTemplateSpec,下面聲明瞭Pod的規範
    metadata: # 無需聲明Pod名稱,由於他們由RC自動生成
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80 # 對外開放的端口

##5. 刪除Replication Controller##

$ kubectl delete rc my-nginx
replicationcontrollers/my-nginx

Label

Kubernetes使用Lable來分類、識別不一樣的資源集合,例如Pods和Replication Controllers。 咱們能夠用app這個key和nginx這個value來讀取pods和rc:

$ kubectl get pods -L app
NAME             READY     STATUS    RESTARTS   AGE       APP
my-nginx-afv12   0/1       Running   0          3s        nginx
my-nginx-lg99z   0/1       Running   0          3s        nginx
$ kubectl get rc my-nginx -L app
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR    REPLICAS   APP
my-nginx     nginx          nginx      app=nginx   2          nginx

也可使用golang的模板來獲取信息

$ kubectl get rc my-nginx -o template --template="{{.spec.selector}}"
map[app:nginx]

6. 建立Service##

下面是一個服務的yaml文件。服務是與Pod鬆耦合的。能夠自由組合。一旦建立完畢就分配一個clusterIP,而對這個clusterIP會有個簡單的load balancer.

apiVersion: v1
kind: Service
metadata:
  name: nginxsvc
  labels:
    app: nginx
spec: 
  ports:
  - port: 80 # 訪問的地址爲 http://clusterIP:80/
    protocol: TCP
  selector: # 意思是由app=nginx的pod來處理
    app: nginx

一個Service背後能夠有多個endpoints,來進行處理。

$ kubectl describe svc nginxsvc
Name:          nginxsvc
Namespace:     default
Labels:            app=nginx
Selector:      app=nginx
Type:          ClusterIP
IP:            10.0.116.146
Port:          <unnamed> 80/TCP
Endpoints:     10.245.0.14:80,10.245.0.15:80
Session Affinity:  None
No events.

$ kubectl get ep
NAME         ENDPOINTS
nginxsvc     10.245.0.14:80,10.245.0.15:80
相關文章
相關標籤/搜索