Docker & K8s學習記錄
Docker & K8s學習記錄
下載學習程式碼:
https://github.com/kubeguide/K8sDefinitiveGuide-V4-Sourcecode
啟動mysql RC服務
建立RC定義檔案 mysql-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: mysql #RC名稱,全域性唯一 spec: replicas: 1 #pod副本期待數量 selector: app: mysql # 符合目標的pod擁有此標籤 template: # 根據此模板建立pod副本 metadata: labels: app: mysql #pod 副本擁有的標籤,對應RC的Selector spec: containers: #pod 內容器的定義部分 - name: mysql #容器的名稱 image: mysql #容器對應的Docker Image ports: - containerPort: 3306 #容器內應用監聽的埠號 env: #注入容器內的環境變數 - name: MYSQL_ROOT_PASSWORD value: "123456"
解析:
-
kind 屬性用來表明此資源的型別。如
ReplicationController
表明這是一個RC
。 -
spec 一節中是
RC
的相關屬性定義
“當在叢集中執行的Pod數量少於replicas時,RC會根據在spec.template一節中定義的Pod模板來生成一個新的Pod例項,spec.template.metadata.labels指定了該Pod的標籤,需要特別注意的是:這裡的labels必須匹配之前的spec.selector,否則此RC每建立一個無法匹配Label的Pod,就會不停地嘗試建立新的Pod,陷入惡性迴圈中。”
摘錄來自: 龔正 等. “Kubernetes權威指南:從Docker到Kubernetes實踐全接觸。”
roverliang@roverliangdeMac-mini study % kubectl create -f mysql-rc.yaml
replicationcontroller/mysql created
檢視剛剛建立的RC
roverliang@roverliangdeMac-mini study % kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 2m26s
檢視Pod
的佔用情況
roverliang@roverliangdeMac-mini study % kubectl get pods NAME READY STATUS RESTARTS AGE hello-minikube-64b64df8c9-x6gzz 1/1 Running 0 17h mysql-frrfx 1/1 Running 0 3m35s
啟動 Mysql SVC 服務
建立一個與之關聯的Kubernetes Service-MySQL 的定義檔案(檔名為mysql-svc.yaml)。完整的內容和解釋如下:
apiVersion: v1
kind: Service #表明是Kubernetes Service
metadata:
name: mysql #Service 全域性唯一名稱
spec:
ports:
- port: 3306 #Service提供的服務埠號
selector:
app: mysql #Service 對應的Pod。擁有這裡對應的標籤.
執行kubectl 命令,建立 Service
roverliang@roverliangdeMac-mini study % kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.107.208.178 <none> 8080:30011/TCP 17h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
mysql ClusterIP 10.109.89.147 <none> 3306/TCP 5m15s
MySQL服務被分配了一個值為10.109.89.147的Cluster IP
地址。隨後,Kubernetes叢集中其他新建立的Pod就可以通過Service
的Cluster IP+埠號3306
來連線和訪問它了。”
通常,Cluster IP
是在Service
建立後由Kubernetes
系統自動分配的,其他Pod無法預先知道某個Service
的Cluster IP
地址,因此需要一個服務發現機制來找到這個服務。
為此,最初時,Kubernetes
巧妙地使用了Linux環境變數(Environment Variable)
來解決這個問題,後面會詳細說明其機制。現在只需知道,根據Service的唯一名稱,容器可以從環境變數
中獲取Service對應的Cluster IP地址和埠,從而發起TCP/IP連線請求。
啟動Tomcat 應用
- 建立
myweb-rc.yaml
配置檔案
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5
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'
- 建立
myweb-rc
roverliang@roverliangdeMac-mini study % kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
- 獲取建立的myweb pod
# 建立中
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-64b64df8c9-x6gzz 1/1 Running 0 17h
mysql-frrfx 1/1 Running 0 19m
myweb-49scc 0/1 ContainerCreating 0 26s
myweb-54brv 0/1 ContainerCreating 0 26s
myweb-9jv2z 0/1 ContainerCreating 0 26s
myweb-jcjpz 0/1 ContainerCreating 0 26s
myweb-t5hc6 0/1 ContainerCreating 0 26s
# 建立完成
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-64b64df8c9-x6gzz 1/1 Running 0 18h
mysql-frrfx 1/1 Running 0 25m
myweb-49scc 1/1 Running 0 6m5s
myweb-54brv 1/1 Running 0 6m5s
myweb-9jv2z 1/1 Running 0 6m5s
myweb-jcjpz 1/1 Running 0 6m5s
myweb-t5hc6 1/1 Running 0 6m5s
- 建立myweb-svc 服務
建立myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
建立svc 服務
roverliang@roverliangdeMac-mini study % kubectl create -f myweb-svc.yaml
service/myweb created
檢視Service
roverliang@roverliangdeMac-mini study % kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.107.208.178 <none> 8080:30011/TCP 18h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h
mysql ClusterIP 10.109.89.147 <none> 3306/TCP 43m
myweb NodePort 10.100.49.129 <none> 8080:30001/TCP 63s
經過上面的幾個步驟,我們終於成功實現了Kubernetes上第1個例子的部署搭建工作。現在一起來見證成果吧!在你的筆記本上開啟瀏覽器,輸入
http://127.0.0.1:30001/demo/
。
比如虛擬機器IP為192.168.18.131(可以通過#ip a命令進行查詢),在瀏覽器裡輸入地址http://127.0.0.1:30001/demo/後
,可以看到如圖1.2所示的網頁介面。