kubernetes企业项目实战04基于k8s构建efk+logstash+kafka日志平台(中)(代码片段)

Stars.Sky Stars.Sky     2023-01-24     236

关键词:

目录

一、安装存储日志组件 Elasticsearch

1.1 创建名称空间

1.2 安装 elasticsearch 组件

1)创建 headless service 服务

2)通过 statefulset 创建 elasticsearch 集群

二、安装 kibana 可视化 UI 界面


本篇文章所用到的资料文件下载地址:

kibana-v7.2.0-kubernetes文档类资源-CSDN下载

https://download.csdn.net/download/weixin_46560589/87391396

一、安装存储日志组件 Elasticsearch

1.1 创建名称空间

        在安装 Elasticsearch 集群之前,我们先创建一个名称空间,在这个名称空间下安装日志收工具 elasticsearch、fluentd、kibana。我们创建一个 kube-logging 名称空间,将 EFK 组件安装到该名称空间中。

[root@k8s-master1 ~]# mkdir efk
[root@k8s-master1 ~]# cd efk/

[root@k8s-master1 efk]# kubectl create namespace kube-logging
namespace/kube-logging created

# 查看 kube-logging 名称空间是否创建成功
[root@k8s-master1 efk]# kubectl get ns
NAME              STATUS   AGE
default           Active   8d
kube-logging      Active   7s
kube-node-lease   Active   8d
kube-public       Active   8d
kube-system       Active   8d

1.2 安装 elasticsearch 组件

        通过上面步骤已经创建了一个名称空间 kube-logging,在这个名称空间下去安装日志收集组件 efk。首先,我们需要部署一个有 3 个节点的 Elasticsearch 集群,我们使用 3 个 Elasticsearch Pods 可以避免高可用中的多节点群集中发生的“裂脑”的问题。

Elasticsearch 脑裂参考地址:Node | Elasticsearch Guide [8.6] | Elastic

  • 1)创建 headless service 服务

        创建一个 headless service 的 Kubernetes 服务,服务名称是 elasticsearch,这个服务将为 3 个 Pod 定义一个 DNS 域。headless service 不具备负载均衡也没有 IP。

要了解有关 headless service 的更多信息,可参考服务(Service) | Kubernetes

[root@k8s-master1 efk]# vim elasticsearch_svc.yaml 
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: kube-logging
  labels:
    app: elasticsearch
spec:
  selector:
    app: elasticsearch
  clusterIP: None
  ports:
    - port: 9200
      name: rest
    - port: 9300
      name: inter-node

        在 kube-logging 名称空间定义了一个名为 elasticsearch 的 Service服务,带有app=elasticsearch 标签,当我们将 Elasticsearch StatefulSet 与此服务关联时,服务将返回带有标签 app=elasticsearch 的 Elasticsearch Pods 的 DNS 记录,然后设置 clusterIP=None,将该服务设置成无头服务。最后,我们分别定义端口 9200、9300,分别用于与 REST API 交互,以及用于节点间通信。

[root@k8s-master1 efk]# kubectl apply -f elasticsearch_svc.yaml 
service/elasticsearch created
[root@k8s-master1 efk]# kubectl get svc -n kube-logging 
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
elasticsearch   ClusterIP   None         <none>        9200/TCP,9300/TCP   7s

        现在我们已经为 Pod 设置了无头服务和一个稳定的域名 .elasticsearch.kube-logging.svc.cluster.local,接下来我们通过 StatefulSet 来创建具体的 Elasticsearch 的 Pod 应用。

  • 2)通过 statefulset 创建 elasticsearch 集群

  • 创建 Storageclass,实现存储类动态供给:

1、安装 nfs 服务

# 在各个节点安装 nfs 服务
yum install nfs-utils -y

# 启动 nfs 服务
systemctl enable nfs --now

# 在 master1 上创建一个 nfs 共享目录
[root@k8s-master1 efk]# mkdir -pv /data/v1

# 编辑 /etc/exports 文件
[root@k8s-master1 efk]# vim /etc/exports
/data/v1 192.168.78.0/24(rw,no_root_squash)

# 加载配置,使配置生效
[root@k8s-master1 efk]# exportfs -arv
exporting 192.168.78.0/24:/data/v1
[root@k8s-master1 efk]# systemctl restart nfs

2、创建 nfs 作为存储的供应商

# 创建 sa
[root@k8s-master1 efk]# kubectl create serviceaccount nfs-provisioner
serviceaccount/nfs-provisioner created

[root@k8s-master1 efk]# kubectl get sa
NAME              SECRETS   AGE
default           1         8d
nfs-provisioner   1         4s

# 对 sa 做 rbac 授权
[root@k8s-master1 efk]# vim rbac.yaml 
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get"]
  - apiGroups: ["extensions"]
    resources: ["podsecuritypolicies"]
    resourceNames: ["nfs-provisioner"]
    verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-provisioner
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-provisioner
  apiGroup: rbac.authorization.k8s.io

[root@k8s-master1 efk]# kubectl apply -f rbac.yaml 

注意:k8s-v1.20+ 版本通过 nfs provisioner 动态生成 pv 会报错,信息如下:

Unexpected error getting claim reference to claim "default/test-claim1": selfLink was empty, can't make reference

报错原因是 1.20 版本启用了 selfLink,解决方法如下:

[root@k8s-master1 efk]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 
······
spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false    # 添加这一行内容
······

[root@k8s-master1 efk]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml 

[root@k8s-master1 efk]# kubectl get pods -n kube-system | grep apiserver
kube-apiserver                             0/1     CrashLoopBackOff   1 (14s ago)     16s
kube-apiserver-k8s-master1                 1/1     Running            0               117s

# 重新更新 apiserver.yaml 会有生成一个新的 pod:kube-apiserver,这个 pod 状态是 CrashLoopBackOff,需要删除
[root@k8s-master1 efk]# kubectl delete pods -n kube-system kube-apiserver

把 nfs-client-provisioner.tar.gz 上传到  node1、node2 节点,手动解压

[root@k8s-node1 ~]# docker load -i nfs-client-provisioner.tar.gz 
[root@k8s-node2 ~]# docker load -i nfs-client-provisioner.tar.gz 

# 通过 deployment 创建 pod 用来运行 nfs-provisioner
[root@k8s-master1 efk]# vim deployment.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
      app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: registry.cn-hangzhou.aliyuncs.com/open-ali/xianchao/nfs-client-provisioner:v1
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.78.143    # 这个需要写 nfs 服务端所在的 ip 地址,即安装了 nfs 服务的机器 ip
            - name: NFS_PATH
              value: /data/v1          # 这个是 nfs 服务端共享的目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.78.143
            path: /data/v1

[root@k8s-master1 efk]# kubectl apply -f deployment.yaml 
deployment.apps/nfs-provisioner created

[root@k8s-master1 efk]# kubectl get pods | grep nfs
nfs-provisioner-6988f7c774-nk8x5   1/1     Running   0          7s

# 创建 stoorageclass
[root@k8s-master1 efk]# vim class.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: do-block-storage
provisioner: example.com/nfs    # 该值需要和 nfs provisioner 配置的 PROVISIONER_NAME 的 value 值保持一致

[root@k8s-master1 efk]# kubectl apply -f class.yaml 

[root@k8s-master1 efk]# kubectl get storageclasses
NAME               PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
do-block-storage   example.com/nfs   Delete          Immediate           false                  65s
  • 安装 elasticsearch 集群

把 elasticsearch_7_2_0.tar.gz 和 busybox.tar.gz 文件上传到 node1、node2,手动解压:

[root@k8s-node1 ~]# docker load -i elasticsearch_7_2_0.tar.gz 
[root@k8s-node1 ~]# docker load -i busybox.tar.gz 

[root@k8s-node2 ~]# docker load -i elasticsearch_7_2_0.tar.gz 
[root@k8s-node2 ~]# docker load -i busybox.tar.gz 

elasticsearch-statefulset.yaml 文件解释说明:

[root@k8s-master1 efk]# vim elasticsearch-statefulset.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: kube-logging
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
·····

        上面内容的解释:在 kube-logging 的名称空间中定义了一个 es-cluste r的 StatefulSet。然后,我们使用 serviceName 字段与我们之前创建的 headless ElasticSearch 服务相关联。这样可以确保可以使用以下 DNS 地址访问 StatefulSet 中的每个 Pod:

        es-cluster-[0,1,2].elasticsearch.kube-logging.svc.cluster.local,其中 [0,1,2] 与 Pod 分配的序号数相对应。我们指定 3 个 replicas(3 个 Pod 副本),将 selector matchLabels 设置为 app: elasticseach。该 .spec.selector.matchLabels 和 .spec.template.metadata.labels 字段必须匹配。

# statefulset 中定义 pod 模板,内容如下:
·····
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
        imagePullPolicy: IfNotPresent
        resources:
            limits:
              cpu: 1000m
            requests:
              cpu: 100m
        ports:
        - containerPort: 9200
          name: rest
          protocol: TCP
        - containerPort: 9300
          name: inter-node
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
          - name: cluster.name
            value: k8s-logs
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: discovery.seed_hosts
            value: "es-cluster-0.elasticsearch.kube-logging.svc.cluster.local,es-cluster-1.elasticsearch.kube-logging.svc.cluster.local,es-cluster-2.elasticsearch.kube-logging.svc.cluster.local"
          - name: cluster.initial_master_nodes
            value: "es-cluster-0,es-cluster-1,es-cluster-2"
          - name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"
······

        上面内容解释:在 statefulset 中定义了 pod,容器的名字是 elasticsearch,镜像是docker.elastic.co/elasticsearch/elasticsearch:7.2.0。使用 resources 字段来指定容器至少需要 0.1个 vCPU,并且容器最多可以使用 1 个 vC​​PU 了解有关资源请求和限制。

可参考Resource Management for Pods and Containers | Kubernetes

        容器暴露了 9200 和 9300 两个端口,名称要和上面定义的 Service 保持一致,通过volumeMount 声明了数据持久化目录,定义了一个 data 数据卷,通过 volumeMount 把它挂载到容器里的 /usr/share/elasticsearch/data 目录。

容器中设置了一些环境变量:

  • cluster.name:Elasticsearch 集群的名称,我们这里是 k8s-logs。

  • node.name:节点的名称,通过 metadata.name 来获取。这将解析为 es-cluster-[0,1,2],取决于节点的指定顺序。

  • discovery.seed_hosts:此字段用于设置在 Elasticsearch 集群中节点相互连接的发现方法,它为我们的集群指定了一个静态主机列表。由于我们之前配置的是无头服务,我们的 Pod 具有唯一的 DNS 地址 es-cluster-[0,1,2].elasticsearch.kube-logging.svc.cluster.local,因此我们相应地设置此地址变量即可。由于都在同一个 namespace 下面,所以我们可以将其缩短为 es-cluster-[0,1,2].elasticsearch。要了解有关 Elasticsearch 发现的更多信息,请参阅 Elasticsearch 官方文档:Discovery and cluster formation | Elasticsearch Guide [8.6] | Elastic

  • ES_JAVA_OPTS:这里我们设置为-Xms512m -Xmx512m,告诉JVM使用512 MB的最小和最大堆。这个值应该根据群集的资源可用性和需求调整这些参数。要了解更多信息,请参阅设置堆大小的相关文档:Heap size settings | Elasticsearch Guide [8.6] | Elastic

# initcontainer 内容
······
      initContainers:
      - name: fix-permissions
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-vm-max-map
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
······

        这里我们定义了几个在主应用程序之前运行的 Init 容器,这些初始容器按照定义的顺序依次执行,执行完成后才会启动主应用容器。

        第一个名为 fix-permissions 的容器用来运行 chown 命令,将 Elasticsearch 数据目录的用户和组更改为1000:1000(Elasticsearch 用户的 UID)。因为默认情况下,Kubernetes 用 root 用户挂载数据目录,这会使得 Elasticsearch 无法访问该数据目录,可以参考 Elasticsearch 生产中的一些默认注意事项相关文档说明:Install Elasticsearch with Docker | Elasticsearch Guide [8.6] | Elastic

        第二个名为 increase-vm-max-map 的容器用来增加操作系统对 mmap 计数的限制,默认情况下该值可能太低,导致内存不足的错误,要了解更多关于该设置的信息,可以查看 Elasticsearch 官方文档说明:Virtual memory | Elasticsearch Guide [8.6] | Elastic

最后一个初始化容器是用来执行 ulimit 命令增加打开文件描述符的最大数量的。

此外 Elastisearch Notes for Production Use 文档还提到了由于性能原因最好禁用 swap,对于 Kubernetes 集群而言,最好也是禁用 swap 分区的。

        现在我们已经定义了主应用容器和它之前运行的 Init Containers 来调整一些必要的系统参数,接下来可以添加数据目录的持久化相关的配置。

# 在 StatefulSet 中,使用 volumeClaimTemplates 来定义 volume 模板即可
······
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: do-block-storage
      resources:
        requests:
          storage: 10Gi

        我们这里使用 volumeClaimTemplates 来定义持久化模板,Kubernetes 会使用它为 Pod 创建 PersistentVolume,设置访问模式为 ReadWriteOnce,这意味着它只能被 mount 到单个节点上进行读写,然后最重要的是使用了一个名为 do-block-storage 的 StorageClass 对象,所以我们需要提前创建该对象,我们这里使用的 NFS 作为存储后端,所以需要安装一个对应的 nfs  provisioner 驱动。 

注意:上述几段内容代码的解释都是同一个 elasticsearch-statefulset.yaml 文件里的内容!

# 查看 es 的 pod 是否创建成功
[root@k8s-master1 efk]# kubectl get pods -n kube-logging 
NAME           READY   STATUS    RESTARTS   AGE
es-cluster-0   1/1     Running   0          22s
es-cluster-1   1/1     Running   0          15s
es-cluster-2   1/1     Running   0          8s

[root@k8s-master1 efk]# kubectl get svc -n kube-logging 
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
elasticsearch   ClusterIP   None         <none>        9200/TCP,9300/TCP   88m

        pod 部署完成之后,可以通过 REST API 检查 elasticsearch 集群是否部署成功,使用下面的命令将本地端口 9200 转发到 Elasticsearch 节点(如es-cluster-0)对应的端口: 

[root@k8s-master1 efk]# kubectl port-forward es-cluster-0 9200:9200 --namespace=kube-logging

# 新开一个 master1 终端,执行如下请求,可以访问到数据
[root@k8s-master1 efk]# curl http://localhost:9200/_cluster/state?pretty

二、安装 kibana 可视化 UI 界面

把 kibana_7_2_0.tar.gz 文件上传到 node1、node2 节点,手动解压

[root@k8s-node1 ~]# docker load -i kibana_7_2_0.tar.gz 
[root@k8s-node2 ~]# docker load -i kibana_7_2_0.tar.gz 

[root@k8s-master1 efk]# vim kibana.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: kube-logging
  labels:
    app: kibana
spec:
  ports:
  - port: 5601
  selector:
    app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: kube-logging
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:7.2.0
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 100m
        env:
          - name: ELASTICSEARCH_URL
            value: http://elasticsearch.kube-logging.svc.cluster.local:9200
        ports:
        - containerPort: 5601

[root@k8s-master1 efk]# kubectl apply -f kibana.yaml 

[root@k8s-master1 efk]# kubectl get pods -n kube-logging | grep kibana
kibana-57dd8dfbb6-5g44t   1/1     Running   0          5m9s

[root@k8s-master1 efk]# kubectl get svc -n kube-logging | grep kibana
kibana          ClusterIP   10.108.22.154   <none>        5601/TCP            5m39s

        上面我们定义了两个资源对象,一个 Service 和 Deployment,为了测试方便,我们将 Service 设置为了 NodePort 类型,Kibana Pod 中配置都比较简单,唯一需要注意的是我们使用 ELASTICSEARCH_URL 这个环境变量来设置 Elasticsearch 集群的端点和端口,直接使用 Kubernetes DNS 即可,此端点对应服务名称为 elasticsearch,由于是一个 headless service,所以该域将解析为 3 个 Elasticsearch Pod 的 IP 地址列表。

# 修改 service 的 type 类型为 NodePort
[root@k8s-master1 efk]# kubectl edit svc -n kube-logging kibana 
······
  selector:
    app: kibana
  sessionAffinity: None
  type: NodePort        # 把 ClusterIP 修改为 NodePort
status:
  loadBalancer: 
······

# 随机生成端口
[root@k8s-master1 efk]# kubectl get svc -n kube-logging | grep kibana
kibana          NodePort    10.108.22.154   <none>        5601:30948/TCP      9m51s

        在浏览器中打开 http://<任意节点IP>:30948 即可,如果看到如下欢迎界面证明 Kibana 已经成功部署到了 Kubernetes 集群之中(需要等待一段时间,等容器初始化完成才可访问):

上一篇文章:【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(上)_Stars.Sky的博客-CSDN博客

下一篇文章:【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(下)_Stars.Sky的博客-CSDN博客

基于k8s构建企业jenkinscicd

Jenkins配置安装插件:kubernetes、git、pipeline、kubernetescontinuousdeploy配置Jenkins挂钩k8s环境点击“系统管理”=》“系统设置”。一直往下滑动,点击“新增一个云”,选择k8s。如果这边没有出现k8s,则代表你的插件没有安装成功,请... 查看详情

基于k8s构建企业jenkinscicd

1.Jenkins配置安装插件:kubernetes、git、pipeline、kubernetescontinuousdeploy配置Jenkins挂钩k8s环境点击“系统管理”=》“系统设置”。一直往下滑动,点击“新增一个云”,选择k8s。如果这边没有出现k8s,则代表你的插件没有安装成功,... 查看详情

如何基于k8s多租能力构建serverlesscontainer

当前Kubernetes已经成为名副其实的企业级容器编排规范,很多云平台都开始提供兼容Kubernetes接口的容器服务。而在多用户支持方面,多数平台选择直接提供专属虚机集群,用户需要花费大量精力处理集群规模、资源利用率、费用... 查看详情

基于coredns和k8s构建云原生场景下的企业级dns

...简介CoreDNS是一个Go语言编写的灵活可扩展的DNS服务器,在Kubernetes中,作为一个 查看详情

2019工作总结(代码片段)

...、开发与架构详解Redis开发与运维Kubuernetes权威指南第4版Kubernetesinaction(中文版)再也不踩坑的Kubernetes实战指南Kubernetes进阶实战Kubernetes网络权威指南Elasticsearch源码解析与优化实战Jenkins2.X实践指南Jenkins权威指南第2版Elasticsearch... 查看详情

jenkins知识概括(代码片段)

...成(上)Jenkins+Docker+SpringCloud微服务持续集成(下)基于Kubernetes/K8S构建Jenkins持续集成平台(上)基于Kubernetes/K8S构建J 查看详情

kubernetes和jenkins——基于kubernetes构建jenkins持续集成平台

基于Kubernetes/K8S构建Jenkins持续集成平台Kubernetes+Docker+Jenkins持续集成架构图Kubernetes+Docker+Jenkins持续集成方案好处Kubeadm安装KubernetesKubernetes的架构安装环境准备安装Docker、kubelet、kubeadm、kubectl安装Docker安装kubelet、 查看详情

k8s结合prometheus构建企业级监控告警系统

...金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还 查看详情

企业态势感知系统构建开发实战

一工作原理二基于NIDS的***检测三安全告警通过基于NIDS的***检测以及WAF拦截数据四日志分析五数据大屏 查看详情

企业运维实战--k8s学习笔记11.k8s容器资源限制(代码片段)

...制namespace设置资源限制Namespace配置Pod配额k8s容器资源限制Kubernetes采用request和limit两种限制类型来对资源进行分配。request(资源需求):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。limit(资源限额):即运行 查看详情

企业运维实战-k8s学习笔记17.k8s集群+prometheus监控部署基于prometheus实现k8s集群的hpa动态伸缩虚拟机部署prometheus监控(代码片段)

企业运维实战-k8s学习笔记17.k8s集群+Prometheus监控部署、基于prometheus实现k8s集群的hpa动态伸缩一、Prometheus简介二、Prometheus+k8s部署1.k8s集群部署Prometheus2.设定Prometheus监控应用nginx3.基于prometheus实现k8s集群的hpa动态伸缩三、虚... 查看详情

kubernetes和jenkins——基于kubernetes构建jenkins持续集成平台(代码片段)

基于Kubernetes/K8S构建Jenkins持续集成平台Kubernetes+Docker+Jenkins持续集成架构图Kubernetes+Docker+Jenkins持续集成方案好处Kubeadm安装KubernetesKubernetes的架构安装环境准备安装Docker、kubelet、kubeadm、kubectl安装Docker安装kubelet、 查看详情

k8s实战-构建django项目-03-使用共享存储(代码片段)

...失,这个时候,就要使用共享存储,来实现数据持久化。kubernetes提供了数据持久化的方案,我在之前的kubernetes-从入门到弃坑-8中也介绍了PV和PVC。这里我们继续使用NFS创建pv(外部存储系统中的一块存储空间),pvc(对pv资源的... 查看详情

k8s部署harbor仓库实战

...功能。在K8S中安装Harbor的过程如下:系统版本:ubuntu20.04Kubernetes版本:v1.21.5Helm版本:v3.6.3Chart版本:1.8.1添加仓库更新仓库NFSServer:192.168.5.22chartmuseum目录:/mydata/k8s/public/harbor/chartmuseumdatabase目录:/mydata/k8s/public/harbor/databasejobservice... 查看详情

kubernetes快速实战与核心原理剖析

K8S概览1.1K8S是什么?K8S官网文档:https://kubernetes.io/zh/docs/home/K8S是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白... 查看详情

kubernetes快速实战与核心原理剖析

K8S概览1.1K8S是什么?K8S官网文档:https://kubernetes.io/zh/docs/home/K8S是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白... 查看详情

pl2121-基于storm构建实时热力分布项目实战

PL2121-基于Storm构建实时热力分布项目实战新年伊始,学习要趁早,点滴记录,学习就是进步!不要到处找了,抓紧提升自己。对于学习有困难不知道如何提升自己可以加扣:1225462853获取资料.PL2121-基于Storm构建实时热力分布项目实... 查看详情

基于k8s构建企业jenkinscicd

介绍及准备工作1.概述持续集成(ContinuousIntegration,CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。持续部署(ContinuousDeployment,CD):部署到测试环境、预生产环境、生产环境。持续交付(ContinuousDeliv... 查看详情