k8s入门你至少需要会哪些

前言

相信很多公司都有集成发布pass系统,底层大多数依赖于k8s来进行服务的发布部署/回滚等功能。对于很多业务开发者都是不可见的,在感叹这个东西真好用的同时,想着探一探这背后的原理。

今天这篇k8s入门我整理了必会的几个k8s知识点,写一个demo应用部署到k8s

•docker的使用,镜像的创建和发布(我当你已经会了哈)•k8s开发环境搭建•Deployment的使用•Service的使用•ConfigMap的使用
真正的入门还是得自己亲手跑起来!

学习环境搭建

首先k8s学习的话是建议用minikube搭建,这里系统我用的ubuntu20.04.2.0LTS

我这里用的是vmware虚拟机, 如果翻墙不顺利的话请加我微信获取已经装好环境的虚拟机(节省你时间不香吗),前提你的机器得是32G内存或以上

假设你自己装了,或者你用了我的vmware虚拟机,或者你用docker Desktop装的k8s,那么启动后

敲命令来启动minikube:

minikube start

耐心等待完成后使用 minikube status 查看状态是否是Running:

然后我们要启动k8s控制面板-dashbord服务,下面的命令里 --url 的意思是启动后,打印dashbord的url。不带的话会启动你本机浏览器打开。

minikube dashboard --url

k8s的控制面板默认的是本机(localhost)才能打开,所以需要使用k8s的proxy功能,到虚拟机的terminal窗口敲入以下命令:


kubectl proxy --port=8001 --address=0.0.0.0 --accept-hosts='^.*'

由于是虚拟机环境,只能是虚拟机所在的机器才能打开 需要做虚拟机端口映射, 本虚拟机的请忽略此步骤!

做了本机端口到虚拟机的端口映射之后,

打开你本机浏览器直接访问虚拟机的k8s的控制面板

注意我上面用的k8s proxy是8001端口,url如下:

http://<本机IP>:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/service?namespace=default

打开如下图:

写一个demo应用然后部署到k8s

demo就是一个自带的的天气预报的webapi模板。

然后创建成功后 需要更改一处代码(看注释):


[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet]public IEnumerable<WeatherForecast> Get(){//这里加下获取本机ip,因为到时候部署到k8s我们得确认是不是访问的ip会变化var feature = HttpContext.Features.Get<IHttpConnectionFeature>();string LocalIPAddr = feature?.LocalIpAddress?.ToString() ?? "unknow";var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),//到时候候我们确认这个字段即可Summary = LocalIPAddr}).ToArray();}
}

然后把这个demo应用创建一个镜像并推送到dockerhub仓库,

这里我使用我的开源工具AntDeploy来一键推送(不装docker环境也能做镜像)。

这个工具使用教程可以查看我之前写的

[开源]制作docker镜像不依赖linux和Docker环境

工具的背后原理可以查看:

Docker镜像构建原理解析(不装docker也能构建镜像)

我把这个demo传到了dokcerHub镜像的地址:nainaigu/k8s-demo:1.8

1. Deployment的使用

Deployment的作用是定义及管理多副本应用(即多个副本 Pod)

如果Pod出现故障,对应的服务也会挂掉,所以Kubernetes提供了一个Deployment的
目的是让Kubernetes去管理一组Pod的副本,也就是副本集,
这样就能够保证一定数量的副本一直可用,不会因为某一个Pod挂掉导致整个服务挂掉。

编写Deployment的yml文件(看注释)


apiVersion: apps/v1 //指定版本,支持的版本可以通过kubectl api-versions查询
kind: Deployment //固定 指定类型,这一次我们要创建一个Deployment
metadata: #元数据name: k8s-demo //delpoyment的名称,必须在deployment中保持唯一labels:name: k8s-demo //反正所有标签都一个名字
spec: //deployment的详细内容replicas: 2 //容器2个副本podselector: //选择器matchLabels:name: k8s-demo //选择label中的name=k8s-demo的template:metadata:labels:name: k8s-demo //指定一个label名为name,值为k8s-demo,对应上面的selectorspec:containers:- name: k8s-demo //容器名image: nainaigu/k8s-demo:1.8 //镜像地址imagePullPolicy: IfNotPresent //如果本地没有镜像就去仓库pullports:- containerPort: 5000 //容器暴露的端口 env: //环境变量- name: "ASPNETCORE_URLS"value: "http://0.0.0.0:5000" 

上面的配置的意思就是:

•从镜像仓库拉取你的镜像•配置你的镜像启动的参数,暴露的端口等•给你这个服务起个名字并且打上标签,执行后会有2个pod(服务实例)

接下来把这个配置保存为k8s-demo.yml 上传到虚拟机然后敲命令装配到k8s

//创建
kubectl create -f k8s-demo.yaml //查看,后面想看某个pod的启动日志 也需要先找到pod名称
kubectl get pod -l name=k8s-demo

然后在k8s面板上查看

2. Service的使用和创建

k8s Service定义了这样一种抽象:Service是一种可以访问 Pod逻辑分组的策略, Service通常是通过 Label Selector访问 Pod组(等下在写service的yml文件就能看出来了)

Service的出现,可以解决每次Deployment的时候ip会换的问题

不过Service只支持4层的负载均衡,不支持7层(k8s是用Ingress来支持7层)。

当Pod宕机后重新生成时,其IP等状态信息可能会变动,
Service会根据Pod的Label对这些状态信息进行监控和变更,保证上游服务不受Pod的变动而影响

Service在 K8s中有常见的以下几种类型:

•ClusterIp <只能是集群内部访问,可以通过proxy让外部访问>•NodePort <NodePort来暴露服务让外部访问>•LoadBalancer <生产环境一般都是使用LoadBalancer的方式>


apiVersion: v1
kind: Service
metadata:name: k8s-demo
spec:selector: //筛选pod。上面创建Deployment的时候指定了name: k8s-demotype: ClusterIP  //只能k8s集群内部访问,外部网络不能够访问到ports:- protocol: TCPport: 5000   //k8s集群内部通过 5000 端口来访问 下面的targetPort: 5000 //容器暴露端口,与Dockerfile暴露端口保持一致

上面的Service配置表示:

•创建了一个名叫k8s-demo的Service•用来访问上面我们Deployment创建的一组name=k8s-demo的Pods•不管你Deployment后面是重新发布还是扩容还是缩容,不管怎么变化,只要通过Service暴露的端口就能负载均衡的访问到那一组 Pods•我们设置的类型是ClusterIP,默认是k8s集群内部可访问,但是也可以通过k8s的proxy功能来访问

如果是NodePort(可以集群外访问)的话要需要按照如下规则来配置


apiVersion: v1
kind: Service
metadata:name: k8s-demo
spec:selector: //筛选pod。上面创建Deployment的时候指定了name: k8s-demotype: NodePort //配置为NodePort,外部可以访问,要定义下面的nodePort参数ports:- protocol: TCPport: 5000   //k8s集群内部通过 5000 端口来访问 下面的targetPort: 5000 //容器暴露端口,与Dockerfile暴露端口保持一致nodePort: 30001 // NodePort,外部访问的端口来访问上面的targetPort

总结这2种的区别就是:

集群内 serviceip:容器端口。集群外:  宿主机IP:nodePort端口

我们按照第一种方式(type: ClusterIP)测试

查看下service的ip:10.105.108.92

由于是集群内部才能访问,所以先用下面的命令进入minikube搭建的k8s集群内部环境


minikube sshcurl http://10.105.108.92:5000/WeatherForecast

访问服务成功!!

在外部网络可以使用k8s的proxy来访问


http://10.32.104.164:8001/api/v1/namespaces/default/services/k8s-demo:5000/proxy/WeatherForecast

注意通过proxy访问的url拼接的规范:

•k8s-demo:5000 代表你创建的service的名称和端口•/WeatherForecast 代表你服务暴露的接口

ConfigMap的使用

ConfigMap 就是为了让镜像 和 配置文件解耦。好比一个动态的数据源,你创建后可以在 创建Deployment的时候指定用它。然后你想要动态更新,容器内也能监听到文件内容更改,进行热重载!

k8s的另外一个类似的功能叫secret,Secret类似于ConfigMap,是用Base64加密,密文显示,一般存放敏感数据!

下面创建一个appsettings.json的configMap


apiVersion: v1
kind: ConfigMap
metadata:name: appsettings
data:appsettings.json: |-{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Settings": {"Message": "The configuration is working!" } }

然后改下demo应用

这里单独搞了一个Settings的目录来保存配置文件。

然后在api里面读出来配置的Settings.Message信息

这里注意有一个坑 :netcore中的默认的机制是监听配置文件的lastChangetime, 但是configMap变更后居然不会有任何变化(因为它是符号连接(symbolic link)),所以需要自己写一个watch来适配,详细可以看demo中的代码!

下面来测试下效果:

第一步:把configMap创建到k8s中

第二步:先删除掉上面创建的Deployment和Service

第三步:在Deployment的配置中用configMap

第四步:重新创建Deployment和Service

以上四步可以一次性搞定, k8s的yml可以把Deployment和Service和configMap全放在一个yml文件:


apiVersion: apps/v1
kind: Deployment
metadata:name: k8s-demolabels:name: k8s-demo
spec:replicas: 2selector:matchLabels:name: k8s-demotemplate:metadata:labels:name: k8s-demospec:containers:- name: k8s-demoimage: nainaigu/k8s-demo:1.8imagePullPolicy: IfNotPresentports:- containerPort: 5000env:- name: "ASPNETCORE_URLS"value: "http://0.0.0.0:5000"volumeMounts:- name: appsettings-volume mountPath: "/publish/Settings" //这里用configMapvolumes:- name: appsettings-volumeconfigMap:name: appsettings   //这里用configMap---apiVersion: v1
kind: Service
metadata:name: k8s-demo
spec:selector:name: k8s-demotype: ClusterIPports:- protocol: TCPport: 5000targetPort: 5000---apiVersion: v1
kind: ConfigMap
metadata:name: appsettings
data:appsettings.json: |-{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Settings": {"Message": "The configuration is working!" } }

如上图,一个yml创建了configMap,Service,Deployment。

创建完成后,看下k8s面板:

通过proxy访问下我们的demo服务:

由于我们在Deployment指定replicas:2个pod,访问服务会负载均衡,ip会切换。

配置读取的configmap信息是默认的 “The configuration is working!”

下面我们动态修改下configMap,来测试下demo应用会不会重新加载!

然后在来访问下demo服务

确实加载到了新的配置了!

补充一些常用的命令:

查看部署的历史记录:

kubectl rollout history deployment.apps/k8s-demo

回滚 :kubectl rollout undo 比如回滚到上一个:

kubectl rollout undo deploy/k8s-demo

回滚到指定的版本:

kubectl rollout undo deploy/k8s-demo --to-revision=2 

指定的版本可以通过历史记录的Revision字段

扩缩容kubectl scale

kubectl scale deployment k8s-demo --replicas=2

也可以在面板上操作

把2个实例 扩容到3个实例:

也可以设置达到某个条件自动扩容:

kubectl autoscale deployment k8s-demo --min=10 --max=20 --cpu-precent=70

代表最低10个实例,一旦cpu超过70% 自动触发扩容 最大扩容到20个实例

查看Deployment的容器启动日志 kubectl logs

demo应用的源码:https://github.com/yuzd/envoytest


我在学习envoy的filter开发,有经验的老鸟请带带我,有一起学的朋友欢迎加我微信交流。

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

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

相关文章

Windows CE的电源管理之三

本篇将以Windows Mobile为例介绍Windows CE电源管理的实现&#xff0c;大体上&#xff0c;Windows Mobile分为Pocket PC和Smartphone两种版本。这两者之间的主要区别在于触摸屏和电源模型&#xff0c;Smartphone采用的是“Always On”模型。为了说清楚它们的区别&#xff0c;我…

跟你们讲一个鬼故事,TA回来了!

全世界只有3.14 % 的人关注了青少年数学之旅真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给…

java之static关键词的作用

static关键词的作用 1、静态成员变量的语法特定 2、静态函数的语法特定 3、静态代码块的语法特定 定义静态成员变量 Person.java class Person{ static int a; }按照以前可以这么调用 public class Test1{ public static void main(String[] args){ Person person new Per…

分布式事务最终一致性-CAP框架轻松搞定

前言对于分布式事务&#xff0c;常用的解决方案根据一致性的程度可以进行如下划分&#xff1a;强一致性(2PC、3PC)&#xff1a;数据库层面的实现&#xff0c;通过锁定资源&#xff0c;牺牲可用性&#xff0c;保证数据的强一致性&#xff0c;效率相对比较低。弱一致性(TCC)&…

Cus系统beta1.2发布

2019独角兽企业重金招聘Python工程师标准>>> 经过小伙伴的努力&#xff0c;Cus后台管理系统开发完成&#xff0c;完善了后台系统&#xff0c;权限控制&#xff0c;新闻发布&#xff0c;商务合作等等功能 主要功能包括&#xff1a; 后台系统截图 更多后台系统截图请点…

区区6位密码,凭什么守护我的百万家产?

全世界只有3.14 % 的人关注了青少年数学之旅今天超模君非常的开心你问为什么&#xff1f;当然是——又双叒可以买新的数学书好开心&#xff01;不过在这欢快的气氛中超模君却听见了小天的叹气声玩笑归玩笑但是银行的密码系统真很安全的吗&#xff1f;今天我们就来讨论下密码学的…

Java开发之上班摸鱼!写最少的代码!

I 前言 本次分享一下我所知道的如何写最少的代码的小技巧&#xff0c;如果你有更好的方案&#xff0c;欢迎在评论区留言&#xff0c;方案很棒的话&#xff0c;加我交流圈&#xff0c;为你送上冬天的一杯奶茶~ Java&#xff1a;我想返回多个返回值 秀一下Go的多返回值&#xf…

Windows 11 预览版 Build 22000.120 发布

微软现已发布第五个 Windows 11 预览版更新 KB5005188&#xff0c;版本号升级至 Build 22000.120。本次更新面向 Dev 频道和 Beta 频道的 Windows 预览体验成员推出。Windows 11 Insider Preview Build 22000.120 主要变化如下&#xff1a;1.全新的 Family Safety&#xff08;家…

robocopy帮助

一 Robocopy简介 Robocopy 是一个功能超强的32位的文件复制工具&#xff0c;该工具来自windows资源包&#xff0c;可以直接在网上下载。 使用Robocopy你能够拷贝单个目录&#xff0c;或迭代的拷贝目录及其所有的子目录。该工具通过文件是否存在于源目录&#xff0c;目标目录&am…

有趣的灵魂连墓碑都很酷! | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源别是个沙雕吧&#xff0c;侵权删&#xff09;

实施Exchange 2013中的 MailTip

实施Exchange 2013中的 MailTip邮件提示是用户撰写邮件时向其显示的提示性消息。Microsoft Exchange Server 2013 将分析邮件&#xff08;包括向其发送了邮件的收件人的列表&#xff09;&#xff0c;如果检测到潜在问题&#xff0c;它将使用邮件提示在邮件发送之前通知用户。借…

防弹玻璃为啥会被钢球砸碎?这就是一道高中物理题!

全世界只有3.14 % 的人关注了青少年数学之旅马斯克&#xff0c;硅谷钢铁侠&#xff0c;全世界最具煽动力的企业家。旗下公司特斯拉最新电动皮卡&#xff0c;一经亮相就欢呼一片&#xff0c;传播到炸&#xff0c;看起来又要重新定义一个品类。然而也有网友“提醒”——如今的马斯…

八种ADSL接入情况中断流现象分析

转载自&#xff1a;网盟技术[url]http://technic.txwm.com[/url] 线路不稳定 如果住所离电信局太远(5公里以上)可以向电信部门申报。确保线路连接正确(不同的话音分离器的连接方法有所不同&#xff0c;请务必按照说明书指引正确连接)。同时确保线路通讯质量良好没有被干扰&…

Java之jdk与jre的区别

很多程序员已经干了一段时间java了依然不明白jdk与jre的区别。 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK&#xff0c;它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包&#xff0c;可以包括函数库、编译程序等。 …

设计模式之组合

组合模式介绍一棵树结构组合模式是把相似对象或方法组合成一组可被调用的结构树对象的设计思路。组合模式不只是可以运用于规则决策树&#xff0c;还可以做服务包装将不同的接口进行组合配置&#xff0c;对外提供服务能力&#xff0c;减少开发成本。组合模式的主要解决的是一系…

leetcode中的状态机类型的题目

1 总结 一般是涉及到多个状态之间的转换&#xff0c;需要定义一个具有多个枚举值的变量&#xff0c;各个状态之间通过各种条件互相变化 2 LC57. 插入区间 2.1 解析 先是要确定新区间插入到哪一个位置&#xff08;也有可能&#xff09;&#xff0c;插入后需要确定这个区间是否…

如何用Python进行数据探索,探索竞赛优胜方案?

全世界只有3.14 % 的人关注了 青少年数学之旅 AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。 随着大数据时代信息科技的快速发展&#xff0c;各种各样的数据充斥着我们的生活。而我们又当如何有效利用数据…

联想ThinkPad笔记本广告向苹果MacBook Air开战

联想ThinkPad笔记本广告向苹果MacBook Air开战 [url]http://www.sina.com.cn[/url] 2008年03月24日 07:21 新浪科技联想ThinkPad X300笔记本广告&#xff0c;暗讽苹果MacBook AirMacbook Air最厚的地方仅有1.94cm&#xff0c;边缘仅0.4cm视频&#xff1a;ThinkPad X300对比Mac…

基于 gRPC 和 .NET Core 的服务器流

原文&#xff1a;https://bit.ly/3lpz8Ll作者&#xff1a;Chandan Rauniyar翻译&#xff1a;精致码农-王亮早在 2019 年&#xff0c;我写过《用 Mapbox 绘制位置数据》一文&#xff0c;详细介绍了我如何通过简单的文件上传&#xff0c;用 Mapbox 绘制约 230 万个位置点。本文介…

jQuery入门[2]-选择器[转]

jQuery之所以令人爱不释手&#xff0c;在于其强大的选择器表达式令DOM操作优雅而艺术。jQuery的选择符支持id,tagName,css1-3 expressions,XPath&#xff0c;参见&#xff1a;http://docs.jquery.com/SelectorsDEMO:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran…