在 K8S 运行多 Pods 负载均衡服务(Hello World)

Published: 2023-07-31

Tags: k8s

本文总阅读量

环境信息

Master:172.17.157.115(内网IP)

Node1:172.17.157.114(内网IP)

部署信息参考:《MacOS 系统使用 kubeasz 搭建 k8s 测试集群》

创建一个 Deployment

Deployment 用来声明式地定义应用的组件和运行次数,它会持续监控运行的Pod,保证其数目和模板的定义一致,例如当 Pod 崩溃时会自动创建,它是 Kubernetes 中部署和运行容器化应用的推荐方式,可以和服务发现、扩缩容、滚动升级等功能很好地结合。

使用 gcr.io/google-samples/hello-app:1.0 基础镜像

$ kubectl create deployment hello-world --image=gcr.io/google-samples/hello-app:1.0

查看创建的 Deployment

$ kubectl get deployments

# 查看详细信息
$ kubectl describe deployment hello-world

# 删除 deployment
kubectl delete deployment hello-world

Deployment 创建后会自动创建指定数量的 Pod,本例命令未指定则默认一个 Pod

查看创建的 Pod

Pod 是 Kubernetes 中可以创建和管理的最小的基本执行单元,是一组容器的集合。

Pod 中的容器共享网络和存储资源,可以通过 localhost 通信。

每个 Pod 会被分配一个唯一的 IP 地址,可以进行水平扩展复制,支持同一类 Pod 的多个实例同时运行。

Pod可以跨Node调度运行,Kubernetes会自动处理调度和重启。

应用开发以Pod中的容器为主,Pod负责管理容器的生命周期。

$ kubectl get pods -o wide

从输出可以看到 Pod 的 IP 地址是 172.20.253.7,部署节点是 172.17.157.115(Master 内网地址)

调用刚部署的服务接口

$ curl 172.20.253.7:8080

输出

Hello, world!
Version: 1.0.0
Hostname: hello-world-5bc74c8b8d-kt5kk

直接请求 Pod 实例的 IP 地址没有负载均衡,当 Service 中存在多个 Pods 时需要使用集群 IP 访问服务。

创建 Service(暴露 Deployment)

我们先更新下之前创建的 Deployment,将 replicas: 1 修改为 replicas: 2 后保存

$ kubectl edit deployment hello-world

再次查看 Deployment 和 Pods 数量,可见变成了 2 个服务实例(PS:一个在 Master,一个在 Node1 节点)

接下来基于现有 Deployment 快速创建 Service

$ kubectl expose deployment hello-world --type=NodePort --port=8123 --target-port=8080

查看 Service 状态 kubectl get svc 即(kubectl get service)

集群 IP 为 10.68.164.91,通过 10.68.164.91:8123 即可访问到服务,多次请求 Service 接口,可见 Pods 能够负载均衡。

同时,在内网通过 172.17.157.115:30005 以及外网通过 http://<服务器外网IP>:30005 都可以访问到服务

从部署后的 Grafana 面板也可以看到刚创建的 Pods 已经有了指标信息

使用配置文件启动

在增加更多的配置参数时通过命令行运行的命令不好进行版本控制,推荐使用配置文件的方式管理

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: gcr.io/google-samples/hello-app:1.0
        resources:
          limits:
            cpu: "256m"
            memory: "256Mi"

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: NodePort
  ports:
  - port: 8123
    targetPort: 8080
    # nodePort: 30123
  selector:
    app: hello-world

启动命令

$ kubectl apply -f deployment.yaml -f service.yaml

编辑修改 Pods 数量后,重复运行命令即可。