Kubernetes 編排系統

1.1.1 什麼是Kubernetes

Kubernetes (一般稱爲K8s,K8s是將8個字母「ubernete」替換爲「8」的縮寫) 是用於自動部署、擴展和管理容器化(containerized)應用程序的開源系統。Google設計並捐贈給Cloud Native Computing Foundation(今屬Linux基金會)來使用的。html

它旨在提供「跨主機集羣的自動部署、擴展以及運行應用程序容器的平臺」。它支持一系列容器工具, 包括Docker等。CNCF於2017年宣佈首批Kubernetes認證服務提供商(KCSPs),包含IBM、MIRANTIS、華爲、inwinSTACK迎棧科技等服務商。前端

1.1.2 Kubernetes發展史

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

Kubernetes v1.0於2015年7月21日發佈。隨着v1.0版本發佈,谷歌與Linux 基金會合做組建了Cloud Native Computing Foundation (CNCF)並把Kubernetes做爲種子技術來提供。python

Rancher Labs在其Rancher容器管理平臺中包含了Kubernetes的發佈版。Kubernetes也在不少其餘公司的產品中被使用,好比Red Hat在OpenShift產品中,CoreOS的Tectonic產品中, 以及IBM的IBM雲私有產品中。mysql

1.1.3 Kubernetes 特色

一、可移植: 支持公有云,私有云,混合雲,多重雲(multi-cloud)nginx

二、可擴展: 模塊化, 插件化, 可掛載, 可組合git

三、自動化: 自動部署,自動重啓,自動複製,自動伸縮/擴展github

四、快速部署應用,快速擴展應用web

五、無縫對接新的應用功能sql

六、節省資源,優化硬件資源的使用

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地址和域名來提供服務發現機制,而且以輪詢調度的方式將流量負載均衡到能與選擇器匹配的pod的IP地址的網絡鏈接上(即便是故障致使pod從一臺機器移動到另外一臺機器)。默認狀況下,一個服務會暴露在集羣中(例如,多個後端pod可能被分組成一個服務,前端pod的請求在它們之間負載平衡);可是,一個服務也能夠暴露在集羣外部(例如,從客戶端訪問前端pod)。

1.1.5 Kubernetes核心組件

Kubernetes遵循master-slave architecture。Kubernetes的組件能夠分爲管理單個的 node 組件和控制平面的一部分的組件。

Kubernetes Master是集羣的主要控制單元,用於管理其工做負載並指導整個系統的通訊。Kubernetes控制平面由各自的進程組成,每一個組件均可以在單個主節點上運行,也能夠在支持high-availability clusters的多個主節點上運行。

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

組件名稱

說明

etcd

保存了整個集羣的狀態;

apiserver

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

controller manager

負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等;

scheduler

負責資源的調度,按照預約的調度策略將Pod調度到相應的機器上;

kubelet

負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(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等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

接口層

kubectl命令行工具、客戶端SDK以及集羣聯邦

生態系統

在接口層之上的龐大容器集羣管理調度的生態系統,能夠劃分爲兩個範疇

Kubernetes外部

日誌、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等

Kubernetes內部

CRI、CNI、CVI、鏡像倉庫、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

Master、etcd、registry

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中關於flannel的key

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

Pod是K8s集羣中全部業務類型的基礎

Pod是在K8s集羣中運行部署應用或服務的最小單元,它是能夠支持多容器的。

Pod的設計理念是支持多個容器在一個Pod中共享網絡地址和文件系統。

POD控制器Deployment、Job、DaemonSet和PetSet

1.4.1 寫一個編排yaml格式

kubenetes裏面的建立service、rc、pod都是這種形式(另一種是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

   RC是K8s集羣中最先的保證Pod高可用的API對象。經過監控運行中的Pod來保證集羣中運行指定數目的Pod副本。指定的數目能夠是多個也能夠是1個;少於指定數目,RC就會啓動運行新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。

   即便在指定數目爲1的狀況下,經過RC運行Pod也比直接運行Pod更明智,由於RC也能夠發揮它高可用的能力,保證永遠有1個Pod在運行。

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的擴容和縮容

🍢 經過改變RC裏POD模塊中的鏡像版本,能夠實現POD的滾動升級。

1.6 服務(Service)

1.6.1 Service做用

RC、RS和Deployment只是保證了支撐服務的POD的數量,可是沒有解決如何訪問這些服務的問題。一個Pod只是一個運行服務的實例,隨時可能在一個節點上中止,在另外一個節點以一個新的IP啓動一個新的Pod,所以不能以肯定的IP和端口號提供服務。

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

在K8集羣中,客戶端須要訪問的服務就是Service對象。每一個Service會對應一個集羣內部有效的虛擬IP,集羣內部經過虛擬IP訪問一個服務。

在K8s集羣中微服務的負載均衡是由Kube-proxy實現的。Kube-proxy是K8s集羣內部的負載均衡器。它是一個分佈式代理服務器,在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

 Service的IP,是一個虛擬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

相關文章
相關標籤/搜索