首页 > 其他分享 >【k8s】基于k8s安装高可用HPA扩展

【k8s】基于k8s安装高可用HPA扩展

时间:2024-10-16 14:48:09浏览次数:8  
标签:kind name 扩展 server metrics io HPA k8s

基于k8s安装高可用HPA扩展

最近在部署k8s集群的时候有个需求,需要容器能够弹性扩展,如果资源达到一定程序,能够自动新建容器和销毁容器释放资源,这时候就想到了HPA能够实现这个功能,通过metrics-server来监控容器资源的使用情况,根据实际业务系统是否需要扩展定好规则从而到达自动扩缩容的目的。

安装metrics-server

服务器上新增文件high-availability.yaml,用来直接生成容器,文件命名无所谓,文件内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                k8s-app: metrics-server
            namespaces:
            - kube-system
            topologyKey: kubernetes.io/hostname
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls
        image: registry.k8s.io/metrics-server/metrics-server:v0.7.1
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 10250
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
          seccompProfile:
            type: RuntimeDefault
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  minAvailable: 1
  selector:
    matchLabels:
      k8s-app: metrics-server
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

如果下载太慢,可以修改image: registry.k8s.io/metrics-server/metrics-server:v0.7.1这一段,我实际使用是用的自己搭建的私有镜像仓库,文件上传上去之后:

#执行k8s命令安装容器
kubectl apply –f high-availability.yaml

安装过程基本不会出现其他问题,有可能会出现节点污点问题,直接百度解决一下,或者下次有空我再写篇文章。
安装完成后查看集群资源:

kubectl top nodes

输出正常就安装成功了,接下来就是尝试一下弄个demo试试功能

HPA案例

创建容器的时候先设置好系统资源,一般java应用1/2/4核,2048m这些都可以
在这里插入图片描述
然后再服务发现这里(我这里是用的rancher做管理平台)创建一个HPA:
在这里插入图片描述

在这里插入图片描述

选定好目标以及设置阈值,然后就可以了,测试的时候容器资源调下一点,这样才会有作用。
除了这种方式就是还可以直接通过文件的形式创建,比如test.yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: static-hpa
  namespace: app-dev
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: static-compent
  minReplicas: 1
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

然后执行:

kubectl apply test.yaml

通过这种方式也可以。

标签:kind,name,扩展,server,metrics,io,HPA,k8s
From: https://blog.csdn.net/qq_45820252/article/details/142981602

相关文章

  • 【K8s】专题十四(2):Kubernetes 安全机制之 Security Context
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口| 精选文章 | Kubernetes |Docker |Linux |羊毛资源 | 工具推荐 |往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决......
  • 在K8S中,CSI模型有哪些?
    在Kubernetes(K8s)中,ContainerStorageInterface(CSI)模型是用来集成外部存储系统的标准化方法。CSI模型的主要组成部分包括:CSIDriver(驱动程序):CSIDriver是由存储提供商编写的,它实现了CSI规范中定义的API接口。每个存储提供商都需要为其产品提供一个或多个CSIDrivers,以......
  • 在K8S中,所支持的存储供应模式有哪些?
    在Kubernetes(K8S)中,存储供应(StorageClass)是用于描述如何配置存储卷(PersistentVolumes)的一种抽象。它允许用户请求具有特定特性的存储而不需要指定具体的存储后端。以下是Kubernetes中所支持的一些存储供应模式:动态配置(DynamicProvisioning):动态配置允许用户基于存储类来请......
  • 在K8S中,Requests 和 Limits 如何影响 Pod 的调度?
    在Kubernetes中,Pod的调度过程受到资源请求(Requests)和资源限制(Limits)的直接影响。以下是这些参数如何影响Pod调度的详细说明:资源请求(Requests):资源请求定义了Pod中每个容器所需的最小资源量。在调度Pod时,Kubernetes调度器会寻找具有足够可用资源的节点来满足这些请求......
  • 在K8S中,Pod 如何实现对节点的资源控制?
    在Kubernetes中,Pod是可以被调度到集群中任何节点上的最小部署单元。Pod通过资源请求(requests)和资源限制(limits)来实现对节点资源的控制。这些资源控制机制确保了容器能够获得它们所需的资源,同时防止它们消耗过多资源,影响节点上其他容器或Pod的运行。以下是Pod实现对节点资......
  • 在K8S中,Worker节点加入集群的全过程?
    在Kubernetes(K8S)中,Worker节点加入集群的全过程涉及多个步骤,包括准备环境、配置网络、生成令牌、执行加入命令以及验证集群状态等。以下是详细的步骤说明:1.准备Worker节点环境检查系统要求:确保Worker节点的操作系统和硬件配置满足Kubernetes的最低要求。检查并安装必要的依......
  • k8s安装metrics
    有的集群安装完之后没有metrics组件,无法使用top命令查看node和pod的资源利用率下载MetricsServer配置文件wgethttps://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml-Ometrics.yaml修改配置文件,修改以下内容......spec:......
  • k8s解决overlay文件系统不够问题
    k8s解决overlay文件系统不够问题k8s在使用时overlay文件系统超出限制85%,此时可能是由于文件资源不够,也可能是由于挂载点挂载出错例如挂载点/home1.1T;/55G,此时就需要取消/home挂载点,重置/挂载点的文件系统大小。如果是传统分区,使用fdisk,parted命令调整分区如果是lvm分区使......
  • k8s版本升级v1.17.4-
    v1.17.4-v1.18.20kubelet无法启动可能的原因failedtorunKubelet:misconfiguration:kubeletcgroupdriver:"systemd"isdifferentfromdockercgroupdriver:"cgroupfs"解决办法:修改Docker的cgroupdriver编辑Docker的配置文件/etc/docker/daemon.json,添加&q......
  • K8s-实战入门-ns、pod、label、deployment
    一、 Namespace(ns)Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分......