1. 程式人生 > 實用技巧 >Docker & K8s學習記錄

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就可以通過ServiceCluster IP+埠號3306來連線和訪問它了。”

通常,Cluster IP是在Service建立後由Kubernetes系統自動分配的,其他Pod無法預先知道某個ServiceCluster IP地址,因此需要一個服務發現機制來找到這個服務。

為此,最初時,Kubernetes巧妙地使用了Linux環境變數(Environment Variable)來解決這個問題,後面會詳細說明其機制。現在只需知道,根據Service的唯一名稱,容器可以從環境變數中獲取Service對應的Cluster IP地址和埠,從而發起TCP/IP連線請求。

啟動Tomcat 應用

  1. 建立 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'
  1. 建立 myweb-rc
roverliang@roverliangdeMac-mini study % kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
  1. 獲取建立的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
  1. 建立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所示的網頁介面。