k8s入门你至少需要会哪些

dotNET跨平台 dotNET跨平台     2022-12-18     146

关键词:

前言

相信很多公司都有集成发布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个副本pod
  selector: //选择器
    matchLabels:
        name: k8s-demo //选择label中的name=k8s-demo的
  template:
    metadata:
      labels:
        name: k8s-demo //指定一个label名为name,值为k8s-demo,对应上面的selector
    spec:
      containers:
        - name: k8s-demo //容器名
          image: nainaigu/k8s-demo:1.8 //镜像地址
          imagePullPolicy: IfNotPresent //如果本地没有镜像就去仓库pull
          ports:
            - 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-demo
  type: ClusterIP  //只能k8s集群内部访问,外部网络不能够访问到
  ports:
  - protocol: TCP
    port: 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-demo
  type: NodePort //配置为NodePort,外部可以访问,要定义下面的nodePort参数
  ports:
  - protocol: TCP
    port: 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 ssh

curl 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-demo
  labels:
    name: k8s-demo
spec:
  replicas: 2
  selector:
    matchLabels:
        name: k8s-demo
  template:
    metadata:
      labels:
        name: k8s-demo
    spec:
      containers:
        - name: k8s-demo
          image: nainaigu/k8s-demo:1.8
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5000
          env:
            - name: "ASPNETCORE_URLS"
              value: "http://0.0.0.0:5000"
          volumeMounts:
            - name: appsettings-volume 
              mountPath: "/publish/Settings" //这里用configMap
      volumes:
        - name: appsettings-volume
          configMap:
            name: appsettings   //这里用configMap


---

apiVersion: v1
kind: Service
metadata:
  name: k8s-demo
spec:
  selector:
    name: k8s-demo
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 5000
    targetPort: 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开发,有经验的老鸟请带带我,有一起学的朋友欢迎加我微信交流。

从零开始k8s

这部文档是面对想要学习Kubernetes集群的读者。如果你对入门指南已经可以满足你对这个列表上所列的需求,我们建议你继续阅读这个,因为他是根据前人积累经验所写的新手指南。当然如果除了学习入门指南知识外还希望学习Ia... 查看详情

数据分析需要掌握哪些知识?

...公式的使用,另外,还要学会一个统计分析工具,SAS作为入门是比较好的,VBA基本必备,SPSS/SAS/R至少要熟练使用其中之一,其他分析工具(如Matlab)可以视情况而定。编程语言数据分析领域最热门的两大语言是R和Python。涉及各... 查看详情

数据分析要掌握哪些知识?

...公式的使用,另外,还要学会一个统计分析工具,SAS作为入门是比较好的,VBA基本必备,SPSS/SAS/R至少要熟练使用其中之一,其他分析工具(如Matlab)可以视情况而定。编程语言数据分析领域最热门的两大语言是R和Python。涉及各... 查看详情

数据分析要掌握哪些知识?

...公式的使用,另外,还要学会一个统计分析工具,SAS作为入门是比较好的,VBA基本必备,SPSS/SAS/R至少要熟练使用其中之一,其他分析工具(如Matlab)可以视情况而定。编程语言数据分析领域最热门的两大语言是R和Python。涉及各... 查看详情

从零开始k8s

这部文档是面对想要学习Kubernetes集群的读者。如果你对入门指南已经可以满足你对这个列表上所列的需求,我们建议你继续阅读这个,因为他是根据前人积累经验所写的新手指南。当然如果除了学习入门指南知识外还希望学习Ia... 查看详情

如何搞定哲学类essay写作?需要注意哪些问题?

...者其他哲学家对这个问题的看法,你没有回答这个问题,至少没有直接回答。如果你只是写“休谟主张没有理由相信太阳明天会升起”, 查看详情

渗透测试需要学那些知识?

web黑客渗透测试入门需要学哪些?学习web渗透,就是从零散到整体。我们入门门槛比较低,学会用工具就可以了。但是从入门到另一个层次就比较难了,也是大部分脚本小子迷茫的地方。在web渗透的核心那就是思路,大量的思路... 查看详情

c语言入门编程需要掌握的核心要点有哪些?为你总结了这20个!

摘要: C语言作为编程的入门语言,学习者如何快速掌握其核心知识点,面对茫茫书海,似乎有点迷茫。为了让各位快速地掌握C语言的知识内容,在这里对相关的知识点进行了归纳。引言C语言精简的语法集和标准库,让我们... 查看详情

k8s搭建成功的文档

阿里云:https://yq.aliyun.com/articles/92894Kubernates集群入门(1)一、K8s安装准备1.至少两台主机,一台作为master,一台作为node。两台主机需要关闭防火墙。  查看详情

入门web前端要注意什么?要学哪些软件?

...,因为相对于Java,Python而言,Web前端更容易入门,也属于互联网行业。那么对于零基础想学习Web前端有注意哪些事项呢?Web前端要学哪些软件工具?下面就来和小千一起看一看吧!一、学习Web前端的注... 查看详情

转行python,从入门到精通需要经历哪些?全栈工程师给你分析为什么学python!

Python的火热度持续不断…作为入门语言还是不错的!你觉得Python真的好吗?或许你在漫天的宣传中看到了这些:1.开发环境简单,能打字就能写代码;2.接近英语的简单语法;3.众多的第三方库;4.解释... 查看详情

从零开始入门k8s|理解容器运行时接口cri

...程页面。关注“阿里巴巴云原生”公众号,回复关键词“入门”,即可下载从零入门K8s系列文章PPT。导读:CRI是Kubernetes体系中跟容器打交道的一个非常重要的部分。本文作者主要分为三个部分来进行:首先会为大家介绍CRI接口... 查看详情

java,面向对象中,在通常情况下,每个类至少应该包括哪些成员方法?

参考技术A在面向对象中。类是可以为空的,没有至少需要成员方法!classa这就是一个类。但要记住它还是有一个方法就是默认的构造方法a() 参考技术B类如果没有实现接口,那么它可以一个方法都不写。它会默认有一个无参的构... 查看详情

从零开始入门k8s|有状态应用编排-statefulset

...第22讲。关注“阿里巴巴云原生”公众号,回复关键词“入门”,即可下载从零入门K8s系列文章PPT。导读:有状态应用的部署交付向来都是应用运维领域的难点之一,常见的有状态需求如在磁盘持久化状态、每个机器需要独立且... 查看详情

转行做运营需要做好哪些准备?

...欢乐又轻松,赚的还不少。 根本不是这样! 做运营,你至少要做好以下的准备: 一.做好受苦的准备 很多人缺乏基本的常识。 一个人的收入,和可替代性成正比(资源垄断的不算)。 工作越轻松,难度就越低,很容易被替代... 查看详情

新手入门web前端,你需要克服这几点困难

Web前端是一个入行门槛较低的开发技术,更是近几年热门的职业,Web前端不仅薪资高发展前景好,是很多年轻人向往的一个职业。看到这里很多小伙伴想问:学Web前端需要注意哪些问题?学Web前端需要克服以... 查看详情

docker从入门到掉坑:继续挖一挖k8s(代码片段)

在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习pod是啥在k8s里面,有很多新的技术概念,其中有一个东西被称之为pod。pod是... 查看详情

开发驱动程序主要会用到vc++的哪些内容?

...看看孙鑫的VC视频教程,看前几章就可以,先把VC简单的入门一下。参考技术A驱动从来没有规定你用哪个厂家IDE来写,只要是C/C++就行了。写驱动的重点在于你对操作系统的了解,对驱动模型的掌握。驱动开发一定要够功力,因... 查看详情