>>> 目录 <<<


一、概述
二、核心组件
三、基本概念
四、系统架构
五、镜像制作
六、服务编排
七、持续部署
八、故障排查


>>> 正文 <<<


一、   概述

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetes特点:

☛   可移植: 支持公有云,私有云,混合云,多重云

☛    可扩展: 模块化, 插件化, 可挂载, 可组合

☛     自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展


二、   核心组件

1)   主要组件

●   etcd保存了整个集群的状态;

●   apiserver提供了资源操作的唯一入口,并提供访问控制、API注册和发现等机制;

●   scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

●   controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

●   kubelet负责维护容器的生命周期,同时也负责数据卷(CVI)和网络(CNI)的管理;

●   kube-proxy负责为Service提供集群内部的服务发现和负载均衡;

●   Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

2)   扩展组件

●   kube-dns负责为整个集群提供DNS服务

●   Metrics提供资源监控

●   Dashboard提供GUI

●   Ingress Controller为服务提供外网入口

●  Federation提供跨可用区的集群

●   Fluentd-elasticsearch:提供集群日志采集、存储与查询


三、   基本概念

1)   集群管理

◆  MasterK8s集群的管理节点,负责整个集群的管理和控制。

◆  NodeK8s集群的工作节点,负责集群中的工作负载。

◆  Namespace为K8s集群提供虚拟的隔离作用。

◆  Label通过给指定资源捆绑一个或多个不同的资源标签,来实现多维度的资源分组管理。

2)   资源管理

◆  PodK8s集群中运行部署应用的最小单元,可以支持多容器。

◆  RCK8s集群中最早的保证Pod高可用的API对象,之后扩展匹配模式新增了RS

◆  Deployment一个应用模式更广的API对象,通过操作RS进行创建、更新、滚动升级服务。

◆  StatefulSetK8s提供的管理有状态应用的负载管理控制器API。

◆  DaemonSet确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本。

◆  JobK8s用来控制批处理型任务的API对象,之后基于时间管理新增了CronJob

◆  Service定义了一个服务的多个Pod逻辑合集和访问Pod的策略,实现服务发现和负载均衡。

◆  HPA实现基于CPU使用率(或在使用自定义指标)的Pod自动伸缩的功能。

 

3)   存储管理

◆  Secret用来保存和传递密码、密钥、认证凭证这些敏感信息的对象。

◆  ConfigMap将配置信息与镜像内容分离,以使容器化的应用程序具有可移植性。

◆  Volume是Pod中能够被多个容器访问的共享目录。

◆  PV持久化存储和与之相关联的持久化存储声明(PVC),使得K8s集群具备了存储的逻辑抽象能力。


四、   系统架构

1)  集群高可用

K8s作为容器应用的管理中心,通过对Pod的数量进行监控,并且根据主机或容器失效的状态将新的Pod调度到其他Node上,实现了应用层的高可用性。

针对K8s集群高可用性还应包含以下两个层面的考虑:Etcd 数据存储的高可用性(至少3台)和Master组件的高可用性。

这里我们采用 Hproxy + Keepalive 高可用方案,并且与 Etcd 服务、Master组件均部署到同一节点。

2)  控制管理

K8s集群的管理和控制主要由Master节点负责,它来负责具体的执行过程,我们后面执行的所有命令基本都是在Master节点上运行的。

Master节点通常会占据一个独立的服务器,其主要原因是它太重要了,是整个集群的“首脑”,如果宕机或者不可用,那么对集群内容器应用的管理都将失效。

3)  工作负载

K8s集群中的计算能力由Node提供,最初Node称为服务节点Minion,后来改名为Node。

K8s集群中的Node也就等同于Mesos集群中的Slave节点,是所有Pod运行所在的工作主机,可以是物理机也可以是虚拟机。

4)  系统监控

Prometheus(普罗米修斯)是一套开源的监控、报警、时间序列数据库的组合。

基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。

这样做非常适合作为虚拟化环境监控系统,比如Docker、Kubernetes。

组件说明:

■   Prometheus负责实现对K8s集群监控数据的获取,存储以及查询。

■   PrometheusOperator为Prometheus实例的部署和管理提供了简单的监视定义。

■   KubeStateMetrics是K8s集群资源使用情况的聚合器,收集数据给K8s集群内使用(如HPA)。

■   AlertManager负责将告警信息重复数据删除,分组和路由到正确的接收者集成。

■   NodeExporter用于采集集群中各个节点的资源使用情况。

■   Grafana一个跨平台的开源的度量分析和可视化工具。

5)  日志收集

ELK分别指Elastic公司的Elasticsearch、Logstash、Kibana。在比较旧的ELK架构中,Logstash身兼日志的采集、过滤两职。

但由于Logstash基于JVM,性能有一定限制,因此,目前业界更推荐使用Go语言开发Fliebeat代替Logstash的采集功能,Logstash只作为了日志过滤的中间件。

组件说明:

■   Filebeat一个轻量型的单一功能数据采集器。

■   Logstash能够同时从多个来源采集数据,转换数据,将数据发送到诸如ES中。

■   Elasticsearch一个实时、分布式、可扩展的搜索引擎,通常用于索引和搜索大量日志数据。

■   Kibana可以让用户在 ES 中使用图形和图表对数据进行可视化。

6)  镜像仓库

Harbor是一个开源镜像仓库,可通过基于角色的访问控制来保护镜像,新版本的Harbor还增加了扫描镜像中的漏洞并将镜像签名为受信任。

作为CNCF孵化项目,Harbor提供合规性,性能和互操作性,以帮助你跨Kubernetes和Docker等云原生计算平台持续,安全地管理镜像。

Harbor组件均以Docker容器方式启动,因此,你可以将其部署在任何支持Docker的Linux发行版上。


五、   镜像制作

1)  镜像构建

# 适用java1.8服务
FROM hub.jhmy.com/base/java:1.8 # 维护者
MAINTAINER zhangfan # 工作目录
WORKDIR /root # 复制文件到镜像
COPY *.jar .
COPY lib/ lib/
COPY hosts.bak . # 查看当前目录
RUN ls -l . # 容器启动时运行命令
CMD ["./run.sh"]

构建镜像示例:docker build -t hub.jhmy.com/test/jmnbservice .

2)  容器结构

当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,其余层都称作“镜像层”。

启动容器示例:docker run -dit --name=myapp hub.jhmy.com/test/jmnbservice

进入容器示例:docker exec -it jmnbservice bash


六、   服务编排

1)  ConfigMap资源定义

主要定义配置文件内容。

apiVersion: v1
kind: ConfigMap
metadata:
name: jmnbservice
namespace: default
data:
application.properties: | server.port=1111
spring.server.port=2222
spring.dubbo.port=3333
logging.config=classpath:logback-spring.xml
logback.logdir=/home/jhmyPro/xsr/logs
logback.maxHistory=7
logback.totalSizeCap=10GB
logback.maxFileSize=128MB
dubbo.registry.address=zookeeper://10.11.12.13:2181
spring.application.name=JmNbService
......

2)  Deployment资源定义

需要定义Pod副本数、匹配标签、容器名称、对应镜像、监听端口、环境变量(java运行参数)、资源限制(cpu和memory)、挂载配置等。

apiVersion: apps/v1
kind: Deployment
metadata:
name: jmnbservice
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: jmnbservice
project: nb
template:
metadata:
labels:
app: jmnbservice
project: nb
annotations:
version: ""
spec:
containers:
- name: jmnbservice
image: hub.jhmy.com/test/jmnbservice:latest
imagePullPolicy: Always
env:
- name: JVM_OPTS
value: "-Xms1024m -Xmx1024m"
ports:
- name: spring
containerPort: 1111
- name: server
containerPort: 2222
- name: dubbo
containerPort: 3333
resources:
limits:
cpu: 200m
memory: 2Gi
requests:
cpu: 100m
memory: 1Gi
volumeMounts:
- name: config
mountPath: /root/application.properties
subPath: application.properties
- name: html
mountPath: /usr/local/nginx/html/clientexe
- name: log
mountPath: /home
volumes:
- name: config
configMap:
name: jmnbservice
- name: html
persistentVolumeClaim:
claimName: nginxhtml
- name: log
hostPath:
path: /home
type: DirectoryOrCreate

3)  Service资源定义

主要定义匹配Pod标签、暴露方式、以及暴露端口。

apiVersion: v1
kind: Service
metadata:
name: jmnbservice
namespace: default
spec:
type: NodePort
selector:
app: jmnbservice
project: nb
ports:
- name: spring
port: 1111
nodePort: 30121
- name: server
port: 2222
nodePort: 30122
- name: dubbo
port: 3333
nodePort: 30123

七、   持续部署

1)  部署应用

部署应用之前,请确保相关编排文件均已开发完成。至此,我们可以执行 kubectl create/apply 命令进行部署。

推荐使用apply,这样可以避免重复部署时报错,而且有利于编排文件修改更新,即当你修改编排文件后,只需要再次执行apply命令即可完成更新。

当然,如果你需要确保此次部署为唯一创建且信息完整,请使用create命令,并且你可以使用 kubectl delete 命令删除资源。

最后我们可以使用 -f 标签指定具体编排文件,也可以指定路径,批量执行。

[root@k8s-32 JmDiService]# ls
ConfigMap.yaml Deployment.yaml Service.yaml
[root@k8s-32 JmDiService]# kubectl apply -f .
configmap/jmdiservice created
deployment.apps/jmdiservice created
service/jmdiservice created
[root@k8s-32 JmDiService]# kubectl get cm; kubectl get deploy; kubectl get svc
NAME DATA AGE
jmdiservice 1 70s
NAME READY UP-TO-DATE AVAILABLE AGE
jmdiservice 2/2 2 2 70s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jmdiservice NodePort 10.102.153.176 <none> 20036:30111/TCP 69s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d16h

2)  滚动更新

通常进行应用升级,都是镜像版本的升级,我们可以使用 kubectl set image 命令设置新的镜像名称即可;

如果需要更新具体资源字段,则可以使用 kubectl patch 命令;当然,你也可以使用 kubectl edit 命令编辑资源对象。

[root@k8s-32 JmDiService]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
jmdiservice 2/2 2 2 4h54m
[root@k8s-32 JmDiService]# kubectl set image deployment/jmdiservice jmdiservice=hub.jhmy.com/project-test/jmdiservice:latest
deployment.apps/jmdiservice image updated
[root@k8s-32 JmDiService]# kubectl patch deployment/jmdiservice --patch '{"spec": {"template": {"metadata": {"annotations":{"version": "20200506" }}}}}'
deployment.apps/jmdiservice patched

3)  版本回滚

我们使用上面更新应用时K8S都会记录下当前的配置文件,保存为一个revision (版本),这样就可以通过这个版本回滚到特定的时间。

我们可以通过 kubectl rollout history 命令查看历史记录,并通过 kubectl rollout undo 撤销本次发布回滚到上一个部署版本,也可以使用--to-revision标签回滚到指定版本。

[root@k8s-32 JmDiService]# kubectl rollout history deployment/jmdiservice
deployment.apps/jmdiservice
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none> [root@k8s-32 JmDiService]# kubectl rollout undo --to-revision=2 deployment/jmdiservice
deployment.apps/jmdiservice rolled back

4)  CICD流程


八、   故障排查

1)  查看系统Event

通过 kubectl describe pod 命令,可以显示Pod创建时的配置定义、状态等信息,还可以显示与该Pod相关的最近的Event事件, 事件信息对于查错非常有用。

2)  查看容器日志

在需要排查容器内部应用程序生成的日志时, 我们可以使用 kubectl logs <pod_name> 命令。

3)  查看K8s服务日志

K8s服务默认使用systemd系统管理,那么systemd的journal系统会接管服务程序的输出日志。

我们可以 tailf /var/log/messages 查看系统日志,也可以使用 journalctl 工具来查看k8s组件的日志。

4)  寻求帮助

◎ Kubernetes官方网站任务详解:https://kubernetes.io/zh/docs/tasks/

◎ Kubernetes GitHub库问题列表:https://github.com/kubernetes/kubernetes/issues

作者:Leozhanggg

出处:https://www.cnblogs.com/leozhanggg/p/12837025.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Kubernetes实战总结的更多相关文章

  1. 新书推荐《再也不踩坑的Kubernetes实战指南》

      <再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...

  2. kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x

    1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...

  3. kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...

  4. kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用

    1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...

  5. kubernetes实战(二十九):Kubernetes RBAC实现不同用户在不同Namespace的不同权限

    1.基本说明 在生产环境使用k8s以后,大部分应用都实现了高可用,不仅降低了维护成本,也简化了很多应用的部署成本,但是同时也带来了诸多问题.比如开发可能需要查看自己的应用状态.连接信息.日志.执行命令 ...

  6. kubernetes实战(三十):CentOS 8 二进制 高可用 安装 k8s 1.17.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.17.x,相对于其他版本,二进制安装方式并无太大区别. 2. 基本环境配置 主机信息 192.168.1.19 k8s-ma ...

  7. Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序

    使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...

  8. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  9. 2020 最新 Kubernetes实战指南

    1.Kubernetes带来的变革   对于开发人员 由于公司业务多,开发环境.测试环境.预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省成本,其他环境可能是没有日志收集的,在没有用k8s的 ...

  10. Kubernetes实战总结 - 自定义Prometheus

    一.概述 首先Prometheus整体监控结构略微复杂,一个个部署并不简单.另外监控Kubernetes就需要访问内部数据,必定需要进行认证.鉴权.准入控制, 那么这一整套下来将变得难上加难,而且还需 ...

随机推荐

  1. "文本加粗"组件:<b> —— 快应用组件库H-UI

     <import name="b" src="../Common/ui/h-ui/text/c_tag_b"></import> &l ...

  2. springboot https证书配置

    如果公司有提供证书如: 拿到证书秘钥可直接在springboot 的配置文件中配置: server.ssl.key-store=classpath:cert.pfx server.ssl.key-st ...

  3. JS中的offsetWidth/offsetHeight/offsetTop/offsetLeft、clientWidth/clientHeight/clientTop/clientLeft、scrollWidth/scrollHeight/scrollTop/scrollLeft

    这是一组非常容易弄混的参数!都是描述某个盒子元素的宽度.高度以及上或左的距离偏移量. 1. offsetWidth / offsetHeight(不包括外边距) offsetWidth:返回元素的宽度 ...

  4. DLL/OCX文件的注册与数据执行保护DEP

    注册/反注册dll或ocx文件时,无论是用regsvr32还是DllRegisterServer/DllUnregisterServer,可能会遇到[内存位置访问无效]的问题: 此时把操作系统的数据执 ...

  5. week homework: 大家来找茬

    上周课程主题为用户体验,每位同学也根据自己使用APP的体验,例举出一些手机或电脑客户端软件的bug或用户体验非常不好的地方: Tianfu: GitHub.com:界面不够直观,有许多功能不知道入口在 ...

  6. Alpha Release Note 12/15/2015

    内容提要: ******Personal Photo Experience可供您存放所有的私人照片,系统会自动整理内容,您可以借助搜索功能快速找到所需图片,同时过滤重复图片和低质量图片,给您全新的搜索 ...

  7. E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)

    题目大意:  值得注意的一点是题目要求的是这些子段之间的最大整数和.注意和Max Sum Plus Plus这个题目的区别. 题解: 线性区间DP,对每一段考虑取或者不取.定义状态dp[i][j]指的 ...

  8. 腾讯云集群服务部署mysql并挂载到服务器

    一.背景 由于现在大部分的应用都是运行在云服务器上的,而现在大多数文章都是主要写如何在服务器上使用docker去运行mysql,比较少有介绍云服务器上的.再加上现在k8s比较火爆,而云厂商大多数都提供 ...

  9. async,await执行流看不懂?看完这篇以后再也不会了

    昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就 ...

  10. 极验反爬虫防护分析之slide验证方式下图片的处理及滑动轨迹的生成思路

    本文要分享的内容是去年为了抢鞋而分析 极验(GeeTest)反爬虫防护的笔记,由于篇幅较长(为了多混点CB)我会按照我的分析顺序,分成如下四个主题与大家分享: 极验反爬虫防护分析之交互流程分析 极验反 ...