環境:CentOS Linux release 7.4.1708 (Core)
單機版Kubernetes集群的效果,如圖:
1)JSP頁面通過JDBC直接訪問Mysql數據庫並展示;這里只是為了實現,只要程序正確連接到了數據庫上,它就會自動完成對應的Table的創建與初始化數據的准備工作。也就是當通過瀏覽器訪問此應用的時候,就會顯示一個表格,表格的數據來自數據庫
一、基本環境
1、關閉防火牆(自己寫的腳本)
#!/bin/bash# #FileName: iptables_stop.sh #Date: 20181029 #Author: LiLe #Contact: 836217653@qq.com #Version: V1.0 #Description: Centos7 stop firewalld in grain install(){ yum -y install firewalld yum -y install iptables-services } stop_service(){ systemctl stop firewalld systemctl stop iptables } starting_stop(){ systemctl disable firewalld.service systemctl disable iptables.service } main(){ install stop_service starting_stop } main
2、安裝k8s
yum -y install etcd kubernetes
3、把Kubernetes apiserver配置文件/etc/kubernetes/apiserver里的--admission-control的ServiceAccount刪除
4、啟動所有的服務
systemctl start etcd master systemctl start docker node systemctl start kube-apiserver master systemctl start kube-controller-manager master systemctl start kube-scheduler master systemctl start kubelet node systemctl start kube-proxy node
二、啟動Mysql服務
1、為Mysql創建一個RC定義文件,mysql-rc.yaml
apiVersion: v1 kind: ReplicationController #表明此資源對象的內型,"ReplicationController表明這是一個RC" metadata: name: mysql #RC的名稱,全局唯一 spec: #spec是RC的相關屬性定義 replicas: 1 #副本期待數量 selector: #是RC的Pod標簽選擇器,監控和管理擁有這些標簽的Pod實例,確保當前集群上始終有且僅有replicas個Pod實例在運行,這里設置的replicas=1表明只能運行一個Mysql Pod實例,當集群中運行的Pod數量小於replicas時,RC會根據spec.template一節中定義的Pod模板來生成一個新的Pod實例,spec.template.metadata.labels指定了該Pod的標簽,,需要注意的是這里的labels必須匹配之前的spec.selector,否則此RC每次創建了一個無法匹配Label的Pod,就會不停地嘗試創建新的Pod. app: mysql #符合目標的Pod擁有此標簽 template: #根據此模板創建Pod的副本(實例) metadata: labels: app: mysql #Pod副本擁有的標簽,對應RC的Selector spec: containers: #Pod內容器的定義部分 - name: mysql #容器的名稱 image: mysql #容器的鏡像 ports: #容器暴露的端口 - containerPort: 3306 env: #注入到容器內的環境變量 - name: MYSQL_ROOT_PASSWORD value: "123456"
2、將mysql-controller發布到Kubernetes集群中
kubectl create -f mysql-rc.yaml
3、查看剛剛創建的RC
kubectl get rc

4、查看Pod的創建情況
kubectl get pods

這里會出現的錯誤:
1)這里的status一直處於ContainerCreating狀態,可以通過查看狀態是什么問題
kubectl describe pod mysql

可以看到這個文件不存在,下載安裝
1) wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm 2) 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
2)docker-runc沒有
5、通過docker ps -a可以看到有一個Mysql的容器啟動了
6、創建一個與之關聯的Kubernetes Service,mysql-svc.yaml
apiVersion: v1 kind: Service #表明是Kubernetes Service metadata: name: mysql #Service的全局唯一名稱;Service 的服務名 spec: ports: - port: 3306 #Service提供服務的端口號 selector: app: mysql #service對應的Pod擁有這里定義的標簽; 確定了哪些Pod副本(實例)對應到本服務
7、創建Service對象
kubectl create -f mysql-svc.yaml
8、查看剛剛創建的service
kubectl get svc

這里Mysql服務被分配了一個值為10.254.243.27的Cluster IP地址,這是一個虛地址,隨后,Kubernetes集群中其他新創建的Pod就可以通過Service的Cluster IP + Port來連接和訪問了。
通常情況下,Cluster IP是在Service創建后又Kubernetes系統自動分配的,其他的Pod無法預先知道某個Service的Cluster IP地址,因此需要一個服務發現機制來找到這個服務。Kubernetes里,根據Service的唯一名字,容器可以從環境變量中獲取到Service對應的Cluster IP地址和端口,從而發起TCP/IP連接請求了。
三、啟動Tomcat應用
1、啟動Tomcat應用,創建對應的RC文件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'
2、將tomcat發布到Kubernetes集群中
kubectl create -f myweb-rc.yaml
3、創建對應的Kubernetes Service
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort #表明此Service開啟了NodePort方式的外網訪問模式 ports: - port: 8080 nodePort: 30001 #在集群之外,可以通過30001這個端口訪問myweb,對應到8080的虛端口上。 selector: app: myweb
kubectl create -f myweb-svc.yaml
四、訪問
1、通過瀏覽器訪問IP:PORT/demo/發現如下報錯:
解決辦法:
在Tomcat的myweb-svc.yaml文件中設置變量的時候,要寫mysql集群的IP
2、改了yaml文件之后需要先刪掉原有的rc和pods
kubectl delete rc myweb kubectl delete pods --grace-period=0 --force --all
3、按照上面的創建步驟創建一遍,再測試就可以了

