Kubernetes入門

 

Kubernetes入門

1、Kubernetes是什麼

  首先,它是一個全新的基於容器技術的分佈式架構領先方案。這個方案雖然還很新,可是它是谷歌十幾年依賴大規模應用容器技術的經驗積累和昇華的一個重要成果。實現資源管理的自動化,以及跨多個數據中心的資源利用率的最大化。java

  其次,若是咱們的系統設計遵循了Kubernetes的設計思想,那麼傳統系統架構中那些和業務沒有多大關係的底層代碼或功能模塊,均可以馬上從咱們的視線消失,咱們沒必要再費心於負載均衡器和部署實施問題,沒必要再考慮引用或本身開發一個複雜的服務治理框架,沒必要再頭疼於服務監控和故障處理模塊的開發。使用Kubernets提供的解決方案,咱們僅節省了很多於30%的開發成本,同時能夠將精力更加集中於業務自己,並且因爲Kubernetes提供了強大的自動化機制,因此係統後期的運維難度和運維成本大幅度下降。node

  而後,Kubernetes是一個開發的開發平臺。沒有限定任何編程接口,因此不管是Java、Go、C++仍是用Python編寫的服務,均可以毫無困難地映射爲Kubernetes的Service,並經過標準的TCP通訊協議進行交互。此外,因爲Kubernetes平臺對現有的編程語言、編程框架、中間價沒有任何侵入性,所以現有的系統很容器改造升級並遷移到Kubernetes平臺上。python

  最後,Kubernetes是一個完備的分佈式系統支撐平臺,Kubernetes具備完備的集羣管理能力,包括多層次的安全防禦和准入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建智能負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和在線擴容能力、可擴展的資源自動調度機制,以及多粒度的資源配額管理能力。同時,Kubernetes提供了完善的管理工具,這些工具涵蓋了包括開發、部署測試、運維監控在內的各個環節。所以Kubernetes是一個全新的基於容器技術的分佈式架構解決方案,而且是一個一站式的完備的分佈式系統開發和支撐平臺。mysql

2、爲何要用Kubernetes

  使用Kubernetes的理由不少,最根本的一個理由就是:IT歷來都是一個由新技術驅動的行業。linux

  Docker這個新興的容器化技術當前已經被不少公司所採用,其從單機走向集羣已成爲必然,而云計算的蓬勃發展正在加速這一進程。Kubernetes做爲當前惟一被業界普遍承認和看好的Docker分佈式系統解決方案,能夠預見,在將來幾年內,會有大量的新系統選擇它,無論這些系統是運行在企業本地服務器仍是被託管到公有云上。web

  使用Kubernetes又會收穫哪些好處呢?sql

  首先,最直接的感覺就是咱們能夠"輕裝上陣"地開發複雜系統了。在採用Kubernetes解決方案以後,只須要一個精悍的小團隊就能輕鬆應對。在這個團隊裏,一名架構師專一於系統"服務組件"的提煉,幾名開發工程師專一於業務代碼的開發,一名系統兼運維工程師負責Kubernetes的部署和運維,今後不再用"996",這並非由於咱們少作了什麼,而是由於Kubernetes已經幫咱們作了不少。docker

  其次,使用Kubernetes就是在全面擁抱微服務架構。微服務架構的核心是將一個巨大的單體應用分解爲不少小的互相鏈接的微服務,一個微服務背後可能有多個實例副本在支撐,副本的數量可能會雖社系統的負荷變化而進行調整,內嵌的負載均衡器在這裏發揮了重要做用。微服務架構使得每一個服務均可以由專門的開發團隊開發,開發者能夠自由選擇開發技術,這對於大規模團隊來講頗有價值,另外每一個微服務獨立開發、升級、擴展,所以系統具有很高的穩定性和快速迭代進化能力。谷歌、亞馬遜、eBay,等國內大廠也都採用了微服務架構,這次谷歌更是將微服務架構的基礎設施直接打包到Kubernetes解決方案中,讓咱們有機會直接應用微服務架構解決複雜業務的架構問題。數據庫

  而後,咱們的系統能夠隨時隨地總體"搬遷"到公有云上。Kubernetes最初的目標就是運行在谷歌自家的公有云GCE中,將來會支持更多的公有云及是基於Openstack的私有云。同時,在Kubernetes的架構方案中,底層網絡的細節徹底被屏蔽,基於服務的Cluster IP甚至都無須咱們改變運行期的配置文件,就能將系統從物理機環境中無縫遷移到公有云中,或者在服務高峯期將部分服務對應的Pod副本放入公有云中以提高系統的吞吐量,不只節省了公司的硬件投入,還大大改善了客戶體驗。編程

  最後,Kubernetes系統架構具有了超強的橫向擴容能力。對於互聯網公司來講,用戶規模就等價於資產,誰擁有更多的用戶,就能在競爭中勝出。所以超強的橫向擴容能力是互聯網業務系統的關鍵指標之一。不用修改代碼,一個Kubernetes集羣便可從只包含幾個Node的小集羣平滑擴展到上百個Node的大規模集羣,咱們利用Kubernetes提供的工具,甚至能夠在線完成集羣擴容。只要咱們的微服務設計得好,結合硬件或公有云資源的線性增長,系統就可以承受大量用戶併發訪問帶來的的巨大壓力。

3、用一個簡單實例介紹Kubernetes

一、環境準備

  首先,咱們開始準備Kubernetes的安裝和相關鏡像下載,此次我使用的是一臺物理機做爲學習環境,而且直連外網。

[root@宿主機-192.168.0.155]$export:>uname -r
3.10.0-862.11.6.el7.x86_64
[root@宿主機-192.168.0.155]$export:>cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@宿主機-192.168.0.155]$export:>free -m
              total        used        free      shared  buff/cache   available
Mem:          31996         335       30840           8         820       31268
Swap:         16383           0       16383
[root@宿主機-192.168.0.155]$export:>

(1) 關閉Centos自帶的防火牆服務;


[root@宿主機-192.168.0.155]$export:>systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@宿主機-192.168.0.155]$export:>systemctl stop firewalld 

(2) 安裝etcd和Kubernetes軟件(會自動安裝Docker軟件):

[root@宿主機-192.168.0.155]$export:>yum install -y etcd kubernetes
[root@宿主機-192.168.0.155]$export:>kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} 

 (3) 按順序啓動全部的服務:

[root@宿主機-192.168.0.155]$export:>systemctl start etcd
[root@宿主機-192.168.0.155]$export:>systemctl start docker
[root@宿主機-192.168.0.155]$export:>systemctl start kube-apiserver
[root@宿主機-192.168.0.155]$export:>systemctl start kube-controller-manager
[root@宿主機-192.168.0.155]$export:>systemctl start kube-scheduler
[root@宿主機-192.168.0.155]$export:>systemctl start kubelet
[root@宿主機-192.168.0.155]$export:>systemctl start kube-proxy
[root@宿主機-192.168.0.155]$export:>

 到這裏,這個單機版的Kubernetes集羣環境就安裝啓動完成了。

接下來,咱們能夠在這個單機版的Kubernetes集羣中上手練習了。

二、一個簡單的Java web應用

  這個例子比較簡單,須要啓動2個容器:Web App容器和MySQL容器,而且Web App容器須要訪問MySQL容器。運行在Tomcat裏的Web App,JSP頁面經過JDBC直接訪問MySQL數據庫並展現數據。爲了演示和簡化的目的,只要程序正確鏈接到了數據庫上,它就會自動完成對應的Table的建立與初始化數據的準備工做。因此,當咱們經過瀏覽器訪問此應用時,就會顯示一個表格的頁面,數據則來自數據庫。

三、啓動MySQL服務

  首先做爲MySQL服務建立一個RC定義文件: myslq-rc.yaml,下面給出了該文件的完整內容和解釋:

在Kunbernetes集羣中,你只須要爲須要擴容的Service關聯的Pod建立一個RC(Replication Controller),則該Service的擴容以致於後來的Service升級等頭疼問題都迎刃而解。在一個RC定義文件中包括如下3個關鍵信息:
  (1)目標Pod的定義。
  (2)目標Pod須要運行的副本數量(Replicas)。
  (3)要監控的目標Pod標籤(Label)。
在建立好RC(系統將自動建立好Pod)後,Kubernetes會經過RC中定義的Label刷選出對應的Pod實例並實時監控其狀態和數量,若是實例數量少於定義的副本數量(Replicas),則會根據RC定義的Pod模塊來建立一個新的Pod,而後將此Pod調度到合適的Node上啓動運行,直到Pod實例的數量達到預約的目標。這個過程徹底是自動化的,無須人工干預。有了RC,服務的擴容就變成了一個純粹的簡單數字遊戲了,只要修改RC中的副本數量便可。後續的Service升級也將經過修改RC來自動完成。
apiVersion: v1  #指定api版本,此值必須在kubectl apiversion中
kind: ReplicationController  #指定建立資源的類型或者角色,這裏是副本控制器 RC
metadata: #資源的元數據/屬性
  name: mysql  #資源的名字,在同一個namespace中必須惟一,這裏的名字是RC
spec: #specification of the resource content 指定該資源的內容
 replicas: 1  #Pod副本期待數量
 selector:
 app: mysql  #經過這個標籤找到生產的Pod
 template:    #根據此模版建立Pod的副本(實例)
 metadata:
 labels: #設定資源的標籤 
 app: mysql  #Pod副本擁有的標籤,對應RC的selector中app: mysql
 spec:
 containers:   #Pod內容器的定義部分
 - name: mysql   #容器的名稱
 image: mysql  #容器對應的Docker Image
 ports:
 - containerPort: 3306 #容器應用監聽的端口號
 env: #注入容器內的環境變量
 - name: MYSQL_ROOT_PASSWORD
 value: "123456"

  yaml定義文件中的

  • kind屬性,用來表示此資源對象的類型,好比這裏的值爲"ReplicationController"表示這是一個RC;
  • spec一節中是RC的相關屬性定義,好比spec.selector是RC的Pod標籤(Label)選擇器,即監控和管理擁有這些標籤的Pod實例,確保當前集羣上始終有且僅有relicas個Pod實例在運行這裏咱們設置replicas=1表示只能運行一個MySQL Pod實例;
  • 當集羣中運行的Pod數量小於replicas時,RC會根據spec.template一節中定義的Pod模版來生成一個新的Pod實例,spec.template.metadata.labels指定了該Pod的標籤,須要特別注意的是:這裏的labels必須匹配以前的spec.selector,不然RC每次建立了一個沒法匹配Label的Pod,就會不停地嘗試建立新的額Pod,最終陷入"爲他人做嫁衣裳"的悲慘世界中,永無翻身之時。

json格式化,便於人閱讀:

{ apiVersion: 'v1',
  kind:'ReplicationController',
  metadata: { name: 'mysql' },
  spec: 
   { replicas: 1,
     selector: { app: 'mysql' },
     template: { metadata: { labels: { app: 'mysql' } } },
     spec: 
      { containers: 
         [ { name: 'mysql',
             image: 'mysql',
             ports: [ { containerPort: 3306 } ],
             env: [ { name: 'MYSQL_ROOT_PASSWORD', value: '123456' } ] } ] } } }

   建立好 mysql-rc.yaml文件後,爲了將它發佈到kubernetes集羣中,咱們在Master節點執行命令:

[root@宿主機-192.168.0.155]$export:>kubectl create -f mysql-rc.yaml 

結果報錯了。。。

error: error validating "mysql-rc.yaml": error validating data: [found invalid field app for v1.ReplicationControllerSpec, found invalid field containers for v1.ReplicationControllerSpec, found invalid field image for v1.ReplicationControllerSpec, found invalid field labels for v1.ReplicationControllerSpec, found invalid field metadata for v1.ReplicationControllerSpec, found invalid field spec for v1.ReplicationControllerSpec, found invalid field value for v1.ReplicationControllerSpec, found invalid field env for v1.ReplicationControllerSpec, found invalid field ports for v1.ReplicationControllerSpec]; if you choose to ignore these errors, turn validation off with --validate=false 

從拋出的錯誤上看,應該是格式的問題,在yaml裏面,結構經過縮進來表示,yaml不支持製表符tab縮進,而使用空格縮進。

[root@宿主機-192.168.0.155]$export:>kubectl create -f mysql-rc.yaml 
replicationcontroller "mysql" created

Kubernetes 經過template來生成pod,建立完後模板和pod就沒有任何關係了,rc經過 labels來找對應的pod,控制副本。

接下來,咱們用kubectl命令查看剛剛建立的RC:

[root@宿主機-192.168.0.155]$export:>kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         0         0         3m
[root@localhost export]# kubectl get pods
No resources found.
[root@localhost export]# 

 以前的環境沒有了,從新建立了新環境,繼續寫博客。

[root@localhost export]# kubectl describe rc
Name:		mysql
Namespace:	default
Image(s):	mysql
Selector:	app=mysql
Labels:		app=mysql
Replicas:	0 current / 1 desired
Pods Status:	0 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen	LastSeen	Count	From				SubObjectPath	Type		Reason		Message
  ---------	--------	-----	----				-------------	--------	------		-------
  44m		34s		24	{replication-controller }			Warning		FailedCreate	Error creating: No API token found for service account "default", retry after the token is automatically created and added to the service account
[root@localhost export]# 

[root@localhost export]# vim /etc/kubernetes/apiserver
 KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuot"
去除KUBE_ADMISSION_CONTROL中的SecurityContextDeny,ServiceAccount, KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota" [root@localhost export]# systemctl restart kube-apiserver.service [root@localhost export]#

  以後從新建立RC

[root@localhost export]# kubectl create -f mysql-rc.yaml
Error from server (AlreadyExists): error when creating "mysql-rc.yaml": replicationcontrollers "mysql" already exists
以前建立的rc,須要刪除掉,咱們如今來刪除
[root@localhost export]# kubectl delete -f mysql-rc.yaml
replicationcontroller "mysql" deleted
發佈到kubernetes集羣,從新建立RC
[root@localhost export]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
查看RC [root@localhost export]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 0 7s
查看Pod [root@localhost export]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-v48vn 0/1 ContainerCreating 0 11s

  最後,咱們建立一個與之關聯的 Kubernetes Service——MySQL的定義文件。

[root@localhost export]# vim mysql-svc.yaml 
 apiVersion: v1
 kind: Service
 metadata:
   name: mysql
 spec:
   ports:
     - port: 3306
   selector:
     app: mysql

  其中,metadata.name是Service的服務名(ServiceName): port屬性則定義了Service的虛端口;spec.selector肯定了哪些Pod副本(實例)對應到本服務。相似地,咱們經過kubectl create 命令建立Service對象。

  運行 kubectl命令,建立service:

[root@localhost export]# kubectl create -f mysql-svc.yaml 
service "mysql" created

   運行 kubectl 命令,能夠查看到剛剛建立的service:

[root@localhost export]# kubectl get rc,svc
NAME       DESIRED   CURRENT   READY     AGE
rc/mysql   1         1         0         6m
NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
svc/kubernetes   10.254.0.1               443/TCP    1h
svc/mysql        10.254.206.115           3306/TCP   9s

  注意到MySQL服務被分配了一個值爲10.254.206.115的Cluster IP地址,這是一個虛地址,隨後,Kubernetes集羣中其餘新建立的Pod就能夠經過Service的Cluster IP+ 端口號3306來鏈接和訪問它了。

  在一般狀況下,Cluster IP 是在Service建立後,由Kubernetes 系統自動分配的,其餘Pod沒法預先知道某個Service的Cluster IP地址,所以須要一個服務發現機制來知道這個服務。爲此,最初時,Kubernetes巧妙地使用率Linux環境變量來解決這個問題。如今咱們只須要知道,根據Service的惟一名字,容器能夠從環境變量中獲取到Service對應的Cluster IP 地址和端口,從而發起 TCP/IP 鏈接請求了。

三、啓動Tomcat應用

  上面咱們定義和啓動了Mysql服務,接下來咱們採用一樣的步驟,完成Tomcat應用的啓動過程。首先,建立對應的 RC 文件 myweb-rc.yaml,內容以下:

[root@localhost export]# vim myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
 #Pod的數量
  replicas: 2
  #spec.selector與spec.template.metadata.labels,這兩個字段必須相同,不然下一步建立RC會失敗。
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
 #容器組的定義     spec:
      containers:
 #容器名稱         - name: myweb
 #容器對應的鏡像           image: kubeguide/tomcat-app:v1
          ports:
 #在8080端口上啓動容器進程,PodIP與容器端口組成Endpoint,表明着一個服務進程對外通訊的地址           - containerPort: 8080
          env:
 #此處若是在未安裝域名解析的狀況下,會沒法將mysql對應的IP解析到env環境變量中,所以先註釋掉!         # - name: MYSQL_SERVICE_HOST
        #   value: 'mysql'
        # - name: MYSQL_SERVICE_PORT
        #   value: '3306'

   注意,Tomcat容器內,應用將使用環境變量 MYSQL_SERVICE_HOST 的值鏈接MySQL服務。更安全可靠的用法是使用服務的名稱 "mysql", 運行下面的命令,完成RC的建立和驗證工做。

[root@localhost export]# kubectl create -f myweb-rc.yaml 
replicationcontroller "myweb" created
[root@localhost export]# kubectl get pods 
NAME          READY     STATUS              RESTARTS   AGE
mysql-v48vn 0/1 ContainerCreating 0 27m
myweb-kfds8 0/1 ContainerCreating 0 7s myweb-v4xsq 0/1 ContainerCreating 0 7s 

   最後,建立對應的Service。如下是完整的yaml定義文件:

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

   type=NodePort 和 nodePort=30001 的兩個屬性,表型此 Service開啓了 NodePort方式的外網訪問模式,在Kubernetes集羣以外,好比在本機的瀏覽器裏,能夠經過 30001 這個端口訪問myweb(對應 8080 的虛端口上)。

  運行 kubectl create 命令進行建立。

[root@localhost ~]# kubectl create -f /export/myweb-svc.yaml 
service "myweb" created
[root@localhost ~]# kubectl get service 
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1               443/TCP          2h
mysql        10.254.206.115           3306/TCP         46m
myweb        10.254.103.161          8080:30001/TCP   27s
[root@localhost ~]# 

   至此,咱們的第1個Kubernetes 例子搭建完成了。

五、經過瀏覽器訪問網頁

  通過上面的幾個步驟,咱們終於成功實現了 Kubernetes 上第1個例子的部署搭建工做,如今一塊兒見證成果吧,在你的筆記本上打開瀏覽器,輸入http://虛擬機 IP:30001/demo/。

  訪問失敗!咱們看看怎麼回事。

  首先確認關閉防火牆:

systemctl disable firewalld
systemctl stop firewalld

   看看本地telnet 端口試試:

[root@localhost ~]# kubectl describe svc myweb 
Name:			myweb
Namespace:		default
Labels:			
Selector:		app=myweb
Type:			NodePort
IP:			10.254.103.161
Port:			8080/TCP
NodePort:		30001/TCP
Endpoints:		
Session Affinity:	None
No events.
[root@localhost ~]# telnet 10.254.103.161 8080 
Trying 10.254.103.161...
telnet: connect to address 10.254.103.161: Connection refused
[root@localhost ~]# 
[root@localhost ~]# kubectl get pods 
NAME          READY     STATUS              RESTARTS   AGE
mysql-v48vn   0/1       ContainerCreating   0          1h
myweb-kfds8   0/1       ContainerCreating   0          47m
myweb-v4xsq   0/1       ContainerCreating   0          47m
[root@localhost ~]# 

 看到 pods 一直處於ContainerCreating狀態,開始查找緣由,執行以下命令:

[root@localhost ~]# kubectl describe pod myweb-kfds8
Name:		myweb-kfds8
Namespace:	default
Node:		127.0.0.1/127.0.0.1
Start Time:	Thu, 27 Dec 2018 19:30:02 +0800
Labels:		app=myweb
Status:		Pending
IP:		
Controllers:	ReplicationController/myweb
Containers:
  myweb:
    Container ID:		
    Image:			kubeguide/tomcat-app:v1
    Image ID:			
    Port:			8080/TCP
    State:			Waiting
    Reason:			ContainerCreating
    Ready:			False
    Restart Count:		0
    Volume Mounts:		
    Environment Variables:	
Conditions:
  Type		Status
  Initialized 	True 
  Ready 	False 
  PodScheduled 	True 
No volumes.
QoS Class:	BestEffort
Tolerations:	
Events:
  FirstSeen	LastSeen	Count	From			SubObjectPath	Type		Reason		Message
  ---------	--------	-----	----			-------------	--------	------		-------
  49m		49m		1	{default-scheduler }			Normal		Scheduled	Successfully assigned myweb-kfds8 to 127.0.0.1
  49m		3m		14	{kubelet 127.0.0.1}			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)"

  49m	12s	216	{kubelet 127.0.0.1}		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\""
[root@localhost ~]# 

   其中 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)"

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 *rhsm*
  試了還不行
方法二:
  1. wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
  2. rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem 
  3. 前兩個命令會生成/etc/rhsm/ca/redhat-uep.pem文件.
  4. docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
[root@localhost ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ... latest: Pulling from registry.access.redhat.com/rhel7/pod-infrastructure
26e5ed6899db: Downloading [===================> ] 24.79 MB/63.82 MB 66dbe984a319: Download complete 26e5ed6899db: Downloading [===================> ] 25.31 MB/63.82 MB 26e5ed6899db: Pull complete 66dbe984a319: Pull complete 9138e7863e08: Pull complete Digest: sha256:92d43c37297da3ab187fc2b9e9ebfb243c1110d446c783ae1b989088495db931 Status: Downloaded newer image for registry.access.redhat.com/rhel7/pod-infrastructure:latest
[root@localhost ~]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
mysql-v48vn   1/1       Running   0          2h
myweb-kfds8   1/1       Running   0          2h
myweb-v4xsq   1/1       Running   0          2h
[root@localhost ~]# kubectl describe pods myweb-v4xsq
Name:		myweb-v4xsq
Namespace:	default
Node:		127.0.0.1/127.0.0.1
Start Time:	Thu, 27 Dec 2018 19:30:02 +0800
Labels:		app=myweb
Status:		Running
IP:		172.17.0.3
Controllers:	ReplicationController/myweb
Containers:
  myweb:
    Container ID:		docker://38b74cadef264969792845b6278f1421fed96bdfb1554d3a8c325c4fa07bca3e
    Image:			kubeguide/tomcat-app:v1
    Image ID:			docker-pullable://docker.io/kubeguide/tomcat-app@sha256:7a9193c2e5c6c74b4ad49a8abbf75373d4ab76c8f8db87672dc526b96ac69ac4
    Port:			8080/TCP
    State:			Running
      Started:			Thu, 27 Dec 2018 21:12:05 +0800
    Ready:			True
    Restart Count:		0
    Volume Mounts:		
    Environment Variables:	
Conditions:
  Type		Status
  Initialized 	True 
  Ready 	True 
  PodScheduled 	True 
No volumes.
QoS Class:	BestEffort
Tolerations:	
Events:
  FirstSeen	LastSeen	Count	From			SubObjectPath		Type		Reason			Message
  ---------	--------	-----	----			-------------		--------	------			-------
  1h		51m		2	{kubelet 127.0.0.1}				Warning		MissingClusterDNS	kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  51m		51m		1	{kubelet 127.0.0.1}	spec.containers{myweb}	Normal		Pulled			Successfully pulled image "kubeguide/tomcat-app:v1"
  51m		51m		1	{kubelet 127.0.0.1}	spec.containers{myweb}	Normal		Created			Created container with docker id 38b74cadef26; Security:[seccomp=unconfined]
  51m		51m		1	{kubelet 127.0.0.1}	spec.containers{myweb}	Normal		Started			Started container with docker id 38b74cadef26
[root@localhost ~]# 

 瀏覽器訪問tomcat:

瀏覽訪問java項目:

報錯:Error:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

解決辦法: 臨時在tomcat的hosts裏寫mysql IP,長久解決是dns。

相關文章
相關標籤/搜索