k8s入门你至少需要会哪些
body { margin: 0; overflow: auto; font: normal 14px Verdana; background: rgba(255, 255, 255, 1); padding: 2px 4px 0; cursor: text }
body, p, font, div, li { line-height: 1.5 }
body, td, th { color: rgba(0, 0, 0, 1) }
.i { width: 100%; *width: auto; table-layout: fixed }
pre { white-space: ; word-wrap: break-word }
a img { border: none }
a { }
.cursor_formatMatch { cursor: url("https://rescdn.qqmail.com/zh_CN/htmledition/images/../js/com/kits/qmeditor/base/images/newicon/cursor_format1e9c5d.cur"), text }
前言
相信很多公司都有集成发布pass系统,底层大多数依赖于k8s来进行服务的发布部署/回滚等功能。
对于很多业务开发者都是不可见的,在感叹这个东西真好用的同时,想着探一探这背后的原理。
真正的入门还是得自己亲手跑起来!
今天这篇k8s入门我整理了必会的几个k8s知识点
- docker的使用,镜像的创建和发布(我当你已经会了哈)
- k8s开发环境搭建
- Deployment的使用
- Service的使用
- ConfigMap的使用
学习环境搭建
首先k8s学习的话是建议用minikube搭建,这里系统我用的ubuntu20.04.2.0LTS

我这里用的是vmware虚拟机,
如果FQ不顺利的话请加我微信获取已经装好环境的虚拟机(节省你时间不香吗),前提你的机器得是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镜像不依赖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

k8s入门你至少需要会哪些的更多相关文章
- k8s入门系列之guestbook快速部署
k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...
- k8s入门系列之扩展组件(一)DNS安装篇
DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...
- k8s入门系列之集群安装篇
关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...
- K8s 入门
中文文档:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84 小结大白话 Portainer 挺好 ...
- k8s 入门系列之集群安装篇
关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...
- 反手来个K8S入门到跑路
layout: post title: 反手来个K8S入门到跑路 category: linux date: 2019-06-09 tags: linux k8s 反手来个K8S入门到跑路 前言 放假 ...
- k8s入门之集群搭建(二)
一.准备三台节点 从上篇文章 k8s入门之基础环境准备(一)安装的Ubuntu虚拟机克隆出三台虚拟机,如图所示 启动这三台虚拟机节点,分别做如下配置 虚拟机名称 IP HostName k8sMast ...
- k8s入门简介
1.docker的三种编排工具 Docker的第一类编排工具: a.docker compose(docker原生):只能对一个主机上的容器进行编排,无法编排多个主机上的容器; b.docker sw ...
- K8S入门系列之集群二进制部署-->master篇(二)
组件版本和配置策略 组件版本 Kubernetes 1.16.2 Docker 19.03-ce Etcd 3.3.17 https://github.com/etcd-io/etcd/release ...
随机推荐
- 可扩展的 Web 架构与分布式系统
作者:Kate Matsudaira 译者:尹星 本文介绍了分布式架构是如何解决系统扩展性问题的粗略方法,适合刚刚入门分布式系统的同学,我把整篇文章翻译如下,希望给你一些启发. 备注:[idea]标注 ...
- zookeeper使用教程
Zookeeper 1. Zookeeper概述 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1)Zookeeper: ...
- .NET Core添加日志插件
二. 首先控制器的方法中写: private readonly ILogger<fluueController> _logger; public fluueController(ILogg ...
- ceph-csi源码分析(2)-组件启动参数分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(2)-组件启动参数分析 ceph-csi组件的源码分析分为五部分: ...
- Maven项目无法下载JAR包,输入mvn help:system出现No plugin found for prefix 'help' in the current project and in the plugin groups的解决方案
这个问题困扰了我很久,一直无法解决:我在虚拟机里面按照同样的步骤配置了三次maven项目,每次都能成功:可一旦到外面maven项目总是创建失败,输入mvn help:system总是出现No plug ...
- redis字典快速映射+hash釜底抽薪+渐进式rehash | redis为什么那么快
前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...
- 三剑客-awk
1.作用特点 排除信息 查询信息 统计信息 替换信息 2.语法格式 awk [参数] '模式-动作' 文件 3.awk命令执行原理 4.命令使用方法 创建测试环境 [root@shuai ~]# ca ...
- centos8 安装VNC配置远程连接
系统信息 [root@centos8 ~]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) [root@centos8 ~] ...
- 【问答分享第一弹】MySQL锁总结:MySQL行锁、表锁、排他锁、共享锁的特点
大家好,我是小于哥哈.前几天能分享了第一期面试题,MySQL 中有哪几种锁 和 这些锁各有哪些特点 ,这道面试题是经常会被问到的一个面试题,大家反馈的都挺不错的.今天特此来总结一下. 首发于公众号[终 ...
- 解决spring boot中文乱码问题
在开发或学习当中,我们不可避免的会碰到中文乱码的问题(好想哭,但还是要保持微笑!) 今天,在学习spring boot中碰到了中文乱码问题. 首先,看了一下workspace是不是设置utf-8默认字 ...