本文是通過yum方式安裝Kubernetes,并部署tomcat+MySQL實(shí)現(xiàn)Jave Web應(yīng)用。此應(yīng)用是JSP頁面通過JDBC訪問Mysql數(shù)據(jù)庫,只要程序正確連接到數(shù)據(jù)庫上,就會自動完成對應(yīng)的Table的創(chuàng)建與初始化數(shù)據(jù)的準(zhǔn)備工作。當(dāng)我們通過瀏覽器訪問此應(yīng)用時(shí),就會顯示一個(gè)表格的頁面,數(shù)據(jù)則來自數(shù)據(jù)庫。
此應(yīng)用需要啟動兩個(gè)容器:Web App容器和MySQL容器,并且Web App容器需要訪問MySQL容器。現(xiàn)在我們就來看看通過Kubernetes是如何實(shí)現(xiàn)Java Web應(yīng)用的。
在繼續(xù)閱讀之前,我們需要對Kubernetes有一個(gè)基本的認(rèn)識,需要了解它的原理、核心架構(gòu)、核心組件和對象、以及各組件之間的聯(lián)系等基礎(chǔ)概念,可以參考我的上一篇博文《初識Kubernetes(K8s):理論基礎(chǔ)》,https://blog.51cto.com/andyxu/2308937
系統(tǒng)環(huán)境
操作系統(tǒng):Centos 7.5 64位
IP地址:192.168.2.238
我們提供的服務(wù)有:網(wǎng)站建設(shè)、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、牧野ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的牧野網(wǎng)站制作公司
1、關(guān)閉Centos自帶的防火墻服務(wù)
注:Kubernetes集群之間會有大量的網(wǎng)絡(luò)通信,在一個(gè)安全的內(nèi)部網(wǎng)絡(luò)環(huán)境中建議關(guān)閉防火墻服務(wù)
[root@andyxu-test ~]# systemctl disable firewalld
[root@andyxu-test ~]# systemctl stop firewalld
2、安裝etcd和Kubernetes軟件(會自動安裝Docker軟件)
[root@andyxu-test ~]# yum -y install etcd kubernetes
注:yum方式安裝的kubernetes的版本是1.5.2
3、生成rhsm證書文件
[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
注:創(chuàng)建容器時(shí)需要從redhat站點(diǎn)下載pod-infrastructure:latest鏡像,如果沒有此證書文件會報(bào)錯(cuò),Pod會一直顯示ContainerCreating狀態(tài)。
4、修改docker和kube-apiserver的配置文件
docker配置文件為/etc/sysconfig/docker,將OPTIONS的內(nèi)容修改為
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
kube-apiserver配置文件為/etc/kubernetes/apiserver,修改KUBE_ADMISSION_CONTROL的內(nèi)容,將--admission-control參數(shù)中的ServiceAccount刪除。
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
5、按順序啟動所有服務(wù)
[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
1、創(chuàng)建mysql的Deployment定義文件
mysql-dep.yaml文件內(nèi)容如下:
apiVersion: extensions/v1beta1 #apiserver的版本
kind: Deployment #副本控制器deployment,管理pod和RS
metadata:
name: mysql #deployment的名稱,全局唯一
spec:
replicas: 1 #Pod副本期待數(shù)量
selector:
matchLabels: #定義RS的標(biāo)簽
app: mysql #符合目標(biāo)的Pod擁有此標(biāo)簽
strategy: #定義升級的策略
type: RollingUpdate #滾動升級,逐步替換的策略
template: #根據(jù)此模板創(chuàng)建Pod的副本(實(shí)例)
metadata:
labels:
app: mysql #Pod副本的標(biāo)簽,對應(yīng)RS的Selector
spec:
containers: #Pod里容器的定義部分
- name: mysql #容器的名稱
image: mysql:5.7 #容器對應(yīng)的docker鏡像
volumeMounts: #容器內(nèi)掛載點(diǎn)的定義部分
- name: time-zone #容器內(nèi)掛載點(diǎn)名稱
mountPath: /etc/localtime #容器內(nèi)掛載點(diǎn)路徑,可以是文件或目錄
- name: mysql-data
mountPath: /var/lib/mysql #容器內(nèi)mysql的數(shù)據(jù)目錄
- name: mysql-logs
mountPath: /var/log/mysql #容器內(nèi)mysql的日志目錄
ports:
- containerPort: 3306 #容器暴露的端口號
env: #寫入到容器內(nèi)的環(huán)境容量
- name: MYSQL_ROOT_PASSWORD #定義了一個(gè)mysql的root密碼的變量
value: "123456"
volumes: #本地需要掛載到容器里的數(shù)據(jù)卷定義部分
- name: time-zone #數(shù)據(jù)卷名稱,需要與容器內(nèi)掛載點(diǎn)名稱一致
hostPath:
path: /etc/localtime #掛載到容器里的路徑,將localtime文件掛載到容器里,可讓容器使用本地的時(shí)區(qū)
- name: mysql-data
hostPath:
path: /data/mysql/data #本地存放mysql數(shù)據(jù)的目錄
- name: mysql-logs
hostPath:
path: /data/mysql/logs #本地存入mysql日志的目錄
2、創(chuàng)建deployment、RS、Pod和容器
創(chuàng)建過程需要先下載鏡像,時(shí)間會比較久,可喝杯茶撩撩旁邊的妹子,哈哈,請耐心等待
[root@andyxu-test ~]# kubectl create -f mysql-dep.yaml
deployment "mysql" created
3、查看創(chuàng)建好的deployment運(yùn)行情況
[root@andyxu-test ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 8s
注:都是1表示運(yùn)行正常
4、查看ReplicaSet(RS)的運(yùn)行情況
[root@andyxu-test ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
mysql-3238461207 1 1 1 6m
注:都是1表示運(yùn)行正常
5、查看Pod的運(yùn)行情況
[root@andyxu-test ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-3238461207-vvwt8 1/1 Running 0 56m
注:READY的值是1/1,并且STATUS的值是Running,表示運(yùn)行正常
由于Pod的創(chuàng)建需要花費(fèi)一些時(shí)間,在還沒有創(chuàng)建好容器時(shí),STATUS的狀態(tài)會是ContainerCreating,表示正在創(chuàng)建容器,這時(shí)只需要等待。Pod創(chuàng)建好后,STATUS的狀態(tài)會是Running,這時(shí)可以通過docker ps命令查看容器運(yùn)行的情況。
6、查看容器的運(yùn)行情況
[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
7、查看Pod里容器的時(shí)間,檢查時(shí)間是否與本地時(shí)間一致
[root@andyxu-test ~]# kubectl exec mysql-3238461207-vvwt8 date
Thu Oct 25 15:06:15 CST 2018
注:exec后面跟pod的名稱
8、創(chuàng)建mysql的service定義文件
mysql-svc.yaml文件內(nèi)容如下:
apiVersion: v1
kind: Service #表示Kubernetes Service
metadata:
name: mysql #Service的名稱
spec:
ports:
- port: 3306 #Service提供服務(wù)的端口號
selector:
app: mysql #Service對應(yīng)的Pod的標(biāo)簽
9、創(chuàng)建Service
[root@andyxu-test ~]# kubectl create -f mysql-svc.yaml
service "mysql" created
10、查看Service的運(yùn)行情況
[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分配一個(gè)Cluster IP,這是個(gè)虛擬IP地址,此后集群中的其他新創(chuàng)建的Pod就可以通過此Cluster IP+端口號的方式來連接和訪問mysql服務(wù)了。
1、創(chuàng)建tomcat的Deployment定義文件
myweb-dep.yaml文件的內(nèi)容如下:
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服務(wù)的Cluster IP
- name: MYSQL_SERVICE_PORT
value: '3306'
volumes:
- name: time-zone
hostPath:
path: /etc/localtime
- name: tomcat-logs
hostPath:
path: /data/tomcat/logs
2、創(chuàng)建tomcat的deployment、RS、Pod和容器
[root@andyxu-test ~]# kubectl create -f myweb-dep.yaml
deployment "myweb" created
創(chuàng)建過程比較久,請耐心等待,pod的STATUS狀態(tài)為Running時(shí)表示創(chuàng)建成功。
3、創(chuàng)建tomcat的Service定義文件
myweb-svc.yaml文件的內(nèi)容如下:
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
此Service開啟了NodePort方式的外網(wǎng)訪問模式,端口為30001,此端口會映射到tomcat容器的8080端口上。
4、創(chuàng)建Service
[root@andyxu-test ~]# kubectl create -f myweb-svc.yaml
service "myweb" created
5、查看Service的運(yùn)行情況
[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
6、可使用curl命令測試tomcat服務(wù)是否能正常訪問
[root@andyxu-test ~]# curl http://192.168.2.238:30001
1、如果30001端口不通的話,重新啟動、關(guān)閉firewalld防火墻
[root@andyxu-test ~]# systemctl start firewalld
[root@andyxu-test ~]# systemctl stop firewalld
注:因?yàn)閗ubernetes會在iptables里添加一些策略,需要再重新開啟關(guān)閉防火墻才會關(guān)閉掉這些策略。
2、通過瀏覽器訪問http://192.168.2.238:30001/demo/
點(diǎn)擊“Add...”,添加一條記錄并提交
提交以后,數(shù)據(jù)就被寫入mysql數(shù)據(jù)庫里了。
3、登陸mysql數(shù)據(jù)庫驗(yàn)證
[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;
我們可以繼續(xù)研究下這個(gè)例子,比如:
此例子來源于《Kubernetes權(quán)威指南(第2版)》,我做了一些修改,以及報(bào)錯(cuò)的處理,并且使用了Deployment來創(chuàng)建。
文章名稱:初識Kubernetes(K8s):從一個(gè)單機(jī)部署實(shí)現(xiàn)JavaWeb應(yīng)用例子開始
鏈接地址:http://jinyejixie.com/article28/jjidcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、標(biāo)簽優(yōu)化、微信小程序、品牌網(wǎng)站建設(shè)、網(wǎng)站營銷、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)