K8S案例01

Kubernetes(K8s)运维实战:案例解析与代码实践 本文将结合具体案例,通过代码实践的方式,深入探讨K8s在运维中的应用和技巧。通过本案例的实践,我们可以看到K8s在运维中的强大功能和便利性。它不仅能够简化应用的部署和管理流程,还能够提供丰富的监控和日志收集功能,帮助我们更好地了解应用的运行状态和性能表现。运维人员需要熟悉K8s的核心组件、资源对象以及API操作,掌握常用的运维工具和技巧,以便快速定位和解决问题,确保集群的稳定运行。通过Prometheus和Fluentd,我们可以实时查看应用的指标数据和日志信息,便于进行故障排查和性能优化。 阅读详情
一个简单的例子
  • Java Web应用:

  • 是一个运行在 tomcat里的 Web App,如图1.1所示,JSP页面通过JDBC直接访问 MYSQL数据库并展示数据。为了演示和简化的目的,只要程序正确连接到了数据库上,它就会自动完成对应的 Table的创建与初始化数据的准备工作。所以,当我们通过浏览器访问此应用的时候,就会显示一个表格的页面,数据则来自数据库。
    在这里插入图片描述

  • 此应用需要启动两个容器: Web App容器和 MYSQL容器,并且 Web App容器需要访问MYSQL容器。在 Docker I时代,假设我们在一个宿主机上启动了这两个容器,则我们需要把MYSQL容器的IP地址通过环境变量的方式注入 Web App容器里;同时,需要将 Web App容器的8080端口映射到宿主机的8080端口,以便能在外部访问。

  • 安装好k8s,启动好各种服务后,首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml

apiVersion: v1
kind: ReplicationController #副本控制器RC
metadata: 
 name: mysql #RC的名称,全局唯一
spec:
 replicas: 1 #Pod副本期待数量
 selector:
  app: mysql #符合目标的pod拥有此标签
 template: #根据此模板创建pod的副本(实例)
  metadata:
   labels:
    app: mysql #pod副本拥有的标签,对应RC的Selector
  spec:
   containers: #pod内容起的定义部分
   - name: mysql #容器的名称
     image: registry:5000/pre_images/mysql:5.5  #容器对应的docker image
     ports:
     - containerPort: 3306 #容器暴露的端口号
     env:  #注入到容器内的环境变量
     - name: MYSQL_ROOT_PASSWORD
       value: "123456"
  • yaml定义文件中的kind属性,用来表明此资源对象的类型,比如这里的值为“ Replication Controller,表示这是一个RC;

  • spec一节中是RC的相关属性定义,比如spec. selector是RC的Pod标签( Label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有 replicas个Pod实例在运行,这里我们设置 replicas=1表示只能运行一个 MYSQLPod实例。

  • 当集群中运行的Pod数量小于 replicas时,RC会根据 spec.template一节中定义的Pod模板来生成一个新的Pod实例, spec template. metadata.labels指定了该Pod的标签,需要特别注意的是:这里的 labels必须匹配之前的spe. selector,否则此RC每次创建了一个无法匹配 Label的Pod,就会不停地尝试创建新的Pod.

  • 创建好redis-master-controller.yaml文件以后,在Master节点用命令将它发布到k8s集群中:

    [root@node2 test]# kubectl create -f mysql-rc.yaml 
    replicationcontroller/mysql created
    
  • 查看RC和Pod

    [root@node2 test]# kubectl get rc
    NAME    DESIRED   CURRENT   READY   AGE
    mysql   1         1         1       3m49s
    [root@node2 test]# kubectl get pods 
    NAME          READY   STATUS    RESTARTS   AGE
    mysql-g2mqw   1/1     Running   0          3m49s
    
  • docker ps查看正在运行的容器,发现mysql容器已正常运行,除此之外,还有一个来自谷歌的pause容器,这就是pod的“根”容器。

  • 然后创建一各Service——MySQL的定义文件,mysql-svc.yaml。

    apiVersion: v1
    kind: Service #表明是k8s Service
    metadata: 
     name: mysql #Service的全局唯一名称
    spec:
     ports:
      - port: 3306 #Service提供服务的端口号
     selector: #Service对应的Pod拥有这里定义的标签
      app: mysql
    
    • 其中metadata.name是Service的服务名(ServiceName),port属性定义了Service的虚端口;spec.selector确定了哪些pod副本(实例)对应到本服务。类似地,我们通过kubectl create 命令创建Service对象
    kubectl create -f mysql-svc.yaml
    

    查看

    [root@node2 test]# kubectl get svc | grep mysql
    mysql        ClusterIP   10.96.114.38    <none>        3306/TCP         152m
    

    mysql服务被分配了一个虚拟地址,随后k8s集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号来连接和访问它。

    启动tomcat的启动,创建一个myweb-rc.yaml

    apiVersion: v1
    kind: ReplicationController
    metadata:
     name: myweb
    spec:
     replicas: 1
     selector:
      app: myweb
     template:
      metadata:
       labels:
        app: myweb
      spec:
       containers:
        - name: myweb
          image: kubeguide/tomcat-app:v1
          ports:
          - containerPort: 8080
          env:
          - name: MYSQL_SERVICE_HOST
            value: 'mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'
    
  • 注意到引用了MYSQL_SERVICE_HOST=mysql环境变量,而“MySQL”恰好是我们之前定义的MySQL服务的服务名,运行命令,完成创建和验证

    kubectl create -f myweb-rc.yaml 
    [root@node2 test]# kubectl get pods | grep myweb
    myweb-hlmxz   1/1     Running   0          103m
    
  • 创建对应的Service

apiVersion: v1
kind: Service
metadata:
 name: myweb
spec:
 type: NodePort
 ports:
  - port: 8080
    nodePort: 30001
 selector:
  app: myweb
  • 注意type=NodePort和nodePort=30001两个属性,标明此Service开启了NodePort访问的外网访问模式,在k8s集群之外,比如在本机的浏览器里,可以通过30001这个端口访问myweb9对应到8080的虚端口上)。

    kubectl create -f myweb-svc.yaml 
    
    [root@node2 test]# kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          3d19h
    mysql        ClusterIP   10.96.114.38    <none>        3306/TCP         165m
    myweb        NodePort    10.107.166.10   <none>        8080:30001/TCP   139m
    

Deployment

创建一个tomcat-deployment.yaml的Deployment描述文件,内容如下:

apiVersion: apps/v1   
kind: Deployment
metadata:
 name: frontend
spec:
 replicas: 1
 selector:
  matchLabels:
   tier: frontend
  matchExpressions:
   - {key: tier, operator: In, values: [frontend]}
 template:
  metadata:
   labels:
    app: app-demo
    tier: frontend
  spec:
   containers:
   - name: tomcat-demo
     image: tomcat
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 8080

apiVersion随版本的改变而改变:

  • 1.6版本之前 apiVsersion:extensions/v1beta1
  • 1.6版本到1.9版本之间:apps/v1beta1
  • 1.9版本之后:apps/v1

创建Deployment

kubectl apply -f tomcat-deployment.yaml 

查看Deployment

[root@node2 test]# kubectl get deployments
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
frontend   1/1     1            1           9m28s

UP-TO-DATE:最新版本的Pod的副本数量,用于指示在滚动升级的过程中,有多少个Pod副本已经成功升级。

AVAILABLE:当前集群中可用的Pod副本数量,即集群中当前存活的Pod数量。

运行命令查看Replica Set,可看到它的命名和Deployment名字有关系

[root@node2 test]# kubectl get rs
NAME                  DESIRED   CURRENT   READY   AGE
frontend-797f47d685   1         1         1       13m

然后查看pod,发现pod命名以Deployment对应的Replica Set的名字为前缀,这种命名很清晰地表明了一个Replica Set创建了哪些Pod

[root@node2 test]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
frontend-797f47d685-fx466   1/1     Running   0          18m

Service

创建一个tomcat-service.yaml的定义文件,内容为:

apiVersion: v1
kind: Service
metadata: 
 name: tomcat-service
spec:
 ports:
 - port: 8080
 selector:
  tier: frontend

创建

[root@node2 test]# kubectl apply -f tomcat-service.yaml 

之前在tomcat-deployment.yaml里定义的Tomcat的Pod刚好拥有这个标签,所以我们刚才创建的tomcat-service已经对应到一个Pod实例,运行下面的命令可以查看tomcat-service的Endpoint列表

[root@node2 test]# kubectl get endpoints
NAME             ENDPOINTS              AGE
kubernetes       192.168.242.132:6443   5d16h
tomcat-service   10.244.3.83:8080       3m55s

其中10.244.3.83是Pod的IP地址,端口8080是Container暴露的端口。

运行以下命令即可看到tomcat-service被分配的Cluster-IP:

[root@node2 test]# kubectl get svc tomcat-service -o yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"tomcat-service","namespace":"default"},"spec":{"ports":[{"port":8080}],"selector":{"tier":"frontend"}}}
  creationTimestamp: "2021-11-25T02:21:32Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:spec:
        f:ports:
          .: {}
          k:{"port":8080,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:tier: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2021-11-25T02:21:32Z"
  name: tomcat-service
  namespace: default
  resourceVersion: "252606"
  selfLink: /api/v1/namespaces/default/services/tomcat-service
  uid: 5aa2c1f2-008f-4229-a220-0dc5d3eb10d3
spec:
  clusterIP: 10.110.156.40
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    tier: frontend
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

在spec.ports的定义中,targetPort属性用来确定提供该服务的容器所暴露(EXPOSE)的端口号,及具体业务进程在容器内的targetPort上提供TCP/IP接入,而port属性则定义了Service的虚端口。前面定义Tomcat服务的时候,没有指定targetPort,则默认targetPort与port相同。

Kubernetes(K8S)学习(三):K8S实战案例 本文介绍了在Kubernetes集群中使用NodePort方式部署WordPress和MySQL的完整流程。首先创建了wordpress命名空间,然后通过yaml文件分别部署MySQL数据库(配置了root和wordpress用户密码)和WordPress应用(需指定MySQL服务地址)。最后通过NodePort暴露WordPress服务端口30467,实现通过宿主机IP访问WordPress安装界面。整个过程涵盖了命名空间创建、yaml文件编写、资源部署、服务暴露等关键步骤,并提供了常用kubectl命令 阅读详情

相关推荐

K8S:Rancher管理 Kubernetes 集群

本文对Rancher介绍:Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,确保集群的安全性,能够管理 k8s 集群。 对对Rancher安装以及配置、登录进入平台后如何操作进行介绍

Katie_ff的博客 5827

k8s--基础--01--介绍

合理使用资源,每次运行Job时,会自动创建一个Jenkins Slave,Job完成后,Slave自动注销并删除容器,资源自动释放,而且Kubernetes会根据每个资源的使用情况,动态分配Slave到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待该节点的情况。支持多种高可用解决方案,如keepalive+nginx,keepalived+haproxy等,可以使访问流量分发到不同的主机节点,减轻节点压力,如果某个节点出现故障,可以实现妙级切换,达到高可用,保证业务不中断。...

zhou920786312的博客 5万+

【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路

节点亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 Pod。Taint 和 Toleration 相互配合,可以用来避免 Pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 Pod,是不会被该节点接受的。如果将 toleration 应用于 Pod 上,则表示这些 Pod 可以(但不一定)被调度到具有匹配 taint 的节点上。

wyq2070857323的博客 2263

k8s-01-简介

Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统 MESOS APACHE 分布式资源管理框架 2019-5 Twitter 》 Kubernetes Docker Swarm 2019-07 阿里云宣布 Docker Swarm 剔除 Kubernetes 源自 Google 10年容器化基础架构 borg 系统 由 GO 语言开发 特点: 轻量级:消耗资源小 开源 弹性伸缩 负载均衡:IPVS Borg系统架构

青龙小码农 1万+

经典案例复盘——运维专家讲述如何实现K8S落地

运满满自开始微服务改造以来,线上线下已有数千个微服务的Java实例在运行中。这些Java实例部署在数百台云服务器或虚机上,除少数访问量较高的关键应用外,大部分实例均混合部署。这些实例的管理,采用自研平台结合开源软件的方式,已实现通过平台页面按钮菜单执行打包、部署、启动、停止以及回滚指定的版本等基本功能,取得了不错的效果。但仍然存在如下几个痛点:1.实例间资源隔离,尤其在高峰期或故障期间,单服务器上不同实例间CPU和内存资源的争抢特别明显。2.线上某个应用实例异常时需要人工干预,导致较长的故障时间。3.大批服务端应用新版上线后,如网站关键功能故障,需要针对每个应用,选择对应的版本,执行回滚操作,

24位ADC的精度陷阱:为什么你的ADS1232实测性能不达标?

本文深入探讨了24位ADC芯片ADS1232在实际应用中性能不达标的原因,揭示了高精度ADC性能依赖周边电路设计的关键问题。通过分析电源系统、参考电压稳定性、PCB布局等常见陷阱,提供了优化方案和调试技巧,帮助工程师充分发挥ADS1232的潜力,实现接近理论值的测量精度。

weixin_28285943的博客 405

16-k8s阶段性总结01-wordpress案例

步骤简单分析:1,准备NFS环境2,【wordpress的pod】创建deployment资源的wordpress(pod)容器;3,【用户访问的svc】创建用户访问的svc资源;4,【数据库的pod】创建deployment资源的数据库服务的pod容器;5,【数据库的svc】创建业务服务wordpress的pod资源访问数据库的svc资源;

2302_79199605的博客 1620

03.Linux下目录动态扩容,以分配home的部分空间给root为例

本篇文章将介绍Linux下分配home目录的部分空间给root目录。大致思路:卸载home,解除其磁盘容量占用->扩容root,增加其磁盘空间->重建恢复home操作演示环境为CentOS系统,其他操作系统例如openEuler也可作为参考。01.Linux下目录扩容,以增加root目录的磁盘容量分配为例操作系统版本如下名称版本CentOS7.6+

ChennyWJS的博客 2337

k8s pod的nodeName指定

1. nodeName指定 nodeName:指定节点名称,用于将Pod调度到指定的Node上,不经过调度器 apiVersion: v1 kind: Pod metadata: name: pod-example labels: app: nginx spec: nodeName: k8s-node2 # 直接分配 containers: - name: n...

七月流星雨 317

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6258

ROS2 Humble + TurtleBot4仿真环境搭建与避坑实战

本文详细介绍了ROS2 Humble与TurtleBot4仿真环境的搭建与避坑实战,包括环境配置、依赖安装、仿真调试和性能优化等关键步骤。通过保姆级教程和实用技巧,帮助开发者快速搭建稳定的机器人仿真环境,提升开发效率。特别推荐使用Ubuntu 22.04原生系统以避免常见问题。

weixin_30897233的博客 399

k8s day01-Pod的基础管理,常用故障排查命令,标签管理实战案例

将本地文件拷贝到"oldboyedu-linux82-nginx-alpine"的Pod的"/usr/share/nginx/html/oldboyedu.html"路径(若是文件则会进行重命名)。将本地文件拷贝到"oldboyedu-linux82-nginx-alpine"的Pod内"linux82-web"容器的"/usr/share/nginx/html/"路径。指定连接到"oldboyedu-linux82-nginx-alpine"Pod的"linux82-alpine"容器内。

lpx1249115962的博客 673

CE 7.4中文版实战:如何用自动汇编功能快速生成游戏修改器(附CT表保存技巧)

本文详细介绍了CE 7.4中文版中自动汇编功能的使用方法,帮助用户快速生成游戏修改器。从环境配置、内存地址定位到自动汇编代码注入,再到CT表保存和独立EXE生成,提供全流程实战指南,适合逆向工程爱好者和游戏修改器开发者。

keras9composer的博客 356

K8s(Kubernetes)简介及安装部署

前言: k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s。 k8s最初是在Google公司内部使用了10多年的技术,它的前身是叫做Borg(博格),直到2015年才被Google公司捐赠为开源项目。 如果之前我们有接触过OpenStack,那么应该知道管理VM虚拟机资源可以用OpenStack。那么管理容器所对应的开源平台是什么呢?k8s就是其中之一,在k8s之...

lvjianzhaoa的博客 4万+

三相逆变器拓扑结构的分析及应用场景

三相逆变器是电力电子领域中广泛应用的一种设备,用于将直流电转换为交流电。不同的拓扑结构在性能、成本、复杂度和应用领域上存在差异。小编将在本文中将进一步拓展对三相逆变器拓扑结构的分析,并探讨其适用的应用场景。

道合顺的博客 2235

FlashBootloader01-基于UDS的Flash Bootloader【架构篇】

文章目录1 Flash Bootloader的依赖项2 Flash Bootloader中使用的UDS的主要功能3 Flash Bootloader更新固件3.1 初始化MCU3.2 刷写流程 1 Flash Bootloader的依赖项 通常Flash Bootloader由以下四方面组成: UDS协议 上位机「编写Bootloader Sequence」 通信驱动(如CAN ) Flash Driver 2 Flash Bootloader中使用的UDS的主要功能 1. 10 02服务 客户端

3589

Kubernetes【01】k8s的工作机制是什么

你不告诉 K8s “怎么做”(How),而是告诉它“最终要成什么样”(What)。例如:你声明“我要运行 3 个 Nginx 实例”,K8s 自己决定如何创建、在哪创建、如何维护。我们可以将 K8s 的工作机制总结为一个自动化闭环系统用户声明期望状态↓kube-apiserver 接收并持久化到 etcd↓控制器监听 etcd,发现“当前 ≠ 期望”↓控制器发起调度、创建、删除等动作↓kube-scheduler 为 Pod 选择节点↓。

Aerkui的博客 776

如何使用 Python 爬取 58 同城招聘信息

职位名称:招聘的岗位名称,如“前端开发”、“数据分析师”等。公司名称:招聘公司的名称。薪资待遇:职位的薪资范围,通常以“面议”、“10k-20k”这样的形式表示。工作地点:公司所在的城市及具体地址。公司福利:例如五险一金、带薪年假、绩效奖金等。发布时间:职位信息的发布时间。一个典型的招聘页面 URL 格式通常如下:在这个页面上,职位信息会分页展示,爬虫需要模拟翻页,获取多个页面的招聘信息。

2201_76125261的博客 1291

Kubernetes(K8s)详解

Kubernetes(K8S)是一个开源的容器编排引擎,用于自动化部署、扩缩和管理容器化应用。其核心架构包括Master Node(含API Server、Scheduler、Controller Manager等组件)和Worker Node(含Kubelet、Kube-Proxy等)。K8S提供核心特性如服务发现、存储编排、自我修复等,支持通过kubectl命令行工具进行资源管理。Namespace用于隔离资源,Pod是最小部署单元,而Deployment则管理Pod的多副本和自愈能力。通过YAML文件

Java资料站 2009

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

K8S---01初识Kubernetes

k8s 安装配置

dys000000的博客 1565

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

k8s系列01-什么是kubernetes?

本文主要介绍什么是k8s以及k8s的基本架构和相关基础概念。 Kubernetes 一词源于希腊语,意为“舵手”或“飞行员”,作为一个可移植、可扩展的开源平台,k8s可以使用声明式配置来管理编排容器服务并且提高自动化水平和效率。同时,得益于庞大且仍不断在增长的生态系统支撑,k8s拥有海量可用的周边服务、工具和生态支持。 kubernetes官网上给出的定义如下:Kubernetes是用于自动部署,扩展和管理容器化应用程序的开源系统。(Kubernetes, also known as K8s, is an

tinychen 292

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Kubernetes(k8s)-StorageClass案例

我们上一小节介绍了StorageClass的基本逻辑,本小节将介绍一个真实的案例使用最容易获取的nfs作为服务端来提供存储。

1003

Kubernetes(K8s)_01_初识Kubernetes

Kubernetes(K8s)初识和资源管理

爱喝可乐的w 1442

kubernetes(三)-Rancher管理k8s集群

Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实现了 Kubernetes 集群在混合云+本地数据中心的集中部署与管理, 以确保集群的安全性,加速企业数字化转型。超过 40000 家企业每天使用 Rancher 快速创新。官网:https://docs.rancher.cn/

youxiao_90的博客 1205

Kubernetes专题-01 集群部署篇

nerdctl 精简版无法直接通过 containerd 构建镜像,需要与buildkit组全使用以实现镜像构建,完整版 nerdctl 是可以的buildkit项目是 Docker 公司开源出来的一个构建工具包,支持 OCI 标准的镜像构建buildkit 包含服务端和客户端,作用分别如下说明服务端buildkitd:当前支持 runc 和 containerd 作为 worker,默认是 runc客户端buildctl。

蛮荒仙侠 1334
上一篇: Kubernetes安装
下一篇: K8S案例02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值