Kubernetes(K8s)(五)——在K8s集群上搭建redis和docker的留言簿


(1).實驗環境

  需要三個鏡像:web前端鏡像php-frontend、redis-master和redis-slave。其中web前端通過JavaScript redis api實現與redis-master交互。

(2).擴展:flannel

  flannel是K8s默認提供的網絡插件。Flannel是由CoreOs團隊開發社交的網絡工具,CoreOS團隊采用L3 Overlay模式設計flannel, 規定宿主機下各個Pod屬於同一個子網,不同宿主機下的Pod屬於不同的子網。

  flannel會在每一個宿主機上運行名為flanneld代理,其負責為宿主機預先分配一個子網,並為Pod分配IP地址。Flannel使用Kubernetes或etcd來存儲網絡配置、分配的子網和主機公共IP等信息。數據包則通過VXLAN、UDP或host-gw這些類型的后端機制進行轉發。

  看一下flannel在Kubernetes中運行的整體過程:

(3).准備使用到的鏡像

   在兩個node節點上下載docker.io/kubeguide/guestbook-php-frontend:latest、docker.io/kubeguide/redis-master:latest、docker.io/kubeguide/guestbook-redis-slave:latest。

# docker pull docker.io/kubeguide/guestbook-php-frontend
Using default tag: latest
Trying to pull repository docker.io/kubeguide/guestbook-php-frontend ... 
latest: Pulling from docker.io/kubeguide/guestbook-php-frontend
4d2e9ae40c41: Pull complete 
a3ed95caeb02: Pull complete 
54a7f0f294dc: Pull complete 
a25fe735d07d: Pull complete 
0c906d123edf: Pull complete 
444908521f56: Pull complete 
8c642d1244eb: Pull complete 
9b221da943a2: Pull complete 
88bb2a5d51e9: Pull complete 
d74e6c5bcbaf: Pull complete 
54d6cf15da9c: Pull complete 
55f6a4aed401: Pull complete 
45539a0ff9ad: Pull complete 
023f5f1f5f40: Pull complete 
dfdabf8691ea: Pull complete 
09a6ba60b929: Pull complete 
1b0035990bdd: Pull complete 
d455473d6864: Pull complete 
7200260c49a3: Pull complete 
400be507a72c: Pull complete 
6d9e0a886b69: Pull complete 
66e7bb4a52de: Pull complete 
Digest: sha256:195181e0263bcee4ae0c3e79352bbd3487224c0042f1b9ca8543b788962188ce
Status: Downloaded newer image for docker.io/kubeguide/guestbook-php-frontend:latest
# docker pull docker.io/kubeguide/redis-master
Using default tag: latest
Trying to pull repository docker.io/kubeguide/redis-master ... 
latest: Pulling from docker.io/kubeguide/redis-master
a3ed95caeb02: Pull complete 
9cf7e98c567b: Pull complete 
d2ff49536f4d: Pull complete 
f94adccdbb9c: Pull complete 
6ead1ce47d52: Pull complete 
62a3114e0031: Pull complete 
dcb903eb752c: Pull complete 
0c2c7c7f11ef: Pull complete 
c7aa377bfeeb: Pull complete 
3d7aab9ba591: Pull complete 
85e54ffe4941: Pull complete 
4756da354f92: Pull complete 
Digest: sha256:e11eae36476b02a195693689f88a325b30540f5c15adbf531caaecceb65f5b4d
Status: Downloaded newer image for docker.io/kubeguide/redis-master:latest
# docker pull docker.io/kubeguide/guestbook-redis-slave 
Using default tag: latest
Trying to pull repository docker.io/kubeguide/guestbook-redis-slave ... 
latest: Pulling from docker.io/kubeguide/guestbook-redis-slave
70c964415e86: Pull complete 
a3ed95caeb02: Pull complete 
3229dc640f23: Pull complete 
cc7958dd97b7: Pull complete 
448093e93ac3: Pull complete 
2bbcbb97d47b: Pull complete 
87b4f6fd65c9: Pull complete 
5b712ee108fe: Pull complete 
a1a961e320bc: Pull complete 
6f37ec7ab693: Pull complete 
Digest: sha256:a36fec97659fe96b5b28750d88b5cfb84a45138bcf1397c8e237031b8855c58c
Status: Downloaded newer image for docker.io/kubeguide/guestbook-redis-slave:latest

(4).創建配置文件

  創建一個專門存放YAML配置文件的目錄

[root@kube-master ~]# mkdir -p /etc/kubernetes/yaml

 1)redis master deployment配置文件

[root@kube-master ~]# vim /etc/kubernetes/yaml/redis-master-deployment.yaml
apiVersion: extensions/v1beta1  #api版本
kind: Deployment  #類型
metadata:  #deployment元數據(屬性)
  name: redis-master  #deployment名稱
# 如果沒有設置標簽,這些標簽可以從Pod模板中應用(獲取?) # these labels can be applied automatically from the labels in the pod template if not set # labels: # app: redis # role: master # tier: backend spec:  #deployment詳細定義
# 此副本值是默認值,請根據需要修改 # this replicas value is default modify it according to your case replicas: 1  #副本期望值
# 如果沒有設置選擇器,選擇器可以從Pod模板中的標簽中應用(獲取?) # selector can be applied automatically from the labels in the pod template if not set # selector:   # matchLabels: # app: guestbook # role: master # tier: backend template:  #模板 metadata:  #Pod元數據(屬性) labels:  #自定義標簽 app: redis role: master tier: backend spec:  #Pod詳細定義 containers:  #容器 - name: master  #容器名稱的一部分 image: docker.io/kubeguide/redis-master:latest  #采用鏡像 imagePullPolicy: IfNotPresent  #鏡像拉取策略 resources:  #容器運行資源限制 requests:  #運行下限 cpu: 100m  #0.1核 memory: 100Mi  #100Mb(1024單位) ports:  #對外開放端口列表 - containerPort: 6379  #容器對外開放端口

 2)redis master service配置文件

[root@kube-master ~]# vim /etc/kubernetes/yaml/redis-master-service.yaml
apiVersion: v1  #api版本
kind: Service  #類型
metadata:  #service元數據(屬性)
  name: redis-master  #service名稱
  labels:  #自定義標簽
    app: redis
    role: master
    tier: backend
spec:  #service詳細定義
  ports:  #服務對外開放端口列表
    # the port that this service should serve on
  - port: 6379  #提供給內部Pod訪問使用的端口
    targetPort: 6379  #Pod內服務的端口
  selector:  #service作用范圍,此處是同時具備以下標簽時,采用當前service
    app: redis
    role: master
    tier: backend

 3)redis slave deployment配置文件

[root@kube-master ~]# vim /etc/kubernetes/yaml/redis-slave-deployment.yaml
apiVersion: extensions/v1beta1  #api版本
kind: Deployment  #類型
metadata:  #deployment元數據(屬性)
  name: redis-slave  #deployment名稱
  # 如果沒有設置標簽,這些標簽可以從Pod模板中應用(獲取?)
  # these labels can be applied automatically from the labels in the pod template if not set
  # labels:
  #   app: redis
  #   role: slave
  #   tier: backend
spec:  #deployment詳細定義
  # 此副本值是默認值,請根據需要修改
  # this replicas value is default modify it according to your case
  replicas: 2  #副本期望值
  # 如果沒有設置選擇器,選擇器可以從Pod模板中的標簽中應用(獲取?)
  # selector can be applied automatically from the labels in the pod template if not set
  # selector:
  #   matchLabels:
  #     app: guestbook
  #     role: slave
  #     tier: backend
  template:  #模板
    metadata:  #Pod元數據(屬性)
      labels:  #自定義標簽
        app: redis
        role: slave
        tier: backend
    spec:  #Pod詳細定義
      containers:  #容器
      - name: slave  #容器名稱的一部分
        image: docker.io/kubeguide/guestbook-redis-slave:latest  #采用鏡像
        imagePullPolicy: IfNotPresent  #鏡像拉取策略
        resources:  #容器運行資源限制
          requests:  #運行下限
            cpu: 100m  #0.1核
            memory: 100Mi  #100Mb(1024單位)
        env:  #環境變量設置
        - name: GET_HOSTS_FROM  #環境變量名稱
          value: env  #環境變量值
          # 如果集群配置不包括DNS服務,則要訪問環境變量來查找主服務的主機,請注釋掉上面的'value: dns',並取消注釋下面的行
          # If your cluster config does not include a dns service, then to
          # instead access an environment variable to find the master
          # service's host, comment out the 'value: dns' line above, and
          # uncomment the line below.
          # value: env
        ports:  #對外開放端口列表
        - containerPort: 6379  #容器對外開放端口

 4)redis slave service配置文件

[root@kube-master ~]# vim /etc/kubernetes/yaml/redis-slave-service.yaml
apiVersion: v1  #api版本
kind: Service  #類型
metadata:  #service元數據(屬性)
  name: redis-slave  #service名稱
  labels:  #自定義標簽
    app: redis
    role: slave
    tier: backend
spec:  #service詳細定義
  ports:  #服務對外開放端口列表
    # the port that this service should serve on
  - port: 6379  #提供給內部Pod訪問使用的端口
  selector:  #service作用范圍,此處同時具備以下標簽時,采用當前service
    app: redis
    role: slave
    tier: backend

 5)php frontend deployment配置文件

[root@kube-master ~]# vim /etc/kubernetes/yaml/frontend-deployment.yaml
apiVersion: extensions/v1beta1  #api版本
kind: Deployment  #類型
metadata:  #deployment元數據(屬性)
  name: frontend  #deployment名稱
  # 如果沒有設置標簽,這些標簽可以從Pod模板中應用(獲取?)
  # these labels can be applied automatically from the labels in the pod template if not set
  # labels:
  #   app: guestbook
  #   tier: frontend
spec:  #deployment詳細定義
  # 此副本值是默認值,請根據需要修改
  # this replicas value is default modify it according to your case
  replicas: 3  #副本期望值
  # 如果沒有設置選擇器,選擇器可以從Pod模板中的標簽中應用(獲取?)
  # selector can be applied automatically from the labels in the pod template if not set
  # selector:
  #   matchLabels:
  #     app: guestbook
  #     tier: frontend
  template:  #模板
    metadata:  #Pod元數據(屬性)
      labels:  #自定義標簽
        app: guestbook
        tier: frontend
    spec:  #Pod詳細定義
      containers:  #容器
      - name: php-redis  #容器名稱的一部分
        image: docker.io/kubeguide/guestbook-php-frontend:latest  #采用鏡像
        imagePullPolicy: IfNotPresent  #鏡像拉取策略
        resources:  #容器運行資源限制
          requests:  #下限
            cpu: 100m  #0.1核
            memory: 100Mi  #100Mb(1024單位)
        env:  #環境變量設置
        - name: GET_HOSTS_FROM  #環境變量名稱
          value: env  #環境變量值
          # 如果集群配置不包含DNS服務,則要訪問環境變量來查找主服務的主機,請注釋掉上面的'value: dns',並取消注釋下面的行
          # If your cluster config does not include a dns service, then to
          # instead access environment variables to find service host
          # info, comment out the 'value: dns' line above, and uncomment the
          # line below.
          # value: env
        ports:  #對外開放端口列表
        - containerPort: 80  #容器對外開放端口

 6)php frontend service配置文件

[root@kube-master ~]# vim /etc/kubernetes/yaml/frontend-service.yaml
apiVersion: v1  #api版本
kind: Service  #類型
metadata:  #service元數據(屬性)
  name: frontend  #service名稱
  labels:  #自定義標簽
    app: guestbook
    tier: frontend
spec:  #service詳細定義
  # if your cluster supports it, uncomment the following to automatically creat
e
  # an external load-balanced IP for the frontend service.
  # type: LoadBalancer
  type: NodePort  #服務訪問方式
  ports:  #服務對外開放端口列表
    # the port that this service should serve on
  - port: 80  #提供給內部Pod訪問使用的端口
    nodePort: 30001  #提供給外部訪問服務的節點上的端口
  selector:  #service作用范圍,此處同時具備以下標簽時,采用當前service
    app: guestbook
    tier: frontend

(5).通過YAML文件啟動

  啟動deployment和service

[root@kube-master ~]# kubectl create -f /etc/kubernetes/yaml/redis-master-deployment.yaml
deployment "redis-master" created
[root@kube-master ~]# kubectl create -f /etc/kubernetes/yaml/redis-master-service.yaml
service "redis-master" created
[root@kube-master ~]# kubectl create -f /etc/kubernetes/yaml/redis-slave-deployment.yaml
deployment "redis-slave" created
[root@kube-master ~]# kubectl create -f /etc/kubernetes/yaml/redis-slave-service.yaml
service "redis-slave" created
[root@kube-master ~]# kubectl create -f /etc/kubernetes/yaml/frontend-deployment.yaml
deployment "frontend" created
[root@kube-master ~]# kubectl create -f /etc/kubernetes/yaml/frontend-service.yaml
service "frontend" created

  查看deployment和service,下方數據為清理掉非相關內容后的數據。

[root@kube-master ~]# kubectl get deployment -o wide
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
frontend       3         3         3            3           6m
redis-master   1         1         1            1           6m
redis-slave    2         2         2            2           6m         
[root@kube-master ~]# kubectl get replicaset -o wide
NAME                      DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                                            SELECTOR
frontend-1186687533       3         3         3         6m        php-redis      docker.io/kubeguide/guestbook-php-frontend:latest   app=guestbook,pod-template-hash=1186687533,tier=frontend
redis-master-3671804942   1         1         1         7m        master         docker.io/kubeguide/redis-master:latest             app=redis,pod-template-hash=3671804942,role=master,tier=backend
redis-slave-2377017994    2         2         2         7m        slave          docker.io/kubeguide/guestbook-redis-slave:latest    app=redis,pod-template-hash=2377017994,role=slave,tier=backend
[root@kube-master ~]# kubectl get pod -o wide                       
NAME                            READY     STATUS    RESTARTS   AGE       IP            NODE
frontend-1186687533-4jns2       1/1       Running   0          7m        10.255.31.8   kube-node2
frontend-1186687533-dqcdj       1/1       Running   0          7m        10.255.39.4   kube-node1
frontend-1186687533-vg8fw       1/1       Running   0          7m        10.255.39.5   kube-node1
redis-master-3671804942-8tq84   1/1       Running   0          8m        10.255.39.2   kube-node1
redis-slave-2377017994-1zctb    1/1       Running   0          8m        10.255.31.7   kube-node2
redis-slave-2377017994-rqr4m    1/1       Running   0          8m        10.255.39.3   kube-node1
[root@kube-master ~]# kubectl get service -o wide
NAME           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
frontend       10.254.186.13   <nodes>       80:30001/TCP     8m        app=guestbook,tier=frontend
kubernetes     10.254.0.1      <none>        443/TCP          42d       <none>
redis-master   10.254.137.74   <none>        6379/TCP         8m        app=redis,role=master,tier=backend
redis-slave    10.254.72.23    <none>        6379/TCP         8m        app=redis,role=slave,tier=backend

(6).開啟node節點上的路由轉發功能

  臨時開啟方法一:

# iptables -P FORWARD ACCEPT

  臨時開啟方法二:

# echo "1" > /proc/sys/net/ipv4/ip_forward

  永久開啟

# vim /etc/sysctl.conf
//添加或修改如下行
net.ipv4.ip_forward = 1
# sysctl -p    //刷新使參數生效
net.ipv4.ip_forward = 1

(7).通過瀏覽器訪問

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM