Kubernetes入門


 

Kubernetes入門

一、Kubernetes是什么

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

  其次,如果我們的系統設計遵循了Kubernetes的設計思想,那么傳統系統架構中那些和業務沒有多大關系的底層代碼或功能模塊,都可以立刻從我們的視線消失,我們不必再費心於負載均衡器和部署實施問題,不必再考慮引用或自己開發一個復雜的服務治理框架,不必再頭疼於服務監控和故障處理模塊的開發。使用Kubernets提供的解決方案,我們僅節省了不少於30%的開發成本,同時可以將精力更加集中於業務本身,而且由於Kubernetes提供了強大的自動化機制,所以系統后期的運維難度和運維成本大幅度降低。

  然后,Kubernetes是一個開發的開發平台。沒有限定任何編程接口,所以不論是Java、Go、C++還是用Python編寫的服務,都可以毫無困難地映射為Kubernetes的Service,並通過標准的TCP通信協議進行交互。此外,由於Kubernetes平台對現有的編程語言、編程框架、中間價沒有任何侵入性,因此現有的系統很容器改造升級並遷移到Kubernetes平台上。

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

二、為什么要用Kubernetes

  使用Kubernetes的理由很多,最根本的一個理由就是:IT從來都是一個由新技術驅動的行業。

  Docker這個新興的容器化技術當前已經被很多公司所采用,其從單機走向集群已成為必然,而雲計算的蓬勃發展正在加速這一進程。Kubernetes作為當前唯一被業界廣泛認可和看好的Docker分布式系統解決方案,可以預見,在未來幾年內,會有大量的新系統選擇它,不管這些系統是運行在企業本地服務器還是被托管到公有雲上。

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

  首先,最直接的感受就是我們可以"輕裝上陣"地開發復雜系統了。在采用Kubernetes解決方案之后,只需要一個精悍的小團隊就能輕松應對。在這個團隊里,一名架構師專注於系統"服務組件"的提煉,幾名開發工程師專注於業務代碼的開發,一名系統兼運維工程師負責Kubernetes的部署和運維,從此再也不用"996",這並不是因為我們少做了什么,而是因為Kubernetes已經幫我們做了很多。

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

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

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

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

1、環境准備

  首先,我們開始准備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集群中上手練習了。

2、一個簡單的Java web應用

  這個例子比較簡單,需要啟動2個容器:Web App容器和MySQL容器,並且Web App容器需要訪問MySQL容器。運行在Tomcat里的Web App,JSP頁面通過JDBC直接訪問MySQL數據庫並展示數據。為了演示和簡化的目的,只要程序正確連接到了數據庫上,它就會自動完成對應的Table的創建與初始化數據的准備工作。所以,當我們通過瀏覽器訪問此應用時,就會顯示一個表格的頁面,數據則來自數據庫。

3、啟動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 連接請求了。

3、啟動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 例子搭建完成了。

5、通過瀏覽器訪問網頁

  經過上面的幾個步驟,我們終於成功實現了 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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM