本文转自https://freeaihub.com/article/deploy-redis-php-guestbook-in-kubernetes.html,该页可在线运行本页实例。
本节在部署完成k8s环境的基础上,首先进行redis数据库的部署及服务暴露,再进行php留言板程序的部署及服务暴露,最终完成使用k8s部署完成一个简单的带数据库后端的web应用。
k8s环境的安装及配置(单节点模式)
前往该页https://freeaihub.com/kubernetes/setup.html,按该页提示完成k8s的安装。以便进行下一步的操作。
导入相关镜像
ctr -n k8s.io i import /share/images/redis.tar
ctr -n k8s.io i import /share/images/gb-frontend.v4.tar
部署 Redis
下面包含的清单文件指定了一个 Deployment 控制器,该控制器运行一个 Redis 主节点 Pod 副本。
cat << EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 200m
memory: 100Mi
ports:
- containerPort: 6379
查询 Pod 列表以验证 Redis 主节点 Pod 是否正在运行:
kubectl get pods
创建Redis服务
留言板应用程序需要往 Redis 主节点中写数据。因此,需要创建 Service 来代理 Redis 主节点 Pod 的流量。Service 定义了访问 Pod 的策略。
cat << EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
name: redis
labels:
app: redis
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
验证
kubectl get service
部署前端留言板
留言板应用程序有一个 web 前端,服务于用 PHP 编写的 HTTP 请求。
cat << EOF | kubectl create -f -
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: frontend
labels:
app: guestbook
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
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
验证
kubectl get pods -l app=guestbook
创建留言板的服务
应用的 redis
和 服务只能在容器集群中访问,因为服务的默认类型是 ClusterIP。ClusterIP
为服务指向的 Pod 集提供一个 IP 地址。这个 IP 地址只能在集群中访问。
如果您希望客人能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户机可以从容器集群之外请求服务。只能通过 NodePort
公开服务。
更新kuberntes NodePort端口范围:
因为Kuberntes默认公开端口是30000-30553,我们需要手动进行修改。
sed -i ‘17i\ - --service-node-port-range=80-30553‘ /etc/kubernetes/manifests/kube-apiserver.yaml
创建前端的服务
cat << EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
type: NodePort
ports:
- port: 80
selector:
app: guestbook
tier: frontend
验证服务部署情况
kubectl get services
使用vnc浏览器访问
在右侧实验区+号打开open http on freeaiub
选项,即可预览。
总结:
通过本节的实践,您可以体会并理解两种不同服务暴露模式ClusterIP和NodePort的在使用的中实际区别。