硬核技能k8s初体验

Kubernetes 是一个软件系统,使你在数以万计的电脑节点上运行软件时就像所有节点是以单个大节点一样, 它将底层基础设施抽象,这样做同时简化了应用开发、部署,以及对开发和运维团队的管理。

Kubernetes集群架构

Kubernetes集群由很多节点组成,分为两大类:

  • 主节点 承载Kubernetes控制和管理整个集群系统的控制面板

  • 工作节点 运行实际部署的应用

控制面板

控制集群并使它工作,包含多个组件(组件单节点或通过副本分别部署到多个主节点以确保高可用)

  • Kubernetes Api Server:客户端Kubectl、控制面板其他组件和worker节点都需要和它通信

  • Scheduler: 调度应用

  • Controller Manager: 执行集群级别功能,如复制组件、持续跟踪工作节点、处理节点失败等

  • etcd:可靠的分布式数据库存储,能持久化集群配置

工作节点

运行容器化应用的机器,运行、监控、管理应用服务的任务由下组件完成:

  • Docker、rtk或其他容器类型

  • Kubelet与API Server通信,并管理它所在节点容器

  • Kube-Proxy:负责组件之间负载均衡网络流量

MiniKube环境& 核心概念

本处window10+Hyper-V搭建minikube本地集群

这台虚拟机既作为master,又作为worker,Kubectl从集群外部发起管理和控制。

# 因国内极差的网络环境,建议使用阿里云的镜像地址:
minikube start --image-mirror-country=cn --image-repository=http://registry.aliyuncs.com/google_containers  --registry-mirror=https://aq32bn7a.mirror.aliyuncs.com

以管理员权限执行CMD命令:

  • kubectl: 发送Restful api 控制Kubernetes集群管理器

  • Minikube是一个CLI工具,配置、管理(已针对开发流程优化)的单节点Kubernetes集群

列举4个核心概念

1. API

Kubernetes API作为声明式配置方案的基石,API文档中定义了API端点、资源,kubectl命令行工具可操作API对象,对象的序列化对象存储在etcd中,各组件也是通过API交互。

2. k8s对象

Kubernetes对象代表系统中持久化的实体,下面的实体都作为对象:

  • 哪些容器化应用正在运行

  • 这些应用程序可用的资源

  • 与这些应用程序有关的行为&策略:重新启动策略、升级和容错

Kubernetes对象是期望状态,创建对象之后,你就通知了K8s你希望集群这样运作。
大多数K8s对象由spec和status组成:

  • spec:[由你]提供资源的特征描述

  • status: [系统自行控制] 描述对象当前状态,由K8s系统组件设置和更新,K8s控制面板持续管理对象的实际状态去匹配你设定的期望状态

当你创建k8s对象, 你需要提供对象spec来描述预期状态。当使用k8s API(或者kubectl),在API请求的body包含json信息;大多数时给kubectl提供.yaml文件来代替json,kubectl会将yaml文件中信息转换为json再发起API请求。

下面的kubia-rs.yaml文件:ReplicaSet对象启动3个nodejs应用, [spec]定义了此次ReplicaSet的规格

apiVersion: apps/v1
kind: ReplicaSet
metadata:name: kubia-rs
spec:replicas: 3selector:matchLabels:app: kubiatemplate:metadata:labels:app: kubiaspec:containers:- name: kubiaimage: luksa/kubiaports:- containerPort: 8080
#  对于ReplicaSet啰嗦两句:新一代的ReplicationController; 通常不会直接创建ReplicaSet,而是在创建更高级的Deployment资源时自动创建它们。

3. Pod

Kubernetes Pod是创建/部署k8s对象中最小最简单的单元:
由于不能将多个进程聚集在一个单独容器,需要另外一种高级结构将容器绑定在一起,作为一个单元管理,这就是Pod背后根本原理, 一个pod中容器共享相同ip和端口空间。

4. Controller

k8s控制器是一个control loop(监控集群状态,在被需要时或主动请求时更新集群),每个控制器都试图将当前集群状态移动到期望状态

在机器人和自动化,control loop是一个非终止回路,用于调节系统状态,例如房间的空调。
控制器自身可以执行操作,但一般情况下,控制器会将引起连锁反应的消息发往api server.

Kubernetes内置了一些控制器: ReplicaSet、Deployment、StatefulSets、DaemonSet、Job...

# k8s deployment检查容器健康状态、保证容器数量、还具备部署相关的特性, deployment是管理和缩放容器的推荐控制器
kubectl  create  deployment  hello-kubia  --iamge=luksa/kubia

这4个概念连起来就是:K8s已经定义了API元数据,Controller调度K8s系统到指定的预期状态(这个预期状态以K8s对象体现),在落地形式上以创建/调度Pod来承载应用。    (此4个概念还不包含NetWork相关)

开启Kubernetes之旅

创建3实例nodejs应用

  1. 使用上面的K8s对象定义文件:kubia-rs.yaml文件:

\> kubectl  create  -f  kubia-rs.yaml\> kubectl get pod --show-labels=true
NAME             READY   STATUS    RESTARTS   AGE     LABELS
kubia-rs-96ncq   1/1     Running   0          3m40s   app=kubia
kubia-rs-h5ppz   1/1     Running   0          3m41s   app=kubia
kubia-rs-x5578   1/1     Running   0          3m40s   app=kubia

注意:Pod控制器中使用标签选择器来指定哪些Pod属于同一组(服务也使用同样机制)。

  1. 以上有多个Pod,创建服务对后端Pod形成负载均衡

[集群内访问]:ClusterIP   

[提供集群外访问]:

  • nodeport:把service的port 映射到集群节点的一个端口上

  • LoadBalancer:负载均衡器会单独分配一个ip地址并监听后端服务的指定端口,请求的流量会通过指定的端口转发到后端对应的服务。

  • Ingress (minikube addons先启用ingress,智能路由)

4种网络方式的yaml代码如下:请通过kubectl create  -f  *file*.yaml命令生成对应的服务(ingress不是服务)

LoadBalancer是服务暴露到集群外或者公网上的标准方式;
Ingress 这个服务类型跟我们前面的三种服务类型不一样,它实际上不是一种服务类型,而是类似一种集群服务入口的存在,它可以基于你配置的不同路径或者子域名把流量路由到对应的后端服务,更像是一个“智能路由”服务。

  1. 访问3 Pod实例的nodejs应用

  • ClusterIP 只能在集群内访问,minikube ssh 进入集群,或者Hyper-V进入VM后:curl 10.100.166.197访问

  • nodePort、Loadbalancer 需要使用minikube获取本地集群url

  • ingress 是复杂网络应用的常规做法

    (1) hosts文件添加host到IP地址的映射
    (2) 通过ingress路由访问pod

上面输出差异体现了随机Pod(即使连接来自同一个客户端),SessionAffinity亲和力属性(ClientIP)可让特定客户端所有请求都指向一个Pod。

旅行总结

本文从K8s全局架构讲起,力求先在你头脑中构筑宏观思维导图;
提出核心概念帮助全流程理解;
通过一个常见的多实例nodejs应用来实践k8s核心功能。
https://github.com/zaozaoniao/k8s-example.git

  • 使用Docker-Compose搭建高可用redis哨兵集群

  • 谁说docker-compose不能水平扩展容器、服务多实例?

  • 基于docker-compose的Gitlab CI/CD实践&排坑指南

  • 实例解读Docker Swarm

关注我们
更多干货及潮流技术

请关注Dotnet Plus公众号

“阅读全文,体验更佳”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线上问题排查流程

问题排查 针对各种常见的线上问题,梳理下排查思路。 业务问题 线上问题大多数时候都是业务问题引发的问题,当线上环境绝大多数请求都是正常,当有部分或者某一个用户有问题,此时怎么针对性的排查在当前微服务体系下,…

springboot超详细教程_CG原画插画教程:超详细线稿教程

艺学绘小编收集整理了超详细线稿教程今天我们从起稿开始1. 用圆表示出人物的头部、胸腔和骨盆,分别画出头部的十字线和身体的中线,表示头和身体的朝向。用“火柴棍”表示四肢的动作形态。▼2. 根据圆和十字线画出脸的轮廓,再在身体骨架上画出…

Asp.Net.Core WebApi 版本控制

前言在后端Api的开发过程中,无法避免的会遇到接口迭代的过程,如何保证新老接口的共存和接口的向前的兼容呢,这时候就需要对Api进行版本的控制,那如何优雅的控制Api的版本呢?开始Microsoft.AspNetCore.Mvc.Versioning 是一个微软官方推出的一个用于管理Api版本的包,配…

[Java基础]字节缓冲流

字节缓冲输出流: package InstreamPack;import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets;public class BufferStreamDemo01 {public s…

matlab 判断鼠标按下,Matlab:如何通过使用回调来获取当前鼠标在点击位置

I googled near and far, but couldnt get an example of how you associate a callback to the click event in matlab. Can someone show me an example?解决方案Define the WindowButtonDownFcn of your figure callback using the set command and an callbackfunction ta…

Python 推导,内含,迭代器

Python语法–推导或内含 list comprehension操作可以将一个序列类型的数据集推导出另一个序列类型的数据集: 典型的情况: for i in aiterator利用推导获取一个平方数列表 square [i * i for i in range(1, 11)]以上情况同如下循环 for i in range(…

用asp.net core结合fastdfs打造分布式文件存储系统

最近被安排开发文件存储微服务,要求是能够通过配置来无缝切换我们公司内部研发的文件存储系统,FastDFS,MongDb GridFS,阿里云OSS,腾讯云OSS等。根据任务紧急度暂时先完成了通过配置来无缝切换内部文件系统以及FastDFS。…

仅仅有人物没背景的图片怎么弄_五分钟写作课 人物篇 人物的出场是个关键时刻...

我看过不少故事,人物出场了,说了几句话,然后离开,读者知道他是某人的爸爸,学校的老师,某个企业的老板,除了这些定为之外,他自己是怎样的性格?怎样的形象呢?没…

数据结构与算法一篇帮助你吃下KMP算法

模式匹配 什么是模式匹配,我们用一个案例来说明: 当S “s1,s2,s3,s4 …sn” T“t1,t2,t3,t4 … tn” 在字符串S中寻找T字符串的过程就是模式匹配的过程,T就说模式串,S是主串 实现方案: 暴力破解,逐字符判…

在远程 CSM 课程中体验线上工作坊

4.11 日周六,我参与了由 Bob 老师组织讲授的一期 Certified Scrum Master(即 CSM)课程,从中收获颇丰,特记于此,与君分享。CSM 通常是现场授课,但本次由于疫情的限制导致人们不得不尽可能减少外出…

python中的max_row_Openpyxl max_row和max_column错误地报告了一个较大的figu

我的查询是处理作为Im开发的解析脚本的一部分的函数。我试图编写一个python函数来查找与excel中匹配值对应的列号。excel是用openpyxl动态创建的,它有第一行(来自第三列)标题,每个标题跨4列合并为一行。在我的后续函数中,我正在分析一些要添加…

数据结构与算法--力扣108题将有序数组转换为二叉搜索树

力扣108提将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次…

C#验证IP是否为局域网地址的三种方法

C#验证IP是否为局域网地址的三种方法前一阵子有【广州.NET群】的客户问起这个问题,说他们需要验证客户输入的网站是否为局域网。其实局域网的 IP并没有确定的定义,只要是局域网中,即可设置为任何一个 IP。但确实存在一个 内网保留地址的定义&…

扫地机器人隔板_【扫地机器人使用】_摘要频道_什么值得买

至于扫地机的单边刷好还是双边刷好,这个也是我原本有的问题,后来经过好友解答才知道,单边刷其实并不比双边刷效率低。对于带拖地功能的扫地机而言,更好的应该是单边刷。因为边刷主要的功能是将一些边缘角落的垃圾扫出来让主刷清洁…

数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树

将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结&…

[Java基础]字符缓冲流

代码如下: package CopyJavaPack01;import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException;public class CopyJavaDemo04 {public static void main(String[] args) throws IOException {BufferedWriter bw new BufferedWriter(new FileWri…