本文是經過yum方式安裝Kubernetes,並部署tomcat+mysql實現Jave Web應用。此應用是JSP頁面經過JDBC訪問Mysql數據庫,只要程序正確鏈接到數據庫上,就會自動完成對應的Table的建立與初始化數據的準備工做。當咱們經過瀏覽器訪問此應用時,就會顯示一個表格的頁面,數據則來自數據庫。
此應用須要啓動兩個容器:Web App容器和MySQL容器,而且Web App容器須要訪問MySQL容器。如今咱們就來看看經過Kubernetes是如何實現Java Web應用的。
在繼續閱讀以前,咱們須要對Kubernetes有一個基本的認識,須要瞭解它的原理、核心架構、核心組件和對象、以及各組件之間的聯繫等基礎概念,能夠參考個人上一篇博文《初識Kubernetes(K8s):理論基礎》,https://blog.51cto.com/andyxu/2308937
系統環境
操做系統:Centos 7.5 64位
IP地址:192.168.2.238node
一、關閉Centos自帶的防火牆服務
注:Kubernetes集羣之間會有大量的網絡通訊,在一個安全的內部網絡環境中建議關閉防火牆服務python
[root@andyxu-test ~]# systemctl disable firewalld [root@andyxu-test ~]# systemctl stop firewalld
二、安裝etcd和Kubernetes軟件(會自動安裝Docker軟件)mysql
[root@andyxu-test ~]# yum -y install etcd kubernetes
注:yum方式安裝的kubernetes的版本是1.5.2
三、生成rhsm證書文件linux
[root@andyxu-test ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm [root@andyxu-test ~]# 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
注:建立容器時須要從redhat站點下載pod-infrastructure:latest鏡像,若是沒有此證書文件會報錯,Pod會一直顯示ContainerCreating狀態。
四、修改docker和kube-apiserver的配置文件
docker配置文件爲/etc/sysconfig/docker,將OPTIONS的內容修改成web
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
kube-apiserver配置文件爲/etc/kubernetes/apiserver,修改KUBE_ADMISSION_CONTROL的內容,將--admission-control參數中的ServiceAccount刪除。sql
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
五、按順序啓動全部服務docker
[root@andyxu-test ~]# systemctl start etcd [root@andyxu-test ~]# systemctl start docker [root@andyxu-test ~]# systemctl start kube-apiserver [root@andyxu-test ~]# systemctl start kube-controller-manager [root@andyxu-test ~]# systemctl start kube-scheduler [root@andyxu-test ~]# systemctl start kubelet [root@andyxu-test ~]# systemctl start kube-proxy
一、建立mysql的Deployment定義文件
mysql-dep.yaml文件內容以下:數據庫
apiVersion: extensions/v1beta1 #apiserver的版本 kind: Deployment #副本控制器deployment,管理pod和RS metadata: name: mysql #deployment的名稱,全局惟一 spec: replicas: 1 #Pod副本期待數量 selector: matchLabels: #定義RS的標籤 app: mysql #符合目標的Pod擁有此標籤 strategy: #定義升級的策略 type: RollingUpdate #滾動升級,逐步替換的策略 template: #根據此模板建立Pod的副本(實例) metadata: labels: app: mysql #Pod副本的標籤,對應RS的Selector spec: containers: #Pod裏容器的定義部分 - name: mysql #容器的名稱 image: mysql:5.7 #容器對應的docker鏡像 volumeMounts: #容器內掛載點的定義部分 - name: time-zone #容器內掛載點名稱 mountPath: /etc/localtime #容器內掛載點路徑,能夠是文件或目錄 - name: mysql-data mountPath: /var/lib/mysql #容器內mysql的數據目錄 - name: mysql-logs mountPath: /var/log/mysql #容器內mysql的日誌目錄 ports: - containerPort: 3306 #容器暴露的端口號 env: #寫入到容器內的環境容量 - name: MYSQL_ROOT_PASSWORD #定義了一個mysql的root密碼的變量 value: "123456" volumes: #本地須要掛載到容器裏的數據卷定義部分 - name: time-zone #數據卷名稱,須要與容器內掛載點名稱一致 hostPath: path: /etc/localtime #掛載到容器裏的路徑,將localtime文件掛載到容器裏,可以讓容器使用本地的時區 - name: mysql-data hostPath: path: /data/mysql/data #本地存放mysql數據的目錄 - name: mysql-logs hostPath: path: /data/mysql/logs #本地存入mysql日誌的目錄
二、建立deployment、RS、Pod和容器
建立過程須要先下載鏡像,時間會比較久,可喝杯茶撩撩旁邊的妹子,哈哈,請耐心等待centos
[root@andyxu-test ~]# kubectl create -f mysql-dep.yaml deployment "mysql" created
三、查看建立好的deployment運行狀況api
[root@andyxu-test ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 8s
注:都是1表示運行正常
四、查看ReplicaSet(RS)的運行狀況
[root@andyxu-test ~]# kubectl get rs NAME DESIRED CURRENT READY AGE mysql-3238461207 1 1 1 6m
注:都是1表示運行正常
五、查看Pod的運行狀況
[root@andyxu-test ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-3238461207-vvwt8 1/1 Running 0 56m
注:READY的值是1/1,而且STATUS的值是Running,表示運行正常
因爲Pod的建立須要花費一些時間,在尚未建立好容器時,STATUS的狀態會是ContainerCreating,表示正在建立容器,這時只須要等待。Pod建立好後,STATUS的狀態會是Running,這時能夠經過docker ps命令查看容器運行的狀況。
六、查看容器的運行狀況
[root@andyxu-test ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5252cd76009a mysql:5.7 "docker-entrypoint..." 55 minutes ago Up 55 minutes k8s_mysql.23f88726_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_6b15dcfc f026e79ddad9 registry.access.redhat.com/rhel7/pod-infrastructure:latest "/usr/bin/pod" 55 minutes ago Up 55 minutes k8s_POD.1d520ba5_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_668a091e
七、查看Pod裏容器的時間,檢查時間是否與本地時間一致
[root@andyxu-test ~]# kubectl exec mysql-3238461207-vvwt8 date Thu Oct 25 15:06:15 CST 2018
注:exec後面跟pod的名稱
八、建立mysql的service定義文件
mysql-svc.yaml文件內容以下:
apiVersion: v1 kind: Service #表示Kubernetes Service metadata: name: mysql #Service的名稱 spec: ports: - port: 3306 #Service提供服務的端口號 selector: app: mysql #Service對應的Pod的標籤
九、建立Service
[root@andyxu-test ~]# kubectl create -f mysql-svc.yaml service "mysql" created
十、查看Service的運行狀況
[root@andyxu-test ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 4h mysql 10.254.144.64 <none> 3306/TCP 57s
kubernetes會給Service分配一個Cluster IP,這是個虛擬IP地址,此後集羣中的其餘新建立的Pod就能夠經過此Cluster IP+端口號的方式來鏈接和訪問mysql服務了。
一、建立tomcat的Deployment定義文件
myweb-dep.yaml文件的內容以下:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: myweb spec: replicas: 1 selector: matchLabels: app: myweb strategy: type: RollingUpdate template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 volumeMounts: - name: time-zone mountPath: /etc/localtime - name: tomcat-logs mountPath: /usr/local/tomcat/logs ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: '10.254.144.64' #此處爲mysql服務的Cluster IP - name: MYSQL_SERVICE_PORT value: '3306' volumes: - name: time-zone hostPath: path: /etc/localtime - name: tomcat-logs hostPath: path: /data/tomcat/logs
二、建立tomcat的deployment、RS、Pod和容器
[root@andyxu-test ~]# kubectl create -f myweb-dep.yaml deployment "myweb" created
建立過程比較久,請耐心等待,pod的STATUS狀態爲Running時表示建立成功。
三、建立tomcat的Service定義文件
myweb-svc.yaml文件的內容以下:
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
此Service開啓了NodePort方式的外網訪問模式,端口爲30001,此端口會映射到tomcat容器的8080端口上。
四、建立Service
[root@andyxu-test ~]# kubectl create -f myweb-svc.yaml service "myweb" created
五、查看Service的運行狀況
[root@andyxu-test ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 5h mysql 10.254.144.64 <none> 3306/TCP 24m myweb 10.254.246.56 <nodes> 8080:30001/TCP 39s
六、可以使用curl命令測試tomcat服務是否能正常訪問
[root@andyxu-test ~]# curl http://192.168.2.238:30001
一、若是30001端口不通的話,從新啓動、關閉firewalld防火牆
[root@andyxu-test ~]# systemctl start firewalld [root@andyxu-test ~]# systemctl stop firewalld
注:由於kubernetes會在iptables裏添加一些策略,須要再從新開啓關閉防火牆纔會關閉掉這些策略。
二、經過瀏覽器訪問http://192.168.2.238:30001/demo/
點擊「Add...」,添加一條記錄並提交
提交之後,數據就被寫入mysql數據庫裏了。
三、登錄mysql數據庫驗證
[root@andyxu-test ~]# docker exec -it 5252cd76009a /bin/bash root@mysql-3238461207-vvwt8:/# mysql -uroot -p123456 mysql> use HPE_APP mysql> select * from T_USERS;
咱們能夠繼續研究下這個例子,好比:
此例子來源於《Kubernetes權威指南(第2版)》,我作了一些修改,以及報錯的處理,而且使用了Deployment來建立。