基于Kubernetes和Docke實(shí)現(xiàn)留言簿案例
一、介紹
本案例基于Kubernetes和Docker,其中包括
1、web前端
2、redis master
3、redis slave
其中web前端通過javascript redis api和redis master交互
kubernetes體系架構(gòu)

二、配置
0、先決條件
Kubernetes 集群
1、啟動(dòng)redis master
使用replication controller確保只有一個(gè)pod在運(yùn)行(當(dāng)某個(gè)節(jié)點(diǎn)down了,rc會(huì)在另一個(gè)健康的node啟動(dòng)redis master),但可能會(huì)有數(shù)據(jù)丟失。
[root@centos1 example]# kubectl create -f redis-master-controller.json replicationcontrollers/redis-master [root@centos1 example]# kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS redis-master master redis name=redis-master 1
驗(yàn)證master運(yùn)行成功,如下展示了pod運(yùn)行在centos2/192.168.1.112這臺(tái)機(jī)器上
[root@centos1 example]# kubectl get pods
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE
redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running 55 seconds
master redis Running 55 seconds
SSH到centos2/192.168.1.112查看docker狀態(tài)
[root@centos2 yum.repos.d]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 91689ce56668 redis:latest "/entrypoint.sh redi 3 minutes ago Up 3 minutes k8s_master.52732b08_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_97e79b7b 38c3180813c3 gcr.io/google_containers/pause:0.8.0 "/pause" 3 minutes ago Up 3 minutes k8s_POD.49eee8c2_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_298e038f
注意:kubectl create執(zhí)行后,如果鏡像不存在,會(huì)執(zhí)行docker pull,根據(jù)網(wǎng)絡(luò)情況,下載中的pods 在kubertnetes UI上會(huì)顯示pending狀態(tài)
2、啟動(dòng)master service
一個(gè)kubernetes service會(huì)對(duì)一個(gè)或多個(gè)container進(jìn)行負(fù)載均衡,這是通過我們上面redis-master中定義的labels元數(shù)據(jù)實(shí)現(xiàn)的,值得注意的是,在redis中只有一個(gè)master,但是我們依然為它創(chuàng)建一個(gè)service,這是因?yàn)檫@樣我們就能使用一個(gè)elastic IP來路由到具體某一個(gè)master。
kubernetes集群中的service是通過container中的環(huán)境變量實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的,service基于pod label實(shí)現(xiàn)container的負(fù)載均衡。
在第一步中創(chuàng)建的pod包含了一個(gè)label“name=redis-master”,service的selector字段決定了service將流量轉(zhuǎn)發(fā)給哪個(gè)pod,port和targetPort信息定義了service proxy運(yùn)行在什么端口。
[root@centos1 example]# kubectl create -f redis-master-service.json services/redis-master [root@centos1 example]# kubectl get services NAME LABELS SELECTOR IP(S) PORT(S) redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP
上面的運(yùn)行成功后,所有pods都能發(fā)現(xiàn)redis master運(yùn)行在6379端口,從salve到master流量走向會(huì)有以下兩步:
1、一個(gè)redis slave會(huì)連接到redis master service的port上
2、流量會(huì)從service節(jié)點(diǎn)上的port到targetPort
如果targetPort未指定,默認(rèn)和port一致
3、啟動(dòng)replicated slave pod
雖然redis master是一個(gè)單獨(dú)的pod,redis slaves是一個(gè)replicated pod,在Kubernetes中,一個(gè)Replication Controller負(fù)責(zé)管理一個(gè)replicated pod的多個(gè)實(shí)例,RC會(huì)自動(dòng)拉起down掉的replica(可以通過殺死docker 進(jìn)程方式簡單測試)
[root@centos1 example]# kubectl create -f redis-slave-controller.json
replicationcontrollers/redis-slave
[root@centos1 example]# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
redis-master master redis name=redis-master 1
redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2
[root@centos1 example]# kubectl get pods
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE
redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running 41 minutes
master redis Running 41 minutes
redis-slave-31tkb 172.17.0.10 centos2/192.168.1.112 name=redis-slave Running 29 seconds
slave kubernetes/redis-slave:v2 Running 28 seconds
redis-slave-uk8nu 172.17.0.11 centos2/192.168.1.112 name=redis-slave Running 29 seconds
slave kubernetes/redis-slave:v2 Running 28 seconds
可以看到一個(gè)master pod和兩個(gè)slave pod
4、啟動(dòng)slave service
和master一樣,我們希望有一個(gè)代理服務(wù)連接到redis slave,除了服務(wù)發(fā)現(xiàn)之外,slave service還為web app client提供了透明代理。
這次service 的selector是name=redis-slave,我們可以方便的使用kubectl get services -l "label=value"命令來定位這些服務(wù)
[root@centos1 example]# kubectl create -f redis-slave-service.json services/redis-slave [root@centos1 example]# kubectl get services NAME LABELS SELECTOR IP(S) PORT(S) redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP
5、創(chuàng)建frontend pod
這是一個(gè)簡單的PHP 服務(wù),用來和master service(寫請(qǐng)求)或slave service(讀請(qǐng)求)交互
[root@centos1 example]# kubectl create -f frontend-controller.json replicationcontrollers/frontend [root@centos1 example]# kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS frontend php-redis kubernetes/example-guestbook-php-redis:v2 name=frontend 3 redis-master master redis name=redis-master 1 redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2
運(yùn)行成功后,查看當(dāng)前pod運(yùn)行狀態(tài)
[root@centos1 example]# kubectl get pods
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE
frontend-fr5z1 172.17.0.13 centos2/192.168.1.112 name=frontend Running 2 minutes
php-redis kubernetes/example-guestbook-php-redis:v2 Running 2 minutes
frontend-gjx3t 172.17.0.14 centos2/192.168.1.112 name=frontend Running 2 minutes
php-redis kubernetes/example-guestbook-php-redis:v2 Running 2 minutes
frontend-v608r 172.17.0.12 centos2/192.168.1.112 name=frontend Running 2 minutes
php-redis kubernetes/example-guestbook-php-redis:v2 Running 2 minutes
redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running 53 minutes
master redis Running 53 minutes
redis-slave-31tkb 172.17.0.10 centos2/192.168.1.112 name=redis-slave Running 12 minutes
slave kubernetes/redis-slave:v2 Running 12 minutes
redis-slave-uk8nu 172.17.0.11 centos2/192.168.1.112 name=redis-slave Running 12 minutes
slave kubernetes/redis-slave:v2 Running 12 minutes
可以看到一個(gè)redis master,兩個(gè)redis slave和三個(gè)frontend pods
6、創(chuàng)建guestbook service
和其他service一樣,你可以創(chuàng)建一個(gè)service管理frontend pods
[root@centos1 example]# kubectl create -f frontend-service.json services/frontend [root@centos1 example]# kubectl get services NAME LABELS SELECTOR IP(S) PORT(S) frontend name=frontend name=frontend 10.254.154.111 80/TCP redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP
我們可以通過frontend service(10.254.154.111)訪問pods,但是這個(gè)IP明顯是無法在外部訪問的,下一節(jié)講解如何在外部網(wǎng)絡(luò)訪問guestbook
7、外部網(wǎng)絡(luò)訪問guestbook
kubernetes 支持兩種訪問暴露一個(gè)服務(wù)到外部IP地址NodePorts 和LoadBalancers,另外可以查看防火墻,找到service對(duì)應(yīng)的端口,如下
[root@centos1 example]# kubectl get pods,services
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE
frontend-fr5z1 172.17.0.13 centos2/192.168.1.112 name=frontend Running 22 minutes
php-redis kubernetes/example-guestbook-php-redis:v2 Running 22 minutes
frontend-gjx3t 172.17.0.14 centos2/192.168.1.112 name=frontend Running 22 minutes
php-redis kubernetes/example-guestbook-php-redis:v2 Running 22 minutes
frontend-v608r 172.17.0.12 centos2/192.168.1.112 name=frontend Running 22 minutes
php-redis kubernetes/example-guestbook-php-redis:v2 Running 22 minutes
redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running About an hour
master redis Running About an hour
redis-slave-31tkb 172.17.0.10 centos2/192.168.1.112 name=redis-slave Running 32 minutes
slave kubernetes/redis-slave:v2 Running 32 minutes
redis-slave-uk8nu 172.17.0.11 centos2/192.168.1.112 name=redis-slave Running 32 minutes
slave kubernetes/redis-slave:v2 Running 32 minutes
NAME LABELS SELECTOR IP(S) PORT(S)
frontend name=frontend name=frontend 10.254.154.111 80/TCP
kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.2 443/TCP
kubernetes-ro component=apiserver,provider=kubernetes <none> 10.254.0.1 80/TCP
redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP
redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP
[root@centos1 example]# kubectl get services
NAME LABELS SELECTOR IP(S) PORT(S)
frontend name=frontend name=frontend 10.254.154.111 80/TCP
kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.2 443/TCP
kubernetes-ro component=apiserver,provider=kubernetes <none> 10.254.0.1 80/TCP
redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP
redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP
發(fā)現(xiàn)redis-master是在10.254.154.90上,登錄到centos2上,執(zhí)行iptables-save,發(fā)現(xiàn)其中有這樣一條規(guī)則
說明,centos2本機(jī)的49038端口映射到master container內(nèi)的6379了,當(dāng)然我們就能執(zhí)行在本機(jī)訪問redis了
[root@centos2 yum.repos.d]# redis-cli -p 49038 127.0.0.1:49038> set a b OK 127.0.0.1:49038> get a "b"
8、使用curl簡單測試
提交數(shù)據(jù)
查詢數(shù)據(jù)
附本案例用到的6個(gè).json文件
1、redis-master-controller.json
{
"kind":"ReplicationController",
"apiVersion":"v1beta3",
"metadata":{
"name":"redis-master",
"labels":{
"name":"redis-master"
}
},
"spec":{
"replicas":1,
"selector":{
"name":"redis-master"
},
"template":{
"metadata":{
"labels":{
"name":"redis-master"
}
},
"spec":{
"containers":[
{
"name":"master",
"image":"redis",
"ports":[
{
"containerPort":6379
}
]
}
]
}
}
}
}
2、redis-master-service.json
{
"kind":"Service",
"apiVersion":"v1beta3",
"metadata":{
"name":"redis-master",
"labels":{
"name":"redis-master"
}
},
"spec":{
"ports": [
{
"port":6379,
"targetPort":6379
}
],
"selector":{
"name":"redis-master"
}
}
}
3、redis-slave-controller.json
{
"kind":"ReplicationController",
"apiVersion":"v1beta3",
"metadata":{
"name":"redis-slave",
"labels":{
"name":"redis-slave"
}
},
"spec":{
"replicas":2,
"selector":{
"name":"redis-slave"
},
"template":{
"metadata":{
"labels":{
"name":"redis-slave"
}
},
"spec":{
"containers":[
{
"name":"slave",
"image":"kubernetes/redis-slave:v2",
"ports":[
{
"containerPort":6379
}
]
}
]
}
}
}
}
4、redis-slave-service.json
{
"kind":"Service",
"apiVersion":"v1beta3",
"metadata":{
"name":"redis-slave",
"labels":{
"name":"redis-slave"
}
},
"spec":{
"ports": [
{
"port":6379
}
],
"selector":{
"name":"redis-slave"
}
}
}
5、frontend-controller.json
{
"kind":"ReplicationController",
"apiVersion":"v1beta3",
"metadata":{
"name":"frontend",
"labels":{
"name":"frontend"
}
},
"spec":{
"replicas":3,
"selector":{
"name":"frontend"
},
"template":{
"metadata":{
"labels":{
"name":"frontend"
}
},
"spec":{
"containers":[
{
"name":"php-redis",
"image":"kubernetes/example-guestbook-php-redis:v2",
"ports":[
{
"containerPort":80
}
]
}
]
}
}
}
}
6、frontend-service.json
{
"kind":"Service",
"apiVersion":"v1beta3",
"metadata":{
"name":"frontend",
"labels":{
"name":"frontend"
}
},
"spec":{
"ports": [
{
"port":80
}
],
"selector":{
"name":"frontend"
}
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- kubernetes1.5.2升級(jí)到kubernetes1.10一些主要的設(shè)定修改記錄
- Kubernetes(k8s)基礎(chǔ)介紹
- centos7搭建docker私人倉庫的方法(kubernetes)
- 使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法
- Docker實(shí)踐—CentOS7上部署Kubernetes詳解
- docker kubernetes dashboard安裝部署詳細(xì)介紹
- 詳解PHP版本兼容之openssl調(diào)用參數(shù)
- php7安裝openssl擴(kuò)展方法
- 詳解Linux(centos7)下安裝OpenSSL安裝圖文方法
- 使用OpenSSL生成Kubernetes證書的介紹
相關(guān)文章
詳解docker中Dockerfile指令創(chuàng)建鏡像
這篇文章主要介紹了詳解docker中Dockerfile指令創(chuàng)建鏡像,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
docker已啟動(dòng)容器修改添加端口映射的兩種方法
最近工作中遇到一個(gè)問題,docker容器啟動(dòng)后怎么修改端口映射?通過查找相關(guān)資料解決了,這篇文章主要給大家介紹了關(guān)于docker已啟動(dòng)容器修改添加端口映射的兩種方法,需要的朋友可以參考下2022-08-08
一些常見的精簡Docker?file規(guī)則總結(jié)
這篇文章主要介紹了一些常見的精簡Docker?file規(guī)則的相關(guān)資料,這些精簡規(guī)則有助于優(yōu)化Dockerfile,生成更高效、簡潔的鏡像,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
Redis快速部署為Docker容器的實(shí)現(xiàn)方法
本文主要介紹了Redis快速部署為Docker容器的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
解決docker run后容器出現(xiàn)Exited (0)情況的問題
這篇文章主要介紹了解決docker run后容器出現(xiàn)Exited (0)情況的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Docker部署前后端分離項(xiàng)目的三種方式小結(jié)
本文主要介紹了Docker部署前后端分離項(xiàng)目的三種方式小結(jié),包含通過兩個(gè)容器部署,通過compose編排容器自動(dòng)部署和將前后端項(xiàng)目打成一個(gè)鏡像部署的三種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
docker入門教程(利用docker部署web應(yīng)用)
docker是一個(gè)用來裝應(yīng)用的容器,就像杯子可以裝水,筆筒可以放筆,書包可以放書,可以把hello word放在docker中,可以把網(wǎng)站放入docker中,可以把任何想得到的程序放在docker中,這篇文章主要介紹了docker入門(利用docker部署web應(yīng)用),需要的朋友可以參考下2023-02-02
使用Docker搭建Apache Kafka環(huán)境的詳細(xì)過程
這篇文章主要介紹了使用Docker搭建Apache Kafka環(huán)境,本文使用Docker技術(shù)創(chuàng)建單個(gè)Kafka節(jié)點(diǎn)和Kafka集群環(huán)境,并且使用可視化工具連接服務(wù)查看代理服務(wù)器的配置信息,需要的朋友可以參考下2022-10-10

