Kubernetes 編排系統

慘綠少年發表於2018-03-09

1.1 Kubernetes簡介

1.1.1 什麼是Kubernetes

Kubernetes (通常稱為K8sK8s是將8個字母“ubernete”替換為“8”的縮寫) 是用於自動部署、擴充套件和管理容器化(containerized)應用程式的開源系統Google設計並捐贈給Cloud Native Computing Foundation(今屬Linux基金會)來使用的。

它旨在提供“跨主機叢集的自動部署、擴充套件以及執行應用程式容器的平臺”。它支援一系列容器工具, 包括Docker等。CNCF2017年宣佈首批Kubernetes認證服務提供商(KCSPs),包含IBMMIRANTIS、華為、inwinSTACK迎棧科技等服務商。

1.1.2 Kubernetes發展史

Kubernetes (希臘語"舵手" "飛行員") Joe BedaBrendan BurnsCraig McLuckie創立,並由其他谷歌工程師,包括Brian GrantTim Hockin進行加盟創作,並由谷歌在2014年首次對外宣佈 。它的開發和設計都深受谷歌的Borg系統的影響,它的許多頂級貢獻者之前也是Borg系統的開發者。在谷歌內部,Kubernetes的原始代號曾經是Seven,即星際迷航中友好的Borg(博格人)角色。Kubernetes標識中舵輪有七個輪輻就是對該專案代號的致意。

Kubernetes v1.02015721日釋出。隨著v1.0版本釋出,谷歌與Linux 基金會合作組建了Cloud Native Computing Foundation (CNCF)並把Kubernetes作為種子技術來提供。

Rancher Labs在其Rancher容器管理平臺中包含了Kubernetes的釋出版。Kubernetes也在很多其他公司的產品中被使用,比如Red HatOpenShift產品中,CoreOSTectonic產品中, 以及IBMIBM雲私有產品中。

1.1.3 Kubernetes 特點

1、可移植: 支援公有云,私有云,混合雲,多重雲(multi-cloud

2、可擴充套件: 模組化, 外掛化, 可掛載, 可組合

3、自動化: 自動部署,自動重啟,自動複製,自動伸縮/擴充套件

4、快速部署應用,快速擴充套件應用

5、無縫對接新的應用功能

6、節省資源,優化硬體資源的使用

1.1.4 Kubernetes規劃元件

參考文件:http://docs.kubernetes.org.cn/249.html

Kubernetes定義了一組構建塊,它們可以共同提供部署、維護和擴充套件應用程式的機制。組成Kubernetes的元件設計為鬆耦合和可擴充套件的,這樣可以滿足多種不同的工作負載。可擴充套件性在很大程度上由Kubernetes API提供——它被作為擴充套件的內部元件以及Kubernetes上執行的容器等使用。

Pod

Kubernetes的基本排程單元稱為“pod。它可以把更高階別的抽象內容增加到容器化元件。一個pod一般包含一個或多個容器,這樣可以保證它們一直位於主機上,並且可以共享資源。Kubernetes中的每個pod都被分配一個唯一的(在叢集內的)IP地址這樣就可以允許應用程式使用埠,而不會有衝突的風險。

Pod可以定義一個卷,例如本地磁碟目錄或網路磁碟,並將其暴露在pod中的一個容器之中。pod可以通過Kubernetes API手動管理,也可以委託給控制器來管理。

標籤和選擇器

Kubernetes使客戶端(使用者或內部元件)將稱為“標籤”的鍵值對附加到系統中的任何API物件,如pod和節點。相應地,“標籤選擇器”是針對匹配物件的標籤的查詢。

標籤和選擇器是Kubernetes中的主要分組機制,用於確定操作適用的元件。

例如,如果應用程式的Pods具有系統的標籤 tier ("front-end", "back-end", for example) 和一個 release_track ("canary", "production", for example),那麼對所有"back-end" "canary" 節點的操作可以使用如下所示的標籤選擇器:

 tier=back-end AND release_track=canary 

控制器

控制器是將實際叢集狀態轉移到所需叢集狀態的對帳迴圈。它通過管理一組pod來實現。一種控制器是一個“複製控制器”,它通過在叢集中執行指定數量的pod副本來處理複製和縮放。如果基礎節點出現故障,它還可以處理建立替換pod

其它控制器,是核心Kubernetes系統的一部分包括一個“DaemonSet控制器”為每一臺機器(或機器的一些子集)上執行的恰好一個pod,和一個“作業控制器”用於執行pod執行到完成,例如作為批處理作業的一部分。控制器管理的一組pod由作為控制器定義的一部分的標籤選擇器確定。

服務

Kubernetes服務是一組協同工作的pod,就像多層架構應用中的一層。構成服務的pod組通過標籤選擇器來定義。

Kubernetes通過給服務分配靜態IP地址和域名來提供服務發現機制,並且以輪詢排程的方式將流量負載均衡到能與選擇器匹配的podIP地址的網路連線上(即使是故障導致pod從一臺機器移動到另一臺機器)。預設情況下,一個服務會暴露在叢集中(例如,多個後端pod可能被分組成一個服務,前端pod的請求在它們之間負載平衡);但是,一個服務也可以暴露在叢集外部(例如,從客戶端訪問前端pod)。

1.1.5 Kubernetes核心元件

Kubernetes遵循master-slave architectureKubernetes的元件可以分為管理單個的 node 元件和控制平面的一部分的元件。

Kubernetes Master是叢集的主要控制單元,用於管理其工作負載並指導整個系統的通訊。Kubernetes控制平面由各自的程式組成,每個元件都可以在單個主節點上執行,也可以在支援high-availability clusters的多個主節點上執行。

Kubernetes主要由以下幾個核心元件組成:

元件名稱

說明

etcd

儲存了整個叢集的狀態;

apiserver

提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;

controller manager

負責維護叢集的狀態,比如故障檢測、自動擴充套件、滾動更新等;

scheduler

負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上;

kubelet

負責維護容器的生命週期,同時也負責VolumeCVI)和網路(CNI)的管理;

Container runtime

負責映象管理以及Pod和容器的真正執行(CRI);

kube-proxy

負責為Service提供cluster內部的服務發現和負載均衡;

核心元件結構圖

 

除了核心元件,還有一些推薦的Add-ons

元件名稱

說明

kube-dns

負責為整個叢集提供DNS服務

Ingress Controller

為服務提供外網入口

Heapster

提供資源監控

Dashboard

提供GUI

Federation

提供跨可用區的叢集

Fluentd-elasticsearch

提供叢集日誌採集、儲存與查詢

1.1.6 分層架構

Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示:

 

分層說明:

分層結構

說明

核心層

Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供外掛式應用執行環境

應用層

部署(無狀態應用、有狀態應用、批處理任務、叢集應用等)和路由(服務發現、DNS解析等)

管理層

系統度量(如基礎設施、容器和網路的度量),自動化(如自動擴充套件、動態Provision等)以及策略管理(RBACQuotaPSPNetworkPolicy等)

介面層

kubectl命令列工具、客戶端SDK以及叢集聯邦

生態系統

在介面層之上的龐大容器叢集管理排程的生態系統,可以劃分為兩個範疇

Kubernetes外部

日誌、監控、配置管理、CICDWorkflowFaaSOTS應用、ChatOps

Kubernetes內部

CRICNICVI、映象倉庫、Cloud Provider、叢集自身的配置和管理等

1.2 部署Kubernetes叢集

1.2.1 主機環境說明

系統版本說明

[root@k8s-master ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@k8s-master ~]# uname -r 
3.10.0-327.el7.x86_64
[root@k8s-master ~]# getenforce 
Disabled
[root@k8s-master ~]# systemctl status  firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

主機IP規劃

主機名

IP

功能

k8s-master

10.0.0.11/172.16.1.11

Masteretcdregistry

k8s-node-1

10.0.0.12/172.16.1.12

node1

k8s-node-2

10.0.0.13/172.16.1.13

node2

設定hosts解析

[root@k8s-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11   k8s-master
10.0.0.12   k8s-node-1
10.0.0.13   k8s-node-2

1.2.2 安裝軟體包

在三個節點上分別操作

[root@k8s-master ~]# yum install etcd docker kubernetes flannel  -y 
[root@k8s-node-1 ~]# yum install docker kubernetes flannel  -y 
[root@k8s-node-2 ~]# yum install docker kubernetes flannel  -y

安裝的軟體版本說明

[root@k8s-master ~]# rpm -qa  etcd docker kubernetes flannel
flannel-0.7.1-2.el7.x86_64
docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64
kubernetes-1.5.2-0.7.git269f928.el7.x86_64
etcd-3.2.11-1.el7.x86_64

1.2.3 修改配置etcd

   yum安裝的etcd預設配置檔案在/etc/etcd/etcd.conf

最終配置檔案

[root@k8s-master ~]# grep -Ev '^$|#' /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"

啟動etcd

[root@k8s-master ~]# systemctl enable etcd
[root@k8s-master ~]# systemctl start etcd

測試etcd

etcdctl set testdir/testkey0 0
etcdctl set testdir/testkey0 0
[root@k8s-master ~]# etcdctl -C http://10.0.0.11:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.11:2379
cluster is healthy

1.2.4 配置並啟動kubernetes

/etc/kubernetes/apiserver配置檔案內容

[root@k8s-master ~]#  grep -Ev '^$|#'  /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

/etc/kubernetes/config配置檔案

[root@k8s-master ~]#  grep -Ev '^$|#' /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.11:8080"

啟動服務

systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service

1.2.5 部署配置node

/etc/kubernetes/config配置檔案

[root@k8s-node-1 ~]# grep -Ev '^$|#'  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.11:8080"
[root@k8s-node-1 ~]# grep -Ev '^$|#'  /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.0.12"
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

/etc/kubernetes/config配置檔案

[root@k8s-node-2 ~]# grep -Ev '^$|#'  /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.0.0.11:8080"
[root@k8s-node-2 ~]# grep -Ev '^$|#'  /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.0.13"
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

啟動

systemctl enable kubelet.service
systemctl start kubelet.service
systemctl enable kube-proxy.service
systemctl start kube-proxy.service

master上檢視叢集中節點及節點狀態

# kubectl -s http://10.0.0.11:8080 get node
[root@k8s-master ~]# kubectl -s http://10.0.0.11:8080 get node
NAME        STATUS    AGE
10.0.0.12   Ready     49s
10.0.0.13   Ready     56s
[root@k8s-master ~]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     1m
10.0.0.13   Ready     1m

   至此Kubernetes基礎部署完成

1.2.6 Kubernetes其他安裝方法

    二進位制安裝

     kubuadm 安裝

     minikube 安裝

     ansible部署:https://github.com/gjmzj/kubeasz

1.3 建立覆蓋網路--Flannel

1.3.1 配置Flannel(所有節點操作)

安裝軟體包

yum install flannel -y

修改配置檔案

[root@k8s-master ~]# grep "^[a-Z]" /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"

1.3.2 配置etcd中關於flannelkey

Flannel使用Etcd進行配置,來保證多個Flannel例項之間的配置一致性,所以需要在etcd上進行如下配置:(‘/atomic.io/network/config’這個key與上文/etc/sysconfig/flannel中的配置項FLANNEL_ETCD_PREFIX是相對應的,錯誤的話啟動就會出錯)

配置網路範圍

etcdctl mk  /atomic.io/network/config '{ "Network": "172.16.0.0/16" }'

操作建立網路

[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "172.16.0.0/16" }'
{ "Network": "172.16.0.0/16" }

master節點操作

    systemctl enable flanneld.service 
    systemctl start flanneld.service 
    service docker restart
    systemctl restart kube-apiserver.service
    systemctl restart kube-controller-manager.service
    systemctl restart kube-scheduler.service

node節點操作

    systemctl enable flanneld.service 
    systemctl start flanneld.service 
    service docker restart
    systemctl restart kubelet.service
    systemctl restart kube-proxy.service 
    

修改配置檔案

[root@k8s-master ~]# cat  /etc/kubernetes/apiserver 
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

   至此Flannel網路配置完成

1.4 建立一個簡單的pod

PodK8s叢集中所有業務型別的基礎

Pod是在K8s叢集中執行部署應用或服務的最小單元,它是可以支援多容器的。

Pod的設計理念是支援多個容器在一個Pod中共享網路地址和檔案系統。

POD控制器DeploymentJobDaemonSetPetSet

1.4.1 寫一個編排yaml格式

kubenetes裡面的建立servicercpod都是這種形式(另外一種是json)

關於yaml參考:http://t.cn/RK0Jlwu

[root@k8s-master ~]# cat  /etc/kubernetes/apiserver 
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

1.4.2 啟動一個pod

[root@k8s-master ~]# kubectl create -f hello.yaml 
pod "hello-world" created

檢視預設namespace下的pods

[root@k8s-master ~]# kubectl get pods
NAME          READY     STATUS              RESTARTS   AGE
hello-world   0/1       ContainerCreating   0          8s

檢視pod的詳細資訊

[root@k8s-master ~]# kubectl  describe pod  hello-world 
Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath    Type       Reason        Message
  ---------    --------    -----    ----            -------------    --------   ------        -------
  4m        4m        1    {default-scheduler}      Normal         Scheduled    Successfully assigned hello-world to 10.0.0.13
  4m        1m        5    {kubelet 10.0.0.13}      Warning        FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
  3m        14s       13   {kubelet 10.0.0.13}      Warning        FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

   該錯誤的解決方法: yum install python-rhsm* -y 

獲取指定pods詳細資訊

kubectl describe pods yourpodname

獲取已執行pod狀態

kubectl get pods -o wide

下載pod-infrastructure映象包

docker tag docker.io/tianyebj/pod-infrastructure:latest registry.access.redhat.com/rhel7/pod-infrastructure:lates

1.4.3 pod其他操作

刪除pod,重新建立

[root@k8s-master ~]# kubectl delete -f hello.yaml 
pod "hello-world" deleted
[root@k8s-master ~]# kubectl create -f hello.yaml 
pod "hello-world" created

檢視狀態

[root@k8s-master ~]# kubectl get pods -o wide
NAME        READY     STATUS             RESTARTS   AGE       IP            NODE
nginx-web   1/1       ImagePullBackOff   0          1m        172.16.53.2   10.0.0.13

1.5 Replication Controller

   RCK8s叢集中最早的保證Pod高可用的API物件。通過監控執行中的Pod來保證叢集中執行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少於指定數目,RC就會啟動執行新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。

   即使在指定數目為1的情況下,通過RC執行Pod也比直接執行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有1Pod在執行。

1.5.1 簡單rc配置

[root@k8s-master ~]# kubectl get  rc

始終保證有一個在活著

更新rc檔案

[root@k8s-master ~]# kubectl replace -f  nginx.yml

   nginx.yml檔案資訊

[root@k8s-master ~]# vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-2
spec:
  restartPolicy: Never
  containers:
  - name: nginx
    image: "docker.io/nginx:latest"

對現有已建立資源直進行修改

[root@k8s-master ~]# kubectl edit rc nginx

   可以調整數量即使生效

1.5.2 rs實現灰度釋出

RS是新一代RC,提供同樣的高可用能力,區別主要在於RS後來居上,能支援更多中的匹配模式。副本集物件一般不單獨使用,而是作為部署的理想狀態引數使用。

K8S 1.2中出現的概念,是RC的升級。一般和Deployment共同使用。

 部署表示使用者對K8s叢集的一次更新操作。部署是一個比RS應用模式更廣的API物件,可以是建立一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是建立一個新的RS,然後逐漸將新RS中副本數增加到理想狀態,將舊RS中的副本數減小到0的複合操作;

   這樣一個複合操作用一個RS是不太好描述的,所以用一個更通用的Deployment來描述。

  以K8s的發展方向,未來對所有長期伺服型的的業務的管理,都會通過Deployment來管理。

   Deployment是對RC的升級,與RC的相似度超過90%。

web-rc.yaml檔案內容

[root@k8s-master ~]# cat web-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 3
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: 'mysql'
        - name: MYSQL_SERVICE_PORT
          value: '3306'

建立叢集

[root@k8s-master ~]# kubectl create -f web-rc.yaml

對叢集進行升級操作

   將叢集內容器自動升級到新版本的容器

[root@k8s-master ~]# kubectl rolling-update  myweb  -f web-rc2.yaml 

web-rc2.yaml配置檔案內容

[root@k8s-master ~]# cat web-rc2.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb-2
spec:
  replicas: 3
  selector:
    app: myweb-2
  template:
    metadata:
      labels:
        app: myweb-2
    spec:
      containers:
      - name: myweb-2
        image: kubeguide/tomcat-app:v2
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: 'mysql'
        - name: MYSQL_SERVICE_PORT
          value: '3306'

升級後的回滾

   使用新的檔案,進行升級操作可達到回滾的目的,參考:https://github.com/kubeguide/samplecode

[root@k8s-master ~]# kubectl rolling-update  myweb-2  -f web-rc.yaml 

1.5.3 rc小結

? RC裡包括完整的POD定義模板

? RC通過Label Selector機制實現對POD副本的自動控制。

? 通過改變RC裡的POD副本以實現POD的擴容和縮容

? 通過改變RCPOD模組中的映象版本,可以實現POD的滾動升級。

1.6 服務(Service

1.6.1 Service作用

RCRSDeployment只是保證了支撐服務的POD的數量,但是沒有解決如何訪問這些服務的問題。一個Pod只是一個執行服務的例項,隨時可能在一個節點上停止,在另一個節點以一個新的IP啟動一個新的Pod,因此不能以確定的IP和埠號提供服務。

要穩定地提供服務需要服務發現和負載均衡能力。服務發現完成的工作,是針對客戶端訪問的服務,找到對應的的後端服務例項。

K8叢集中,客戶端需要訪問的服務就是Service物件。每個Service會對應一個叢集內部有效的虛擬IP,叢集內部通過虛擬IP訪問一個服務。

K8s叢集中微服務的負載均衡是由Kube-proxy實現的。Kube-proxyK8s叢集內部的負載均衡器。它是一個分散式代理伺服器,在K8s的每個節點上都有一個;這一設計體現了它的伸縮性優勢,需要訪問服務的節點越多,提供負載均衡能力的Kube-proxy就越多,高可用節點也隨之增多。

1.6.2 測試service

[root@k8s-master ~]# vim myweb-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

啟動叢集

[root@k8s-master ~]# kubectl create -f myweb-svc.yaml 
service "myweb" created
[root@k8s-master ~]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1      <none>        443/TCP          6h
myweb        10.254.247.21   <nodes>       8080:30001/TCP   12s

瀏覽器訪問測試

 

1.6.3 service原理圖

 

網訪問node ip 轉到cluster ip 在進行pod 分發  rr輪詢

kubectl create -f web-svc.yaml
    [root@k8s-master ~]# kubectl get service
    
    NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   10.254.0.1      <none>        443/TCP          4h
    myweb        10.254.168.71   <nodes>       8080:30001/TCP   15s

1.6.4 K8S三種IP

型別

說明

Node IP

節點裝置的IP,如物理機,虛擬機器等容器宿主的實際IP

Pod IP

Pod IP地址,是根據docker0網格IP段進行分配的。

Cluster IP

 ServiceIP,是一個虛擬IP,僅作用於service物件,由k8s管理和分配,需要結合service port才能使用,單獨的IP沒有通訊功能,叢集外訪問需要一些修改。

1.7 部署DashBoard

參考文件:http://www.cnblogs.com/zhenyuyaodidiao/p/6500897.html

1.7.1 修改配置檔案

編輯dashboard.yaml,注意或更改以下部分:

    image: index.tenxcloud.com/google_containers/kubernetes-dashboard-amd64:v1.4.1
            args:
         -  --apiserver-host=http://10.0.0.11:8080

編輯dashboardsvc.yaml檔案:

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
targetPort: 9090

1.7.2 映象準備

在dashboard.yaml中定義了dashboard所用的映象

gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1(當然你可以選擇其他的版本)

下載地址

docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kubernetes-dashboard-amd64:v1.4.1

1.7.3 啟動dashboard

master執行如下命令:

kubectl create -f dashboard.yaml
kubectl create -f dashboardsvc.yaml

到此dashboard搭建完成

1.7.4 驗證

  命令驗證,master上執行如下命令:

[root@k8s-master ~]# kubectl get deployment --all-namespaces
NAMESPACE     NAME                          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   kubernetes-dashboard-latest   1         1         1            1           42m
[root@k8s-master ~]# kubectl get svc  --all-namespaces
NAMESPACE     NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
default       kubernetes             10.254.0.1      <none>        443/TCP          5h
default       myweb                  10.254.168.71   <nodes>       8080:30001/TCP   1h
kube-system   kubernetes-dashboard   10.254.90.78    <none>        80/TCP           41m
    [root@k8s-master ~]# kubectl get pod  -o wide  --all-namespaces
    NAMESPACE     NAME                                           READY     STATUS    RESTARTS   AGE       IP            NODE
    default       myweb-c2dfj                                    1/1       Running   0          1h        172.16.57.2   10.0.0.13
    default       myweb-h7rkb                                    1/1       Running   0          1h        172.16.76.2   10.0.0.12
    default       myweb-l48b3                                    1/1       Running   0          1h        172.16.57.3   10.0.0.13
    kube-system   kubernetes-dashboard-latest-1395490986-1t37v   1/1       Running   0          43m       172.16.76.3   10.0.0.12

1.7.5 瀏覽器訪問:http://10.0.0.11:8080/ui

 

1.7.6 銷燬應用(測試)

master上執行:

kubectl delete deployment kubernetes-dashboard-latest --namespace=kube-system
kubectl delete svc  kubernetes-dashboard --namespace=kube-system

1.8 參考文獻

 [1] http://docs.kubernetes.org.cn/227.html

 [2] http://www.cnblogs.com/zhenyuyaodidiao/p/6500830.html

相關文章