(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).通過瀏覽器訪問


