kubernetes的簡介及使用教程(轉)
前言:
總結docker的時候,曾提到swarm和kubernetes,而kubbernetes在技術市場的應用上要比swarm好很多,今天准備總結下kubernetes的簡介和用法,恰好發現了<慘綠少年>博主的這篇文章,(感謝!)總結的非常好,既有簡介又有用例,就直接轉了,嘿嘿。原文地址附在文末。
PS:之前學習cobbler時似乎就看過他的博客,寫的的確很不錯,是個優秀的前輩。
1.1 Kubernetes簡介
1.1.1 什么是Kubernetes
Kubernetes (通常稱為K8s,K8s是將8個字母“ubernete”替換為“8”的縮寫) 是用於自動部署、擴展和管理容器化(containerized)應用程序的開源系統。Google設計並捐贈給Cloud Native Computing Foundation(今屬Linux基金會)來使用的。
它旨在提供“跨主機集群的自動部署、擴展以及運行應用程序容器的平台”。它支持一系列容器工具, 包括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標識中舵輪有七個輪輻就是對該項目代號的致意。
Kubernetes v1.0於2015年7月21日發布。隨着v1.0版本發布,谷歌與Linux 基金會合作組建了Cloud Native Computing Foundation (CNCF)並把Kubernetes作為種子技術來提供。
Rancher Labs在其Rancher容器管理平台中包含了Kubernetes的發布版。Kubernetes也在很多其他公司的產品中被使用,比如Red Hat在OpenShift產品中,CoreOS的Tectonic產品中, 以及IBM的IBM雲私有產品中。
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地址和域名來提供服務發現機制,並且以輪詢調度的方式將流量負載均衡到能與選擇器匹配的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