??博主簡介
????云計算領(lǐng)域優(yōu)質(zhì)創(chuàng)作者
????華為云開發(fā)者社區(qū)專家博主
????阿里云開發(fā)者社區(qū)專家博主
??交流社區(qū):運維交流社區(qū) 歡迎大家的加入!
1、啟動 mysql 項目
1-1 創(chuàng)建 mysql-rc.yaml
RC(ReplicationController)是Kubernetes系統(tǒng)中的核心概念之一,簡單來說,它其實定義了一個期望的場景,即聲明某種Pod的副本數(shù)量在任意時刻都符合某個預(yù)期值,所以RC的定義包括如下幾個部分。
◎ Pod期待的副本數(shù)量。
◎ 用于篩選目標Pod的Label Selector。
◎ 當Pod的副本數(shù)量小于預(yù)期數(shù)量時,用于創(chuàng)建新Pod的Pod模板(template)。
首先先編排一個關(guān)于mysql的RC(ReplicationController)yaml文件。
cat > mysql-rc.yaml <<EOF
apiVersion: v1
kind: ReplicationController # 類型是副本控制器
metadata:
name: mysql # RC的名稱全局是唯一的,這里name是mysql
spec:
replicas: 1 # 副本數(shù)量1
selector: # RC管理 擁有l(wèi)abel={app:mysql}這個標簽的 pod
app: mysql
template: # template代表下面開始定義一個pod
metadata:
labels:
app: mysql # 這個pod擁有{app:mysql}這樣一個標簽
spec:
containers: # pod中的容器定義部分
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306 # 容器監(jiān)聽的端口
env: # 注入容器里面的環(huán)境變量
- name: MYSQL_ROOT_PASSWORD
value: "123456"
EOF
以上YAML定義文件中
- kind屬性用來表明此資源對象的類型,比如這里的值為ReplicationController,表示這是一個RC
- spec一節(jié)中是RC的相關(guān)屬性定義,比如spec.selector是RC的Pod標簽選擇器,即監(jiān)控和管理擁有這些標簽的Pod實例,確保在當前集群中始終有且僅有replicas個Pod實例在運行,這里設(shè)置replicas=1,表示只能運行一個MySQL Pod實例。
- 當在集群中運行的Pod數(shù)量少于replicas時,RC會根據(jù)在spec.template一節(jié)中定義的Pod模板來生成一個新的Pod實例,spec.template.metadata.labels指定了該Pod的標簽,需要特別注意的是:這里的labels必須匹配之前的spec.selector,否則此RC每創(chuàng)建一個無法匹配Label的Pod,就會不停地嘗試創(chuàng)建新的Pod,陷入惡性循環(huán)中。
1-1-1 將RC發(fā)布到k8s集群里面去
kubectl apply -f mysql-rc.yaml
1-1-2 查看集群中的pods
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-hk852 1/1 Running 0 8s
1-1-3 負載均衡 副本實例(數(shù)據(jù)庫不需要開多個副本)這里只舉例如何多開副本
- 我們可以看到只有一個,我們?nèi)绻枰撦d均衡的話可以多加幾個
rc副本
,但是這里面只要一個數(shù)據(jù)庫就好了,數(shù)據(jù)庫一般不會做負載均衡,就算做負載均衡,就要做其他操作,比如同步數(shù)據(jù),不同步數(shù)據(jù)的話數(shù)據(jù)就會亂。這里創(chuàng)建多個副本只是講一下。
kubectl scale rc mysql --replicas=5
- 再次查看pod
kubectl get pods
現(xiàn)在啟動了5個mysql,負載均衡完成。
1-2 創(chuàng)建 mysql-svc.yaml
最后,我們創(chuàng)建一個與之關(guān)聯(lián)的kubenetes Service-MYSQL 的定義文件(文件名為:mysql-svc.yaml),完整的內(nèi)容和解析如下;
cat > mysql-svc.yaml << EOF
apiVersion: v1
kind: Service # 類型是service
metadata:
name: mysql # 這個service的全局唯一名稱
spec:
ports:
- port: 3306 # service提供服務(wù)的端口號
selector:
app: mysql # 把擁有{app:label}這個標簽的pod應(yīng)用到這個服務(wù)里面
EOF
其中metadata.name 是Service的服務(wù)名(ServiceName);port屬性則定義了Service的端口;sepc.selector確定了那些Pod副本(實例)對應(yīng)到本服務(wù)。類似地,我們通過kubectl apply 命令創(chuàng)建Service對象。
1-2-1 將services應(yīng)用到集群中
光有RC是不行的,RC不會提供服務(wù)的,需要一個Service。將它應(yīng)用到集群里面去。
kubectl apply -f mysql-svc.yaml
1-2-2 查看services
kubectl get svc
??注意到,MySQL服務(wù)被分配了一個值為 10.100.130.176 的Cluster IP地址。隨后,Kubernetes集群中其他新創(chuàng)建的Pod就可以通過Service的Cluster IP+端口號3306來連接和訪問它了。但是要注意,外部是無法去訪問這個Mysql的,3306只是對其他pod開放的端口號?;貞浺幌?,之前的pod,node架構(gòu)圖就知道了。
?
??通常,Cluster IP是在Service創(chuàng)建后由Kubernetes系統(tǒng)自動分配的,其他Pod無法預(yù)先知道某個Service的Cluster IP地址,因此需要一個服務(wù)發(fā)現(xiàn)機制來找到這個服務(wù)。為此,最初時,Kubernetes巧妙地使用了Linux環(huán)境變量(Environment Variable)來解決這個問題,后面會詳細說明其機制?,F(xiàn)在只需知道,根據(jù)Service的唯一名稱,容器可以從環(huán)境變量中獲取Service對應(yīng)的Cluster IP地址和端口,從而發(fā)起TCP/IP連接請求。這個地方挺像Nacos里面一樣的,只要應(yīng)用名稱就可以自動訪問到。不用配置什么具體的ip什么的。
1-3 附加:如何找到并進入mysql數(shù)據(jù)庫中?
如果需要查看mysql的表或者數(shù)據(jù)的話,可以這樣來看;
- 首先:查看mysql在哪個集群中,當然單機架構(gòu)就沒事了;
kubectl get pods -o wide
可以看到mysql在node2節(jié)點上,我們就可以去node2集群中去找到mysql-4fxv6
這個容器;
- 切換到node2節(jié)點
[root@k8s-node2 ~]# docker ps -a | grep mysql-4fxv6
過濾出來了兩個容器,選第一個就行,因為第二個是屬于一個控制器,容器名為:k8s_mysql_mysql-4fxv6_default_a6be3c5d-72ef-40d9-b6b7-83e31c4f5d86_0
- 進入該容器
[root@k8s-node1 ~]# docker exec -it k8s_mysql_mysql-4fxv6_default_a6be3c5d-72ef-40d9-b6b7-83e31c4f5d86_0 bash
- 進入數(shù)據(jù)庫
mysql -uroot -p123456
這樣就進入到數(shù)據(jù)庫中了,可以自行查看表結(jié)構(gòu)或者增刪改查數(shù)據(jù)之類的了。
- 還有一種進入數(shù)據(jù)庫容器的方法;
使用方法:
kubectl exec -it pod名字 -n名稱空間 bash
實例:
kubectl exec -it mysql-4fxv6 bash
為什么這樣進入數(shù)據(jù)庫,用工具連接不好嗎?
?
??答:因為mysql端口沒有對外,使用navicat等工具并不能連接上。
2、啟動 tomcat 項目
這個tomcat是書里面特定的,所以說我們要先去拉取一下這個鏡像,這個鏡像是作者已經(jīng)制定好了的。
2-1 拉取特定的tomcat鏡像
docker pull kubeguide/tomcat-app:v1
拉取完成之后,寫yaml文件。
2-2 創(chuàng)建 tomcat-rc.yaml
cat > tomcat-rc.yaml << EOF
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'
EOF
注意:Tomcat 容器內(nèi),應(yīng)用將使用環(huán)境變量 MYSQL_ SERVICE_ HOST 的值連接 MYSQL 務(wù)。更安全可靠的用法是使用服務(wù)的名稱“mysql”。
2-2-1 將RC發(fā)布到k8s集群里面去
kubectl apply -f tomcat-rc.yaml
這里面有5個副本就不用在多創(chuàng)建了,5個就夠了,當然自己想要更多可以根據(jù)自己的情況創(chuàng)建。
2-2-2 查看集群中的pods
[root@k8s-master ~]# kubectl get pods | grep myweb
myweb-56tzt 1/1 Running 0 7m37s
myweb-7h9t8 1/1 Running 0 7m37s
myweb-kzq69 1/1 Running 0 7m37s
myweb-tncrc 1/1 Running 0 7m37s
myweb-wprk4 1/1 Running 0 7m37s
可以看到已經(jīng)創(chuàng)建了5個pod,接下來就該創(chuàng)建對外開放的端口也就是services了。
2-3 創(chuàng)建 tomcat-svc.yaml
cat > tomcat-svc.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001 # 對外暴露端口,使得k8s之外的人可以訪問到這個服務(wù)
selector:
app: myweb
EOF
type=NodePort和nodePort=30001的兩個屬性表明此Service開啟了NodePort方式的外網(wǎng)訪問模式。在Kubernetes集群之外,比如在本機的瀏覽器里,可以通過30001這個端口訪問myweb(對應(yīng)到8080的虛端口上)。
2-3-1 將services應(yīng)用到集群中
光有RC是不行的,RC不會提供服務(wù)的,需要一個Service。將它應(yīng)用到集群里面去。
kubectl apply -f tomcat-svc.yaml
2-3-2 查看services
kubectl get svc
30001為映射的端口,是可以對外訪問的。
3、通過瀏覽器訪問
#ip填你的master或者node的地址
http://172.16.11.221:30001
如果看不到這個網(wǎng)頁,那么可能有幾個原因:比如防火墻的問題,無法訪問 30001 端口,或者因為你是通過代理上網(wǎng)的,瀏覽器錯把虛擬機的IP地址當成遠程地址了。可以在虛擬機上直接運行 curl 127.0.0.1:30001 來驗證此端口是否能被訪問,如果還是不能訪問,那么這肯定不是機器的問題…
#ip填你的master或者node的地址
http://172.16.11.221:30001/demo/
接下來可以嘗試單擊 “Add…” 按鈕添加一條記錄并提交,如下圖所示,提交以后,數(shù)據(jù)就被寫入 MySQL 數(shù)據(jù)庫中了。
提交為submit
,提交成功會顯示如下圖;
如果失敗,既有可能是因為數(shù)據(jù)庫副本開的太多,導(dǎo)致數(shù)據(jù)寫入不知道該往哪個數(shù)據(jù)庫中寫了。
點擊return
即可返回查看到剛剛添加的數(shù)據(jù)。
文章來源:http://www.zghlxwxcb.cn/news/detail-497158.html
??至此,我們終于完成了 Kuberetes 上的 Tomcat 例子,這個例子并不是很復(fù)雜。我們也看到,相對于傳統(tǒng)的分布式應(yīng)用的部署方式,在Kuberetes 之上我們僅僅通過一些很容易理解的配置文件和相關(guān)的簡單命令就完成了對整個集群的部署,這讓我們驚詫于 Kuberetes 的創(chuàng)新和強大。 下一節(jié),我們將開始對 Kubernetes 中的基本概念和術(shù)語進行全面學(xué)習(xí),在這之前,讀者可以繼續(xù)研究下這個例子里的一些拓展內(nèi)容,如下所述。 研究 RC、Service 等配置文件的格式。文章來源地址http://www.zghlxwxcb.cn/news/detail-497158.html
到了這里,關(guān)于【云原生-K8s-1實例】通過yaml 文件編排一個web-MySQL小項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!