注: 本文首發於 My 公衆號 CodeSheep ,可 長按 或 掃描 下面的 當心心 來訂閱 ↓ ↓ ↓php
【利用K8S技術棧打造我的私有云系列文章目錄】html
在前文中咱們已經搭建好了K8S集羣,接下來就來說述一下K8S的一些重要的概念和知識,並搞兩個例子在集羣中來實際練手感覺一把!node
kubernetes的概念很是多,組件也很多,本文主要闡述一下幾個最主要、平時用得最頻繁的概念,最詳細的學習文檔是官網教程!nginx
該圖描述的設計架構是一個典型的M-S架構,一主兩從,這和我搭建的集羣基本是一致的,主節點和從節點上運行哪些kube組件,其實在我搭建集羣那篇文章也已經講過了,下面來闡述一下kubernetes集羣裏的重要概念和操做命令。redis
Pod是Kubernetes中最小的管理元素,Pod是一組容器的集合,且一個Pod只能運行在一個Node上,Pod是kubernetes調度、部署、擴展的基本單位docker
kubectl run pod-example --image=nginx
kubectl create -f create_pod.yaml
kubectl delete po pod名
kubectl get pods
, kubectl get pods -o wide
kubectl discrible po pod名
Namespace是對一組資源和對象的抽象集合,好比能夠用來將系統內部的對象劃分爲不一樣的項目組或用戶組。常見的pods, services, replication controllers和deployments等都是屬於某一個namespace的(默認是default),而node, persistentVolumes等則不屬於任何namespace。json
kubectl create namespace namespace名
kubectl delete namespaces namespace名
kubectl get namespaces
Replication Controller 保證了在全部時間內,都有特定數量的Pod副本正在運行,若是太多了,Replication Controller就殺死幾個,若是太少了,Replication Controller會新建幾個,和直接建立的pod不一樣的是,Replication Controller會替換掉那些刪除的或者被終止的pod,而無論刪除的緣由是什麼。api
其實其CURD的命令和上面都差很少,這裏不一一列出了瀏覽器
kubectl create -f create_rc.json
kubectl get rc
Service 是一個定義了一組Pod的策略的抽象,能夠理解爲抽象到用戶層的一個宏觀服務。其實這個概念在Swarm集羣裏也有,能夠參照理解。bash
Service的這樣一層抽象最起碼能夠抵禦兩個方面的問題:
其CURD的命令和上面都差很少,這裏依然不一一列出
kubectr create -f redis-master-service.json
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,並在容器之間完成文件交換
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"]
kubectl create -f two-container-pod.yaml
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容器依然運行
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來作一件事很簡單吧!
本示例演示的是:部署一個包含Redis集羣、基於PHP的留言板系統
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.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-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.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-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.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/
簡單的留言板系統就生成了!