Kubernetes 入門練習
版權宣告:版權歸博主所有,轉載請帶上本文連結!聯絡方式:[email protected]://blog.csdn.net/isea533/article/details/86771615
在Kubernetes 最新版本安裝過程和注意事項 中,我已經配置好了 Kubernetes 的基礎環境,接下來要按照Kubernetes 權威指南 書中的內容簡單做個練習。
Kubernetes 使用的v1.13.3 版本,在實際操作時發現和書上 v1.6.3 版本的命令沒太大區別,但是由於例子中使用的 mysql 沒有指定版本,因此,不管 Kubernetes 版本如何,跟著書上第一章的入門操作時,會遇到各種各樣的問題,錯誤的根源在 mysql 版本,但是根據錯誤資訊解決問題的過程中,往往讓人跑偏。
我自己為了方便管理,直接在/
建立了/k8s/chapter01
目錄。由於我也是正在入門,對概念性的東西以及配置引數理解不深,所以本文只是能讓你完成某些功能,並不能讓你知道為什麼這麼做,如果想要了解,可以找一些資料學習。
如果你正好也買了《Kubernetes 權威指南》這本書,先按照Kubernetes 最新版本安裝過程和注意事項 配置好環境,然後再配合本文看第 1 章 Kubernetes 入門 ,你可以避免很多坑,會讓你學的更順利。
這些坑沒必要自己踩一遍,我認為這是寫書的人沒有考慮周全導致的,是書的問題。
1. 配置 MySQL 服務
1.1 配置 MySQL ReplicationController
建立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.43 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
如果你從來沒接觸過 yaml 格式,要切記,所有屬性名的冒號後面必須有一個空格,必須形如:name:_mysql
(下劃線代表空格,不要真的輸入一個下劃線
),而不能是name:mysql
。
本文中的配置和書上的區別在image: mysql:5.6.43
,這裡指定了一個5.6
的最新版本,不用 5.7 和最新的 8 是因為驅動或者密碼機制有很多不同的地方,基本上指定這個版本後,就沒有坑
了。
1.2 下載用到的映象
既然用到了mysql:5.6.43
,建議先通過 docker 下載下來,執行docker pull mysql:5.6.43
。
1.3 根據配置建立 Pod
只需要執行命令kubectl create -f mysql-rc.yaml
即可。
如果出錯想要刪除,可以執行:kubectl delete -f mysql-rc.yaml
啟動後,通過kubectl get pods
檢視狀態。
1.4 配置 MySQL 服務
建立mysql-svc.yaml
配置檔案,寫入以下內容:
apiVersion: v1 kind: Service metadata: name: mysql spec: type: NodePort ports: - port: 3306 nodePort: 30002 selector: app: mysql
為了方便外網連線資料庫檢視資料庫問題,這裡參考書上對 tomcat 的配置,增加了NodePort
,這樣配置後,外網能通過 30002 埠訪問 MySQL 資料庫。
1.5 啟動 MySQL 服務
只需要執行命令kubectl create -f mysql-svc.yaml
(刪除和前面方式一樣,改成delete
即可)。
然後通過kubectl get svc
檢視服務狀態。
此時你也可以通過 Navicat 等資料庫管理工具連線到 MySQL 資料庫檢視。
2. 配置 Tomcat 服務
和前面一樣的套路,這裡不在細分。
建立myweb-rc.yaml
,內容如下:
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080
這裡用到了kubeguide/tomcat-app:v1
映象,通過 docker 下載即可。
特別注意,上面配置中有個replicas: 2
,因此通過該配置建立 Pod 時,會出現兩個不同的 Pod。
執行命令kubectl create -f myweb-rc.yaml
建立 Pod,只需要執行一次,但是會出現兩個 Pod,例如我這裡的輸出如下:
[root@k8s-master chapter01]# kubectl get pods NAMEREADYSTATUSRESTARTSAGE mysql-wjmlk1/1Running041m myweb-j94ws1/1Running026m myweb-vvlkg1/1Running026m
接下來建立對應的服務,檔案為myweb-svc.yaml
,內容如下:
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
這裡對外公開了 30001 埠。執行命令啟動服務kubectl create -f myweb-svc.yaml
,此時所有的服務如下:
[root@k8s-master chapter01]# kubectl get svc NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetesClusterIP10.96.0.1<none>443/TCP156m mysqlNodePort10.100.172.159<none>3306:30002/TCP42m mywebNodePort10.105.77.133<none>8080:30001/TCP28m
此時訪問http://K8s主機IP:30001/demo/
即可檢視效果。
3. 其他
如何連上 docker 容器?
執行docker ps
檢視當前執行的容器(部分)列表如下:
[root@k8s-master chapter01]# docker ps CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES db1fafff0e93a29e200a18e9"catalina.sh run"31 minutes agoUp 31 minutesk8s_myweb_myweb-vvlkg_default_00f1ad16-2ae7-11e9-8861-000c293fb758_0 01a31ce5551ea29e200a18e9"catalina.sh run"31 minutes agoUp 31 minutesk8s_myweb_myweb-j94ws_default_00f2305e-2ae7-11e9-8861-000c293fb758_0 51a678ae4a2ek8s.gcr.io/pause:3.1"/pause"31 minutes agoUp 31 minutesk8s_POD_myweb-j94ws_default_00f2305e-2ae7-11e9-8861-000c293fb758_0 74397325fb22k8s.gcr.io/pause:3.1"/pause"31 minutes agoUp 31 minutesk8s_POD_myweb-vvlkg_default_00f1ad16-2ae7-11e9-8861-000c293fb758_0 15042ef4626096e41ac53eac"docker-entrypoint.s…"45 minutes agoUp 45 minutesk8s_mysql_mysql-wjmlk_default_04017175-2ae5-11e9-8861-000c293fb758_0 31fda404c387k8s.gcr.io/pause:3.1"/pause"45 minutes agoUp 45 minutesk8s_POD_mysql-wjmlk_default_04017175-2ae5-11e9-8861-000c293fb758_0
複製想要連線的容器 ID,例如第一個的 Tomcat 容器db1fafff0e93
,執行下面命令:
docker exec -it db1fafff0e93 /bin/bash
然後就進入了容器中,此時命令列顯示如下:
root@myweb-vvlkg:/usr/local/tomcat#
通過cd webapps/demo/
進入 web 專案的目錄,可以看看index.jsp
的內容,執行cat index.jsp
輸出如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>HPE University Docker&Kubernetes Learning</title> </head> <bodyalign="center"> <% java.sql.Connection conn=null; java.lang.String strConn; java.sql.Statement stmt=null; java.sql.ResultSet rs=null; Class.forName("com.mysql.jdbc.Driver").newInstance(); try{ Class.forName("com.mysql.jdbc.Driver"); String ip=System.getenv("MYSQL_SERVICE_HOST"); String port=System.getenv("MYSQL_SERVICE_PORT"); ip=(ip==null)?"localhost":ip; port=(port==null)?"3306":port; System.out.println("Connecting to database..."); conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456"); stmt = conn.createStatement(); String sql = "show databases like 'HPE_APP'"; rs =stmt.executeQuery(sql); if(!rs.next()) { sql = "CREATE DATABASE HPE_APP DEFAULT CHARSET utf8 COLLATE utf8_general_ci"; stmt.executeUpdate(sql); System.out.println("Database created successfully..."); sql = "CREATE TABLE HPE_APP.T_USERS (ID INT NOT NULL AUTO_INCREMENT ,USER_NAME VARCHAR(100),LEVEL VARCHAR(20), PRIMARY KEY ( ID ))"; stmt.executeUpdate(sql); System.out.println("table created successfully..."); sql="insert into HPE_APP.T_USERS(USER_NAME,LEVEL) values('me','100')"; stmt.executeUpdate(sql); sql="insert into HPE_APP.T_USERS(USER_NAME,LEVEL) values('our team','100')"; stmt.executeUpdate(sql); sql="insert into HPE_APP.T_USERS(USER_NAME,LEVEL) values('HPE','100')"; stmt.executeUpdate(sql); sql="insert into HPE_APP.T_USERS(USER_NAME,LEVEL) values('teacher','100')"; stmt.executeUpdate(sql); sql="insert into HPE_APP.T_USERS(USER_NAME,LEVEL) values('docker','100')"; stmt.executeUpdate(sql); sql="insert into HPE_APP.T_USERS(USER_NAME,LEVEL) values('google','100')"; stmt.executeUpdate(sql); System.out.println("demo records inserted successfully..."); } %> <h2>Congratulations!!</h2> <br></br> <input type="button" value="Add..." onclick="location.href='input.html'" > <br></br> <TABLE align="center"border="1" width="600px"> <TR> <TD>Name</TD> <TD>Level(Score)</TD> </TR> <% rs = stmt.executeQuery("SELECT * FROMHPE_APP.T_USERS order by id desc"); while(rs.next()) { System.out.println("find record"); %> <TR> <TD><%= rs.getString("USER_NAME") %></TD> <TD><%= rs.getString("LEVEL") %></TD> </TR> <% } %> </TABLE> <% }catch(Exception se){ se.printStackTrace(); %> <h3> Error:<%= se %></h3> <% }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(Exception se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(Exception se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); %> </body> </html>
可以看到兩個關鍵的環境變數:MYSQL_SERVICE_HOST
和MYSQL_SERVICE_PORT
,控制檯執行命令檢視:
root@myweb-vvlkg:/usr/local/tomcat/webapps/demo# echo $MYSQL_SERVICE_HOST 10.100.172.159
這裡的 IP 和上面執行kubectl get svc
時 mysql 對應的虛擬 IP 相同。
執行export
看看所有的環境變數,輸出如下:
root@myweb-vvlkg:/usr/local/tomcat/webapps/demo# export declare -x CATALINA_HOME="/usr/local/tomcat" declare -x HOME="/root" declare -x HOSTNAME="myweb-vvlkg" declare -x JAVA_DEBIAN_VERSION="7u101-2.6.6-1~deb8u1" declare -x JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/jre" declare -x JAVA_VERSION="7u101" declare -x KUBERNETES_PORT="tcp://10.96.0.1:443" declare -x KUBERNETES_PORT_443_TCP="tcp://10.96.0.1:443" declare -x KUBERNETES_PORT_443_TCP_ADDR="10.96.0.1" declare -x KUBERNETES_PORT_443_TCP_PORT="443" declare -x KUBERNETES_PORT_443_TCP_PROTO="tcp" declare -x KUBERNETES_SERVICE_HOST="10.96.0.1" declare -x KUBERNETES_SERVICE_PORT="443" declare -x KUBERNETES_SERVICE_PORT_HTTPS="443" declare -x LANG="C.UTF-8" declare -x MYSQL_PORT="tcp://10.100.172.159:3306" declare -x MYSQL_PORT_3306_TCP="tcp://10.100.172.159:3306" declare -x MYSQL_PORT_3306_TCP_ADDR="10.100.172.159" declare -x MYSQL_PORT_3306_TCP_PORT="3306" declare -x MYSQL_PORT_3306_TCP_PROTO="tcp" declare -x MYSQL_SERVICE_HOST="10.100.172.159" declare -x MYSQL_SERVICE_PORT="3306" declare -x OLDPWD="/usr/local/tomcat" declare -x OPENSSL_VERSION="1.0.2h-1" declare -x PATH="/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" declare -x PWD="/usr/local/tomcat/webapps/demo" declare -x SHLVL="1" declare -x TERM="xterm" declare -x TOMCAT_MAJOR="8" declare -x TOMCAT_TGZ_URL="https://www.apache.org/dist/tomcat/tomcat-8/v8.0.35/bin/apache-tomcat-8.0.35.tar.gz" declare -x TOMCAT_VERSION="8.0.35"
4. 總結
入門只是一個很簡單的例子,但是因為書中沒有指定 mysql 的版本,你會遇到各種各樣的問題,細節很重要,有一點點的不認真,都可能要付出百倍的時間來解決,所以希望本文能節省大家的時間,讓大家能避免類似的錯誤。