(1) Experimental environment
Requires three mirrors: web front end mirror php-frontend, redis-master and redis-slave. Wherein the web front end and redis-master interact through JavaScript redis api.
. (2) Extended: flannel
flannel is a network plug K8s provided by default. Flannel was developed by a team CoreOs social networking tools, CoreOS L3 Overlay mode design team used flannel, each Pod predetermined belong to the same subnet under a host, Pod in different host belong to different subnets.
flannel runs called flanneld agents on each host, which is responsible for the pre-assigned a host subnet, and assign an IP address Pod. Flannel Kubernetes use to store network configuration or etcd, assigned public IP subnets and hosts and other information. The packet is forwarded by VXLAN, UDP or the rear end of the mechanism of these types of host-gw.
Look at the whole process of flannel running Kubernetes in:
(3) Prepare using the mirror
Download docker.io/kubeguide/guestbook-php-frontend:latest,docker.io/kubeguide/redis-master:latest,docker.io/kubeguide/guestbook-redis-slave:latest on both node node.
# 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).通过浏览器访问