Black lives matter.
We stand in solidarity with the Black community.
Racism is unacceptable.
It conflicts with the core values of the Kubernetes project and our community does not tolerate it.
We stand in solidarity with the Black community.
Racism is unacceptable.
It conflicts with the core values of the Kubernetes project and our community does not tolerate it.
本教程向您展示如何使用 Kubernetes 和 Docker 构建和部署 一个简单的多层 web 应用程序。本例由以下组件组成:
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
要获知版本信息,请输入kubectl version
.
留言板应用程序使用 Redis 存储数据。它将数据写入一个 Redis 主实例,并从多个 Redis 读取数据。
下面包含的清单文件指定了一个 Deployment 控制器,该控制器运行一个 Redis 主节点 Pod 副本。
application/guestbook/redis-master-deployment.yaml
|
---|
|
在下载清单文件的目录中启动终端窗口。
从 redis-master-deployment.yaml
文件中应用 Redis 主 Deployment:
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml
查询 Pod 列表以验证 Redis 主节点 Pod 是否正在运行:
kubectl get pods
响应应该与此类似:
```shell
NAME READY STATUS RESTARTS AGE
redis-master-1068406935-3lswp 1/1 Running 0 28s
```
运行以下命令查看 Redis 主节点 Pod 中的日志:
kubectl logs -f POD-NAME
注意: 将 POD-NAME 替换为您的 Pod 名称。
留言板应用程序需要往 Redis 主节点中写数据。因此,需要创建 Service 来代理 Redis 主节点 Pod 的流量。Service 定义了访问 Pod 的策略。
application/guestbook/redis-master-service.yaml
|
---|
|
使用下面的 redis-master-service.yaml
文件创建 Redis 主节点的服务:
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-service.yaml
查询服务列表验证 Redis 主节点服务是否正在运行:
kubectl get service
响应应该与此类似:
```shell
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1m
redis-master ClusterIP 10.0.0.151 <none> 6379/TCP 8s
```
注意: 这个清单文件创建了一个名为 `Redis-master` 的 Service,其中包含一组与前面定义的标签匹配的标签,因此服务将网络流量路由到 Redis 主节点 Pod 上。
尽管 Redis 主节点是一个单独的 pod,但是您可以通过添加 Redis 从节点的方式来使其高可用性,以满足流量需求。
Deployments 根据清单文件中设置的配置进行伸缩。在这种情况下,Deployment 对象指定两个副本。
如果没有任何副本正在运行,则此 Deployment 将启动容器集群上的两个副本。相反, 如果有两个以上的副本在运行,那么它的规模就会缩小,直到运行两个副本为止。
application/guestbook/redis-slave-deployment.yaml
|
---|
|
从 redis-slave-deployment.yaml
文件中应用 Redis Slave Deployment:
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-deployment.yaml
查询 Pod 列表以验证 Redis Slave Pod 正在运行:
kubectl get pods
响应应该与此类似:
```shell
NAME READY STATUS RESTARTS AGE
redis-master-1068406935-3lswp 1/1 Running 0 1m
redis-slave-2005841000-fpvqc 0/1 ContainerCreating 0 6s
redis-slave-2005841000-phfv9 0/1 ContainerCreating 0 6s
```
留言板应用程序需要从 Redis 从节点中读取数据。 为了便于 Redis 从节点可发现, 您需要设置一个 Service。Service 为一组 Pod 提供负载均衡。
application/guestbook/redis-slave-service.yaml
|
---|
|
从以下 redis-slave-service.yaml
文件应用 Redis Slave 服务:
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-service.yaml
查询服务列表以验证 Redis 在服务是否正在运行:
kubectl get services
响应应该与此类似:
```
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 2m
redis-master ClusterIP 10.0.0.151 <none> 6379/TCP 1m
redis-slave ClusterIP 10.0.0.223 <none> 6379/TCP 6s
```
留言板应用程序有一个 web 前端,服务于用 PHP 编写的 HTTP 请求。
它被配置为连接到写请求的 redis-master
服务和读请求的 redis-slave
服务。
application/guestbook/frontend-deployment.yaml
|
---|
|
从 frontend-deployment.yaml
应用前端 Deployment 文件:
kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
查询 Pod 列表,验证三个前端副本是否正在运行:
kubectl get pods -l app=guestbook -l tier=frontend
响应应该与此类似:
```
NAME READY STATUS RESTARTS AGE
frontend-3823415956-dsvc5 1/1 Running 0 54s
frontend-3823415956-k22zn 1/1 Running 0 54s
frontend-3823415956-w9gbt 1/1 Running 0 54s
```
应用的 redis-slave
和 redis-master
服务只能在容器集群中访问,因为服务的默认类型是
ClusterIP。ClusterIP
为服务指向的 Pod 集提供一个 IP 地址。这个 IP 地址只能在集群中访问。
如果您希望客人能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户机可以从容器集群之外请求服务。Minikube 只能通过 NodePort
公开服务。
注意: 一些云提供商,如 Google Compute Engine 或 Google Kubernetes Engine,支持外部负载均衡器。如果您的云提供商支持负载均衡器,并且您希望使用它, 只需删除或注释掉 `type: NodePort`,并取消注释 `type: LoadBalancer` 即可。
application/guestbook/frontend-service.yaml
|
---|
|
从 frontend-service.yaml
文件中应用前端服务:
kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
查询服务列表以验证前端服务正在运行:
kubectl get services
响应应该与此类似:
```
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend ClusterIP 10.0.0.112 <none> 80:31323/TCP 6s
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 4m
redis-master ClusterIP 10.0.0.151 <none> 6379/TCP 2m
redis-slave ClusterIP 10.0.0.223 <none> 6379/TCP 1m
```
NodePort
查看前端服务如果您将此应用程序部署到 Minikube 或本地集群,您需要找到 IP 地址来查看您的留言板。
运行以下命令获取前端服务的 IP 地址。
minikube service frontend --url
响应应该与此类似:
```
http://192.168.99.100:31323
```
LoadBalancer
查看前端服务如果您部署了 frontend-service.yaml
。你需要找到 IP 地址来查看你的留言板。
运行以下命令以获取前端服务的 IP 地址。
kubectl get service frontend
响应应该与此类似:
```
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend ClusterIP 10.51.242.136 109.197.92.229 80:32372/TCP 1m
```
伸缩很容易是因为服务器本身被定义为使用一个 Deployment 控制器的 Service。
运行以下命令扩展前端 Pod 的数量:
kubectl scale deployment frontend --replicas=5
查询 Pod 列表验证正在运行的前端 Pod 的数量:
kubectl get pods
响应应该类似于这样:
```
NAME READY STATUS RESTARTS AGE
frontend-3823415956-70qj5 1/1 Running 0 5s
frontend-3823415956-dsvc5 1/1 Running 0 54m
frontend-3823415956-k22zn 1/1 Running 0 54m
frontend-3823415956-w9gbt 1/1 Running 0 54m
frontend-3823415956-x2pld 1/1 Running 0 5s
redis-master-1068406935-3lswp 1/1 Running 0 56m
redis-slave-2005841000-fpvqc 1/1 Running 0 55m
redis-slave-2005841000-phfv9 1/1 Running 0 55m
```
运行以下命令缩小前端 Pod 的数量:
kubectl scale deployment frontend --replicas=2
查询 Pod 列表验证正在运行的前端 Pod 的数量:
kubectl get pods
响应应该类似于这样:
```
NAME READY STATUS RESTARTS AGE
frontend-3823415956-k22zn 1/1 Running 0 1h
frontend-3823415956-w9gbt 1/1 Running 0 1h
redis-master-1068406935-3lswp 1/1 Running 0 1h
redis-slave-2005841000-fpvqc 1/1 Running 0 1h
redis-slave-2005841000-phfv9 1/1 Running 0 1h
```
删除 Deployments 和服务还会删除正在运行的 Pod。使用标签用一个命令删除多个资源。
运行以下命令以删除所有 Pod,Deployments 和 Services。
kubectl delete deployment -l app=redis
kubectl delete service -l app=redis
kubectl delete deployment -l app=guestbook
kubectl delete service -l app=guestbook
响应应该是:
```
deployment.apps "redis-master" deleted
deployment.apps "redis-slave" deleted
service "redis-master" deleted
service "redis-slave" deleted
deployment.apps "frontend" deleted
service "frontend" deleted
```
查询 Pod 列表,确认没有 Pod 在运行:
kubectl get pods
响应应该是:
```
No resources found.
```