天天看點

Kubenetes1.13.1叢集部署 --02Hello World

介紹

本文主要介紹如何搭建一個Mysqkl+Java Web留言闆項目,JSP頁面通過JDBC直接通路Mysql資料庫并展示資料。為了示範和簡化的目的,隻要程式正确連接配接到了資料庫上,它就會自動完成對應Table的建立和初始化資料的準備工作。

此應用需要啟動兩個容器:Web APP容器和MySQL容器,并且WebApp容器需要通路MySQL容器。

啟動MySQL伺服器

首先為MySQL服務建立一個RC定義檔案:mysql-rc.yaml,下面給出了改檔案的完成内容和解釋:

apiVersion: v1
kind: ReplicationController         # 副本控制器RC
metadata:
  name: mysql                       # RC的名稱,全局唯一
spec:
  replicas: 1                       # Pod副本數量
  selector:
    app: mysql                      # 符合目标的Pod擁有此标簽
  template:
    metadata:
      labels:
        app: mysql                  # Pod副本使用者的标簽,對應RC的Selector
    spec:
      containers:                   # Pod内容器的定義部分
      - name: mysql                 # 容器名稱
        image: mysql:5.6            # 容器對應的docker image
        ports:
        - containerPort: 3306       # 容器暴露的端口号
        env:
        - name: MYSQL_ROOT_PASSWORD # mysql容器預設密碼設定
          value: "123456"           

執行該檔案:

kubectl create -f mysql-rc.yaml           

接下來,我們用kubectl指令檢視剛剛建立的RC:

[[email protected] config]# kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
mysql   1         1         1       20m           

檢視Pod的建立情況時,可以運作下面的指令:

[[email protected] config]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-xxp56   1/1     Running   0          20m           

我們通過docker ps|grep mysql指令檢視正在運作的容器,發現提供MySQL服務的Pod容器已經建立并正常運作了,除此之外還多建立了一個來自谷歌的pause容器,這就是Pod的根容器:

[[email protected] ~]# docker ps|grep mysql
3a07bce96aab        mysql                  "docker-entrypoint.s…"   23 minutes ago      Up 23 minutes                                k8s_mysql_mysql-xxp56_default_a03ab81d-0f34-11e9-8c52-1866da8c1dba_0
06f009f3886a        k8s.gcr.io/pause:3.1   "/pause"                 24 minutes ago      Up 24 minutes                                k8s_POD_mysql-xxp56_default_a03ab81d-0f34-11e9-8c52-1866da8c1dba_0
           

後面我們建立一個與之關聯的Kubernetes Service-Mysql的定義檔案mysql-svc.yaml:

apiVersion: v1
kind: Service            # 表名是Kubernetes Service
metadata:
  name: mysql            # Service的全局唯一名稱
spec:
  ports:
    - port: 3306         # Service提供服務的端口号
  selector:              # Pod副本執行個體名稱
    app: mysql
           

執行該檔案:

kubectl create -f mysql-svc.yaml           

運作kubectl指令,檢視剛剛建立的service

[[email protected] config]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          3h
mysql        ClusterIP   10.107.100.143   <none>        3306/TCP         9m           

注意到Mysql服務被配置設定了一個值為10.107.100.143的Cluster-ip,這是一個虛拟位址,随後,Kubernetes叢集中其他新建立的Pod就可以通過Service的Cluster IP+端口号3306來連接配接和通路它了。這些資訊kubernetes巧妙地利用了Linux環境變量來進行存儲。

啟動Tomcat應用

上面我們定義和啟動了MySQL服務,接下來我們采用同樣的步驟,完成Tomcat應用的啟動過程。

首先,建立對應的RC檔案myweb.yaml,内容如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 5                             # 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'           

有人肯定會疑惑,這裡隻配置了主機名和端口,并沒有配置賬号密碼,tomcat能啟動成功嗎?原因是在于這個tomcat-app容器代碼中預設寫死了賬号密碼(root/123456)。

執行該檔案:

kubectl create -f myweb-rc.yaml           

檢視建立好的Pod:

[[email protected] config]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-xxp56   1/1     Running   0          38m
myweb-ds8nv   1/1     Running   0          82m
myweb-jdtdw   1/1     Running   0          82m
myweb-rjbm9   1/1     Running   0          82m
myweb-tg6zc   1/1     Running   0          49m
myweb-v7fwf   1/1     Running   0          82m           

最後建立對應的service,下面是檔案内容和說明,myweb-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort          # 表示此Service開啟了NodePort方式的外網通路模式
  ports:
    - port: 8080          # Service提供服務的端口号
      nodePort: 30002     # 外網通路端口
  selector:
    app: myweb            # Pod副本執行個體名稱
           

執行該檔案:

kubectl create -f myweb-svc.yaml           

檢視剛才建立的Service:

[[email protected] config]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          3h
mysql        ClusterIP   10.107.100.143   <none>        3306/TCP         3m
myweb        NodePort    10.106.119.48    <none>        8080:30002/TCP   3m           

通過浏覽器通路頁面

通路位址是master節點的30002端口, http://192.168.22.141:30002/demo/index.jsp

[[email protected] helloworld.ex]# kubectl get pod myweb-lb9ck -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
myweb-lb9ck   1/1     Running   0          5m40s   10.244.2.3   cloud03   <none>           <none>
[[email protected] helloworld.ex]# kubectl get svc myweb-lb9ck 
Error from server (NotFound): services "myweb-lb9ck" not found
[[email protected] helloworld.ex]# kubectl get svc 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          11h
mysql        ClusterIP   10.103.168.75    <none>        3306/TCP         8m39s
myweb        NodePort    10.101.248.174   <none>        8080:30002/TCP   3m21s
           
Kubenetes1.13.1叢集部署 --02Hello World

通路位址是node節點的30002端口: 因為myweb-lb9ck   1/1     Running   0          5m40s   10.244.2.3   cloud03,是以還可以直接通路節點:如 http://192.168.22.143:30002/demo/index.jsp

Kubenetes1.13.1叢集部署 --02Hello World

dashboard界面檢視

Kubenetes1.13.1叢集部署 --02Hello World

相關操作

指令行登入容器

顯示Pods:

[[email protected] config]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-xxp56   1/1     Running   0          46m
myweb-ds8nv   1/1     Running   0          90m
myweb-jdtdw   1/1     Running   0          90m
myweb-rjbm9   1/1     Running   0          90m
myweb-tg6zc   1/1     Running   0          57m
myweb-v7fwf   1/1     Running   0          90m
           

比如,進入mysql容器:

[[email protected] config]# kubectl exec -ti mysql-xxp56 -c mysql /bin/bash
[email protected]:/# date
Thu Jan  3 09:38:26 UTC 2019