為了避免遺忘,自己在學習k8s時,部署搭建第一個小例子,踩過的坑記錄一下
一、描述
創建一個簡單的Java web程序,此 Java Web 應用 的 結構 比較 簡單, 是一 個 運行 在 Tomcat 里 的 Web App, 如圖 1. 1 所示, JSP頁面通過 JDBC 直接訪問 MySQL 數據庫並展示數據。 為了演示和簡化的目的,只要程序正確連接到了數據庫上,它就會自動完成對應的 Table的創建與初始化數據的准備工作。所以,當我們通過瀏覽器訪問此應用的時候,就會顯示一個表格的頁面,數據則來自數據庫。
此應用需要啟動兩個容器:Web App容器和MySQL容器,並且Web App容器需要訪問MySQL容器。 在Docker 時代,假設我們在一個宿主機上啟動了這兩個容器,則我們需要把MySQL容器的 IP 地址通過環境變量的方式注入Web App容器里;同時,需要將 WebApp 容器的8080 端口映射到宿主機的8080端口,以便能在外部訪問。在本章的這個例子里,我們看看在Kubernetes 時代是如何完成這個目標的。
二、環境准備
1、關閉CentOS 自帶防火牆服務
-
# systemctl disable firewalld
-
# systemctl stop firewalld
2、安裝 etcd和Kubernetes軟件(會自動安裝Docker軟件)
# yum install -y etcd kubernetes
3、安裝好軟件后,修改兩個配置文件
Docker配置文件 /etc/sysconfig/docker,其中OPTIONS的內容設置為:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
Kubernets apiserver配置文件 /etc/kubernetes/apiserver,將 –adminssion_control參數中的ServiceAccount刪除
4、按順序啟動所有服務:
-
systemctl start etcd
-
systemctl start docker
-
systemctl start kube-apiserver
-
systemctl start kube-controller-manager
-
systemctl start kube-scheduler
-
systemctl start kubelet
-
systemctl start kube-proxy
5、Docker拉取mysql鏡像和tomcat鏡像
mysql鏡像
docker pull mysql:5.6
注意 這里 拉取的是 mysql:5.6 不可以是最新的版本,否則由於驅動的問題,會導致jdbc 數據庫連接錯誤。
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database
tomcat鏡像
docker pull kubeguide/tomcat-app:v1
三、啟動MySql服務
1、首先為MySql服務創建一個RC定義文件:mysql-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: mysql spec: replicas: 1 selector: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.6 imagePullPolicy: IfNotPresent ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
2、發布到Kubernetes集群
1)、創建RC
# kubectl create -f mysql-rc.yaml
2)、驗證創建是否成功
kubectl get rc
kubectl get pods
* 沒創建成功 * 一直處於ContainerCreating
3)、查找kubernetes pod卡在ContainerCreating狀態原因並解決
主要是通過“kubectl describe pod PodName”指令查看pod發生的事件,從事件列表中可以查找到錯誤信息。
# kubectl describe pod mysql
通過最后一行錯誤提示,下載鏡像超時,訪問地址被牆了
從國內鏡像下載pod-infrastructure,使用阿里鏡像服務,或者國內其它鏡像服務
下載地址 registry.cn-hangzhou.aliyuncs.com/sunyuki/pod-infrastructure,並且重新命名。 f66f4bd9b894 是我這里下載pod-infrastructure的imageId
-
# docker pull registry.cn-hangzhou.aliyuncs.com/sunyuki/pod-infrastructure
-
# docker tag f66f4bd9b894 registry.access.redhat.com/rhel7/pod-infrastructure:latest
刪除之前創建的rc,重新創建MySql Rc
-
# kubectl delete -f mysql-rc.yaml
-
# kubectl create -f mysql-rc.yaml
使用 # kubectl describe pod mysql 查看是否創建成功
通過docker ps指令查看正在運行的容器
# docker ps | grep mysql
四、構建Mysql Kubernetes Service定義文件
文件名為 mysql-scv.yaml
內容:
apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql
1、創建Service
# kubectl create -f mysql-scv.yaml
2、查看創建的service
# kubectl get svc
-
[root@localhost test]# kubectl get svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 1dmysql 10.254.138.253 <none> 3306/TCP 1m
注意到MySql服務被分配了一個值為10.254.138.253的ClusterIP地址,這是一個虛地址,隨后Kubernetes集群中其他新創建的Pod就可以通過Service的ClusterIP+端口號6379來連接和訪問它。根據Service的唯一名字,容器可以從環境變量中獲取到Service對應的ClusterIP地址和端口,從而發起TCP/IP連接請求了。
五、啟動Tomcat應用
上面我們定義和啟動了MySql服務,接下來我們采用同樣的步驟,完成Tomcat應用的啟動過程。
1、創建對應的RC文件myweb-rc.yaml
內容:
kind: ReplicationController metadata: name: myweb spec: replicas: 1 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、發布到Kubernetes集群
1)、創建RC
# kubectl create -f myweb-rc.yaml
2)、驗證創建是否成功
-
# kubectl get rc
-
# kubectl get pods
創建成功
六、構建Tomcat Kubernetes Service定義文件
文件名為 myweb-svc.yaml
內容:
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
1、創建Service
# kubectl create -f myweb-svc.yaml
2、查看創建的Service
# kubectl get svc
-
[root@localhost test]# kubectl get svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 1dmysql 10.254.138.253 <none> 3306/TCP 34mmyweb 10.254.29.1 <nodes> 8080:30001/TCP 1m
myweb可以通過30001這個端口訪問myweb(對應到8080的虛端口上)
七、通過瀏覽器訪問頁面
可以通過本機IP/127.0.0.1:30001打開tomcat頁面。
然鵝,我們使用127.0.0.1:30001/demo打開頁面提示jdbc數據庫連接錯誤。
-
[root@localhost ~] # kubectl get epNAME ENDPOINTS AGEkubernetes 192.168.80.128:6443 9hmysql 172.17.0.7:3306 9hmyweb 172.17.0.2:8080,172.17.0.3:8080,172.17.0.4:8080 + 2 more... 9h
-
[root@localhost ~] # kubectl exec -ti myweb-qrjsd -- /bin/bash
-
root@myweb- qrjsd:/usr/local/tomcat# echo $MYSQL_SERVICE_HOST
-
mysql
-
root@myweb- qrjsd:/usr/local/tomcat# echo "172.17.0.7 mysql" >> /etc/hosts
-
root@myweb- qrjsd:/usr/local/tomcat#
注意: mysql 對應的 ip 地址,大家電腦上的應該不一樣,根據 kubctl get ep 返回的 mysql ip信息來配置。 其實就是人肉把域名ip給加上去
附錄 k8s 常用用法
kubectl get po 顯示所有的 pod, 准確的說是顯示 default 命名空間下的所有pod
kubectl get no 顯示所有的node
kubectl get svc
kubectl get rc
kubectl get svc
kubectl get po --all-namespaces 所有命名空間下的pod
kubectl get po -n kube-system 只顯示 kube-system 命名空間下的所有pod
kubectl describe no node-name 顯示node-name指定的 node 的詳細情況
kubectl describe po pod-name 顯示 pod-name 指定的 pod 的詳細情況
describe 可以用於各種 k8s 資源, 比如 rc ns svc
轉載改編自:https://blog.csdn.net/wangjunsheng/article/details/85229581