本教程向您展示如何使用Kubernetes和Docker构建和部署一个简单的多层web应用程序。这个示例由以下组件组成:
目标
- 启动 Redis master。
- 启动 Redis slaves。
- 启动 guestbook 前端。
- 暴露和查看前端服务。
- 清理.
准备工作
您需要有一个Kubernetes集群,并且必须配置kubectl命令行工具来与您的集群通信。如果您还没有集群,您可以使用Minikube创建一个集群,或者您可以使用这些Kubernetes平台:
检查版本, 请输入 kubectl version
.
下载以下配置文件:
启动 Redis Master
guestbook应用使用Redis存储数据。guestbook 把数据写入Redis master实例中,从多个redis slaves实例中读取数据。
创建一个 Redis Master 部署(Deployment)
下面包含的清单文件指定了一个部署控制器(Deployment controller),该控制器运行一个Redis master Pod副本。
guestbook/redis-master-deployment.yaml |
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: redis-master
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: k8s.gcr.io/redis:e2e # or just image: redis
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
|
注意:将POD-NAME
替换为您的Pod名称。
创建 Redis Master 服务
guestbook 应用程序需要与Redis master通信来写数据。您需要使用一个服务来将流量代理到Redis master Pod。服务定义了访问这些Pods的策略。
guestbook/redis-master-service.yaml |
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
role: master
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: master
tier: backend
|
注意:这个清单文件创建了一个名为redis-master
的服务,它的标签与前面定义的标签相匹配,因此服务将网络流量路由到Redis master Pod。
启动Redis Slaves
尽管Redis master是一个单一的pod,但是您可以通过添加副本的Redis slaves来实现它的高可用性。
创建 Redis Slave 部署(Deployment)
部署规模基于清单文件中配置。在本例中,部署对象指定两个副本。
如果没有运行任何副本,这个部署将在您的容器集群上启动两个副本。相反,如果有两个以上的副本正在运行,那么它将缩减到两个运行副本。
guestbook/redis-slave-deployment.yaml |
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: redis-slave
spec:
selector:
matchLabels:
app: redis
role: slave
tier: backend
replicas: 2
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: gcr.io/google_samples/gb-redisslave:v1
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
# Using `GET_HOSTS_FROM=dns` requires your cluster to
# provide a dns service. As of Kubernetes 1.3, DNS is a built-in
# service launched automatically. However, if the cluster you are using
# does not have a built-in DNS service, you can instead
# access an environment variable to find the master
# service's host. To do so, comment out the 'value: dns' line above, and
# uncomment the line below:
# value: env
ports:
- containerPort: 6379
|
创建 Redis Slave服务
guestbook 应用程序需要与Redis slaves 进行通信,以读取数据。为了让Redis slaves可发现,你需要建立一个服务。该服务为一组Pods提供透明的负载平衡。
guestbook/redis-slave-service.yaml |
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
app: redis
role: slave
tier: backend
spec:
ports:
- port: 6379
selector:
app: redis
role: slave
tier: backend
|
设置并暴露Guestbook的前端
guestbook 应用程序有一个web前端,它提供用PHP编写的HTTP请求。它被配置为连接到用于写请求的redis-master
服务,以及用于读取请求的redis-slave
服务。
创建Guestbook前端部署
guestbook/frontend-deployment.yaml |
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
app: guestbook
tier: frontend
replicas: 3
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google-samples/gb-frontend:v4
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
# Using `GET_HOSTS_FROM=dns` requires your cluster to
# provide a dns service. As of Kubernetes 1.3, DNS is a built-in
# service launched automatically. However, if the cluster you are using
# does not have a built-in DNS service, you can instead
# access an environment variable to find the master
# service's host. To do so, comment out the 'value: dns' line above, and
# uncomment the line below:
# value: env
ports:
- containerPort: 80
|
创建前端服务
您所应用的redis-slave
和redis-master
服务只能在容器集群中访问,因为服务的缺省类型是ClusterIP。ClusterIP
为服务指向的一组Pods提供一个单一的IP地址。这个IP地址只能在集群中访问。
如果您希望客户能够访问您的guestbook,那么您必须将前端服务配置为外部可见,以便客户端可以从容器集群外部请求服务。Minikube只能通过NodePort
公开服务。
注意:一些云计算提供商,比如Google Compute Engine或Google Kubernetes引擎,支持外部负载平衡器。如果你的云服务提供商支持负载平衡器,你想要使用它,简单地删除或注释掉type: NodePort
并且去掉type: LoadBalancer
的注释。
guestbook/frontend-service.yaml |
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# comment or delete the following line if you want to use a LoadBalancer
type: NodePort
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced IP for the frontend service.
# type: LoadBalancer
ports:
- port: 80
selector:
app: guestbook
tier: frontend
|
通过NodePort
查看前端服务
如果您将此应用程序部署到Minikube或本地集群,您需要找到IP地址来查看您的Guestbook。
通过LoadBalancer
查看前端服务
如果你通过type: LoadBalancer
部署frontend-service.yaml
,你需要找到IP地址来查看你的Guestbook
扩展Web 前端
向上或向下扩展很容易,因为您的服务器被定义为使用部署控制器( Deployment controller)的服务。
清理
删除部署和服务也会删除任何运行的Pods。使用一个命令使用标签来删除多个资源.
下一节
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98144.html