热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

K8S无状态应用程序和示例

无状态应用是不将数据或应用状态存储到集群或永久性存储空间的应用。相反,该应用将数据和应用状态保留在客户端,从而使无状态应用更具可伸缩性。例如,前端应用是无状态应用:您可以部

无状态应用是不将数据或应用状态存储到集群或永久性存储空间的应用。相反,该应用将数据和应用状态保留在客户端,从而使无状态应用更具可伸缩性。例如,前端应用是无状态应用:您可以部署多个副本以提高其可用性,在需求较低时可以减少副本,并且副本无需具有唯一标识。

一、向外公开 IP 地址

1 准备工作

官方文档中的准备工作要求有一个云供应商提供的 Kubernetes 集群,因为示例中使用的是一个外部负载均衡器。

但对于开发环境,在阿里云、华为云或腾讯云特意创建一个 Kubernetes 集群是没有必要的,所以还是以本地集群为例。

2 教程目标

  • 运行 5 个 Hello World 的应用实例
  • 创建一个公开外部 IP 地址的 Service 对象
  • 使用 Service 对象访问正在运行的应用程序

3 为有 5 个实例的应用程序创建服务

3.1 在集群中运行 Hello World 应用程序

使用配置文件创建,service/load-balancer-example.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: load-balancer-example
  name: hello-world
spec:
  replicas: 5
  selector:
    matchLabels:
      app.kubernetes.io/name: load-balancer-example
  template:
    metadata:
      labels:
        app.kubernetes.io/name: load-balancer-example
    spec:
      containers:
      # 我从谷歌仓库中拉的镜像源
      - image: registry.cn-hangzhou.aliyuncs.com/google_samples_thepoy/node-hello:1.0
        name: hello-world
        ports:
        - containerPort: 8080

应用配置文件(本地配置文件或远程配置文件皆可):

kubectl apply -f load-balancer-example.yaml
# 或
kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml

这个命令会创建一个 Deployment 对象和一个关联的 ReplicaSet 对象。其中 ReplicaSet 对象有 5 个 Pods,每个 Pod 都运行 Hello World 应用程序。

3.2 显示 Deployment 的详细信息

kubectl get deployments hello-world
kubectl describe deployments hello-world

3.3 显示 ReplicaSet 对象的详细信息

kubectl get replicasets
kubectl describe replicasets

3.4 创建公开 Deployment 的 Service 对象

如果你用的是云服务商提供的 k8s 集群,type 应设置为LoadBalancer,如果用的是本地集群,应设置为NodePort,本例用的本地集群,所以设置为NodePort

kubectl expose deployment hello-world --type=NodePort --name=my-service

3.5 显示 Service 的详细信息

kubectl describe services my-service

输出类似于

Name:                     my-service
Namespace:                default
Labels:                   app.kubernetes.io/name=load-balancer-example
Annotations:              
Selector:                 app.kubernetes.io/name=load-balancer-example
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.101.118.215
IPs:                      10.101.118.215
Port:                       8080/TCP
TargetPort:               8080/TCP
NodePort:                   32359/TCP
Endpoints:                10.244.1.6:8080,10.244.1.7:8080,10.244.2.10:8080 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   

如果你用的是云服务商,那么输出结果中就会有一个LoadBalancer Ingress: xxx.xxx.xxx.xxx,后面即是公网或对外暴露的 IP 地址。

3.6 使用外部 IP 访问 Hello World 应用程序

curl http://:

如果你使用的LoadBalancer,外部 IP 就是LoadBalancer Ingress,端口就是Port

如果你用的是NodePort,外部 IP 可以是三个节点的任意一个 IP 地址,端口是NodePort后的端口。

响应:

Hello Kubernetes!

4 删除服务

kubectl delete services my-service
kubectl delete deployment hello-world

二、使用 MongoDB 部署 PHP 留言板应用程序

本实例由以下组件组成:

  • 单实例 MongoDB 以保存留言板条目
  • 多个 web 前端实例

1 目标

  • 启动 Mongo 数据库。
  • 启动留言板前端。
  • 公开并查看前端服务。
  • 清理。

2 准备

你要有一个 Kubernetes 集群,参考 用 kubeadm 在 Debian 或 Ubuntu 中创建 k8s 集群。

3 启动 Mongo 数据库

留言板应用程序使用 MongoDB 数据库存储数据。

3.1 创建 MongoDB 的 Deployment

mongo-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo
  labels:
    app.kubernetes.io/name: mongo
    app.kubernetes.io/component: backend
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: mongo
      app.kubernetes.io/component: backend
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: mongo
        app.kubernetes.io/component: backend
    spec:
      containers:
      - name: mongo
        image: mongo:4.2
        args:
          - --bind_ip
          - 0.0.0.0
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 27017
kubectl apply -f ./mongo-deployment.yaml

运行以下命令查看 MongoDB Deployment 中的日志:

kubectl logs -f deployment/mongo

3.2 创建 MongoDB 服务

留言板应用程序需要往 MongoDB 中写数据。因此,需要创建 Service 来代理 MongoDB Pod 的流量。Service 定义了访问 Pod 的策略。

mongo-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    app.kubernetes.io/name: mongo
    app.kubernetes.io/component: backend
spec:
  ports:
  - port: 27017
    targetPort: 27017
  selector:
    app.kubernetes.io/name: mongo
    app.kubernetes.io/component: backend

创建:

kubectl apply -f ./mongo-service.yaml

查看服务是否正在运行:

kubectl get service

结果类似:

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
kubernetes   ClusterIP   10.96.0.1                443/TCP     7h31m
mongo        ClusterIP   10.100.165.210           27017/TCP   26s

4 设置并公开留言板前端

留言板应用程序有一个 web 前端,服务于用 PHP 编写的 HTTP 请求。 它被配置为连接到 mongo 服务以存储留言版条目。

4.1 创建留言板前端 Deployment

frontend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app.kubernetes.io/name: guestbook
    app.kubernetes.io/component: frontend
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: guestbook
      app.kubernetes.io/component: frontend
  replicas: 3
  template:
    metadata:
      labels:
        app.kubernetes.io/name: guestbook
        app.kubernetes.io/component: frontend
    spec:
      containers:
      - name: guestbook
        image: paulczar/gb-frontend:v5
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80

创建:

kubectl apply -f ./frontend-deployment.yaml

查询 Pod 列表,验证三个前端副本是否正在运行:

kubectl get pods -l app.kubernetes.io/name=guestbook -l app.kubernetes.io/compOnent=frontend

结果类似:

NAME                       READY   STATUS    RESTARTS   AGE
frontend-848d88c7c-8fmgp   1/1     Running   0          65s
frontend-848d88c7c-bjhg5   1/1     Running   0          65s
frontend-848d88c7c-p7mv2   1/1     Running   0          65s

4.2 创建前端服务

应用的 mongo 服务只能在 Kubernetes 集群中访问,因为服务的默认类型是 ClusterIP。 ClusterIP 为服务指向的 Pod 集提供一个 IP 地址。这个 IP 地址只能在集群中访问。

如果您希望访客能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户端可以从 Kubernetes 集群之外请求服务。然而即便使用了 ClusterIP Kubernets 用户仍可以通过 kubectl port-forwart 访问服务。

frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app.kubernetes.io/name: guestbook
    app.kubernetes.io/component: frontend
spec:
  # 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
    name: index
  - port: 8080
    name: comments
  selector:
    app.kubernetes.io/name: guestbook
    app.kubernetes.io/component: frontend

创建服务:

kubectl apply -f ./frontend-service.yaml

查询服务列表以验证前端服务正在运行:

kubectl get services

结果类似:

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
frontend     ClusterIP   10.108.101.50            80/TCP,8080/TCP   7s
kubernetes   ClusterIP   10.96.0.1                443/TCP           9h
mongo        ClusterIP   10.100.165.210           27017/TCP         107m

4.3 通过 kubectl port-forward 查看前端服务

运行以下命令将本机的 8080 端口转发到服务的 80 端口。

kubectl port-forward svc/frontend --address 0.0.0.0 8080:80

响应类似:

Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

然后在浏览器中打开 http://主节点ip:8080 查看留言板页面,本例中打开http://192.168.31.221:8080/。

界面如下:

K8S 无状态应用程序和示例
截屏2021-05-24 19.40.09

5 扩展和压缩实例数量

扩展

kubectl scale deployment frontend --replicas=5

压缩

kubectl scale deployment frontend --replicas=2

6 删除部署的应用

使的标签删除多个资源

kubectl delete deployment -l app.kubernetes.io/name=mongo
kubectl delete service -l app.kubernetes.io/name=mongo
kubectl delete deployment -l app.kubernetes.io/name=guestbook
kubectl delete service -l app.kubernetes.io/name=guestbook

结果:

deployment.apps "mongo" deleted
service "mongo" deleted
deployment.apps "frontend" deleted
service "frontend" deleted

查询 Pod 列表,确认没有 Pod 在运行:

kubectl get pods
No resources found in default namespace.

推荐阅读
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • Windows环境下部署Kubernetes Dashboard指南
    本指南详细介绍了如何在Windows系统中部署Kubernetes Dashboard,包括下载最新配置文件、修改服务类型以支持NodePort访问、下载所需镜像并启动Dashboard服务等步骤。 ... [详细]
  • 深入解析:OpenShift Origin环境下的Kubernetes Spark Operator
    本文探讨了如何在OpenShift Origin平台上利用Kubernetes Spark Operator来管理和部署Apache Spark集群与应用。作为Radanalytics.io项目的一部分,这一开源工具为大数据处理提供了强大的支持。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
  • 本文详细探讨了在Windows Server 2003环境下遇到MySQL连接失败(错误代码10061)的解决方案,包括通过卸载特定的Windows更新和调整系统注册表设置的方法。 ... [详细]
  • ipvsadm命令简介:ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。在fedora14、Linux6.0之后系统中 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • Kubernetes中构建Nginx Service的详细步骤
    本文介绍了如何在Kubernetes集群中通过创建Service来稳定访问Nginx应用的方法,包括Service的基本概念及其在Kubernetes中的作用。 ... [详细]
  • Flutter 高德地图插件使用指南
    本文档详细介绍了如何在Flutter项目中集成和使用高德地图插件,包括安装、配置及基本使用方法。 ... [详细]
  • Linux双网卡绑定技术详解与实践
    本文详细介绍了如何在Linux系统中实现双网卡绑定,即将两块物理网卡合并为一个逻辑网卡,以提高网络性能和可靠性。文中不仅涵盖了基本的概念,还提供了具体的配置步骤和测试方法。 ... [详细]
author-avatar
小子转过来_406
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有