kubernetes集羣應用部署實例

今天,咱們將要帶來入門hello world示例,它是一個web留言板應用,基於PHP+Redis的兩層分佈式架構的web應用,前端PHP web網站經過訪問後端Redis數據庫完成用戶留言的查詢和添加功能,具有讀寫分離能力,留言板內容是從redis中查詢到的,首頁中添加留言並提交後,留言會被添加到redis中。php

有三個前端節點:php-frontend,對網站的訪問進行負載均衡html

有兩個redis後端節點:一個redis-master和兩個redis-slave,兩個redis-slave從redis-master進行同步數據前端

php-frontend進行了讀寫分離,即在寫入的時候寫入主庫,而讀取的時候從從庫讀取。node

客戶經過客戶端訪問的時候,訪問前端相應的地址便可。python

 

 

總體的架構是這個樣子:web

 

 

1.建立redis-master Pod和服務redis

先定義RC來建立pod,而後定義與之關聯的service。docker

爲redis-master服務新建一個名爲redis-master-controller.yaml的replicationcontroller定義文件,內容爲:數據庫

[root@uat-app01 etc]# mkdir /etc/k8s_yaml
[root@uat-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

 

建立好文件後,執行以下命令:vim

[root@uat-app01 k8s_yaml]# kubectl create -f /etc/k8s_yaml/redis-master-controller.yaml 
replicationcontroller "redis-master" created

 

查看剛纔新建的RC信息:

[root@uat-app01 k8s_yaml]# kubectl get rc
NAME           DESIRED   CURRENT   READY     AGE
redis-master   1         1         0         48s

 

查看pods信息:

[root@uat-app01 k8s_yaml]# kubectl get pods
NAME                 READY     STATUS              RESTARTS   AGE
redis-master-2qftt   0/1       ContainerCreating   0          1m

 

查看pod redis-master-2qftt 信息:

 

[root@uat-app01 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

[root@uat-app01 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安裝

[root@uat-ucs01 kubernetes]# yum install python-rhsm.x86_64 0:1.19.10-1.el7_4

安裝後,該文件存在,問題解決

 

建立於redis-master pod相關聯的service,文件內容以下:

 

[root@uat-app01 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:

[root@uat-app01 k8s_yaml]# kubectl create -f /etc/k8s_yaml/redis-master-service.yaml 
service "redis-master" created

 

查看新建的service:

[root@uat-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

 

建立好文件後,執行以下命令:

[root@uat-app01 k8s_yaml]# kubectl create -f /etc/k8s_yaml/redis-slave-controller.yaml 
replicationcontroller "redis-slave" created

 

查看剛纔新建的RC信息:

[root@uat-app01 k8s_yaml]# kubectl get rc redis-slave
NAME          DESIRED   CURRENT   READY     AGE
redis-slave   2         2         0         39s

 

配置文件redis-salve-service.yaml內容以下:

[root@uat-app01 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:

[root@uat-app01 k8s_yaml]# kubectl create -f redis-slave-service.yaml
service "redis-slave" created

 

檢查service:

[root@uat-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

[root@uat-app01 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

[root@uat-app01 k8s_yaml]#  kubectl create -f /etc/k8s_yaml/frontend-controller.yaml
replicationcontroller "frontend" created

 

建立frontend的service,前端的service是須要外部訪問的,因此進行以下配置

[root@uat-app01 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
[root@uat-app01 k8s_yaml]# kubectl create -f /etc/k8s_yaml/frontend-service.yaml
service "frontend" created

 

建立好以上rc、pod、service後查看pod狀況

[root@uat-app01 ~]# 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

相關文章
相關標籤/搜索