kubernetes集群應用部署實例
今天,我們將要帶來入門hello world示例,它是一個web留言板應用,基於PHP+Redis的兩層分布式架構的web應用,前端PHP web網站通過訪問後端Redis數據庫完成用戶留言的查詢和添加功能,具備讀寫分離能力,留言板內容是從redis中查詢到的,首頁中添加留言並提交後,留言會被添加到redis中。
有三個前端節點:php-frontend,對網站的訪問進行負載均衡
有兩個redis後端節點:一個redis-master和兩個redis-slave,兩個redis-slave從redis-master進行同步數據
php-frontend進行了讀寫分離,即在寫入的時候寫入主庫,而讀取的時候從從庫讀取。
客戶通過客戶端訪問的時候,訪問前端相應的地址即可。
整體的架構是這個樣子:
1.創建redis-master Pod和服務
先定義RC來創建pod,然後定義與之關聯的service。
為redis-master服務新建一個名為redis-master-controller.yaml的replicationcontroller定義文件,內容為:
[[email protected] etc]# mkdir /etc/k8s_yaml [[email protected]-app01 k8s_yaml]# vim /etc/k8s_yaml/redis-master-controller.yaml apiVersion: v1 #指定api版本號 kind: ReplicationController #創建資源的類型:這裏為ReplicationController metadata: #資源元數據 name: redis-master #資源名稱 labels: #資源標簽 name: redis-master #標簽名 spec: #容器的詳細定義 replicas: 1 #副本數量:這裏為1 selector: #RC通過spec.selector來篩選要控制的Pod name: redis-master template: # pod的定義 metadata: # pod元數據 labels: #pod標簽 name: redis-master spec: #指定資源內容 containers: #容器- name: master #容器名 image: kubeguide/redis-master #使用的鏡像 ports: #容器開放對外的端口號:這裏為6379 - containerPort: 6379
創建好文件後,執行如下命令:
[[email protected] k8s_yaml]# kubectl create -f /etc/k8s_yaml/redis-master-controller.yaml replicationcontroller "redis-master" created
查看剛才新建的RC信息:
[[email protected]app01 k8s_yaml]# kubectl get rc NAME DESIRED CURRENT READY AGE redis-master 1 1 0 48s
查看pods信息:
[[email protected]app01 k8s_yaml]# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-2qftt 0/1 ContainerCreating 0 1m
查看pod redis-master-2qftt 信息:
[[email protected] k8s_yaml]# kubectl describe pod redis-master-2qftt Name: redis-master-2qftt Namespace: default Node: uat-ucs02.insightcredit/192.168.1.47 Start Time: Wed, 20 Dec 2017 15:27:07 +0800 Labels: name=redis-master Status: Pending IP: Controllers: ReplicationController/redis-master Containers: master: Container ID: Image: kubeguide/redis-master Image ID: Port: 6379/TCP State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Volume Mounts: <none> Environment Variables: <none> Conditions: Type Status Initialized True Ready False PodScheduled True No volumes. QoS Class: BestEffort Tolerations: <none> Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 3m 3m 1 {default-scheduler } Normal Scheduled Successfully assigned redis-master-2qftt to uat-ucs02.insightcredit 3m 18s 5 {kubelet uat-ucs02.insightcredit} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 2m 7s 10 {kubelet uat-ucs02.insightcredit} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
這裏看到是發生了異常的:
在pull registry.access.redhat.com/rhel7/pod-infrastructure:latest 鏡像時出現問題,問題原因是 /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt文件不存在
嘗試去pull這個鏡像,發現缺失文件/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt
[[email protected] k8s_yaml]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ... open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory
查看該缺失的文件,發現為軟連接,缺少名叫rhsm的依賴,查找關於rhsm的依賴包
經過查閱發現,該缺少的rhsm包為:python-rhsm
使用yum安裝
[[email protected] kubernetes]# yum install python-rhsm.x86_64 0:1.19.10-1.el7_4
安裝後,該文件存在,問題解決
創建於redis-master pod相關聯的service,文件內容如下:
[[email protected] k8s_yaml]# vi /etc/k8s_yaml/redis-master-service.yaml apiVersion: v1 kind: Service metadata: name: redis-master labels: name: redis-master spec: ports: - port: 6379 #服務監聽的端口號 targetPort: 6379 #需要轉發到後端pod的端口號,就是容器對外開放的端口號 selector: name: redis-master
創建service:
[[email protected] k8s_yaml]# kubectl create -f /etc/k8s_yaml/redis-master-service.yaml service "redis-master" created
查看新建的service:
[[email protected]app01 k8s_yaml]# kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 5h redis-master 10.254.227.87 <none> 6379/TCP 1m
2.創建redis-slave Pod和服務
為redis-slave服務新建一個名為redis-slave-controller.yaml的replicationcontroller定義文件,內容為:
apiVersion: v1 kind: ReplicationController 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: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379
創建好文件後,執行如下命令:
[[email protected] k8s_yaml]# kubectl create -f /etc/k8s_yaml/redis-slave-controller.yaml replicationcontroller "redis-slave" created
查看剛才新建的RC信息:
[[email protected] k8s_yaml]# kubectl get rc redis-slave NAME DESIRED CURRENT READY AGE redis-slave 2 2 0 39s
配置文件redis-salve-service.yaml內容如下:
[[email protected] k8s_yaml]# vim /etc/k8s_yaml/redis-slave-service.yaml apiVersion: v1 kind: Service metadata: name: redis-slave labels: name: redis-slave spec: ports: - port: 6379 selector: name: redis-slave
創建service:
[[email protected] k8s_yaml]# kubectl create -f redis-slave-service.yaml service "redis-slave" created
檢查service:
[[email protected]app01 k8s_yaml]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 5h redis-master 10.254.227.87 <none> 6379/TCP 29m redis-slave 10.254.71.156 <none> 6379/TCP 35s
3.創建fronted pod和服務
創建frontend的rc
[[email protected] k8s_yaml]# vi /etc/k8s_yaml/frontend-controller.yaml apiVersion: v1 kind: ReplicationController metadata: name: frontend labels: name: frontend spec: replicas: 3 selector: name: frontend template: metadata: labels: name: frontend spec: containers: - name: frontend image: kubeguide/guestbook-php-frontend env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 80
創建rc
[[email protected] k8s_yaml]# kubectl create -f /etc/k8s_yaml/frontend-controller.yaml replicationcontroller "frontend" created
創建frontend的service,前端的service是需要外部訪問的,所以進行如下配置
[[email protected] k8s_yaml]# vi /etc/k8s_yaml/frontend-service.yaml apiVersion: v1 kind: Service metadata: name: frontend labels: name: frontend spec: type: NodePort #外部訪問端口形式為:通過node端口形式進行訪問 ports: - port: 80 #服務監聽的端口號 nodePort: 30001 #node上開放的外部端口 selector: name: frontend [[email protected]-app01 k8s_yaml]# kubectl create -f /etc/k8s_yaml/frontend-service.yaml service "frontend" created
創建好以上rc、pod、service後查看pod情況
[[email protected] ~]# kubectl get pods NAME READY STATUS RESTARTS AGE frontend-3bv0p 1/1 Running 0 15h frontend-kmth2 1/1 Running 0 15h frontend-vltkp 1/1 Running 0 15h redis-master-f59zp 1/1 Running 0 15h redis-slave-6rxl8 1/1 Running 0 15h redis-slave-j4jz0 1/1 Running 0 15h
在瀏覽器中輸入任意運行frontend的pod的ip地址加上我們定義好的node port 30001
我這裏是192.168.1.40:30001
留言板出現了,快來提交我們的留言吧~
hello world
kubernetes的hello world實例到此完成啦。
轉載:http://www.louisvv.com/archives/1179.html
kubernetes集群應用部署實例