K8S原来如此简单(三)Pod+Deployment
上篇我们已经安装好k8s1.23集群,现在我们开始使用k8s部署我们的项目
Pod
Pod 是一组容器集合,是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。这些容器共享存储、网络。
准备Demo
我们要实现多容器Pod所以准备两个WebAPI项目
新建一个webapi,命名为oneapi,里面新增TestController,新增两个api,一个是返回当前pod的ip,另一个是模拟高cpu操作
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
private readonly ILogger<TestController> _logger; public TestController(ILogger<TestController> logger)
{
_logger = logger;
} [HttpGet]
public string Get()
{
var ip = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces().Select(p => p.GetIPProperties()).SelectMany(p => p.UnicastAddresses)
.Where(p => p.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && !System.Net.IPAddress.IsLoopback(p.Address))
.FirstOrDefault()?.Address.ToString();
return "ip is " + ip;
} [HttpGet("highcpu")]
public string HighCpu(int minutes)
{
var now = DateTime.Now;
while (DateTime.Now - now <= TimeSpan.FromMinutes(minutes))
{
_logger.LogInformation(DateTime.Now.ToString());
}
return "ok";
}
}
新建第二个webapi,命名为twoapi,里面同样新增TestController,实现一个接口,通过localhost调用oneapi的ip接口(pod内容器共享存储、网络)
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
private readonly ILogger<TestController> _logger;
private readonly HttpClient _httpclient;
public TestController(ILogger<TestController> logger, HttpClient httpclient)
{
_logger = logger;
_httpclient = httpclient;
} [HttpGet("calloneapi")]
public async Task<string> CallOneApiAsync()
{
var content = await (await _httpclient.GetAsync("http://localhost:5000/test")).Content.ReadAsStringAsync();
return "one api response is " + content;
}
}
将这两个api打成镜像,推进阿里云镜像库
单容器Pod
我们通过以下命令即可快速地部署一个pod,下面所有的镜像都使用我们刚刚推送到阿里云里的镜像
kubectl run oneapi --image=registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
可通过以下命令查看pod的状态
kubectl describe pod oneapi
查看到pod的私有ip,调用oneapi的ip接口,验证是否部署成功
curl 10.244.36.66:5000/test
多容器Pod
多容器pod容器共享存储、网络,我们通过yaml文件来部署一个多容器的pod,来验证是否共用网络。
apiVersion: v1
kind: Pod
metadata:
name: chesterapi
spec:
containers:
- name: oneapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
ports:
- containerPort: 5000
- name: twoapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/twoapi:latest
ports:
- containerPort: 5001
kubectl apply -f pod.yaml
通过以下命令查看pod
kubectl describe pod chesterapi
通过以下调用twoapi的接口验证pod是否部署成功
curl podip:5001/test/calloneapi
验证完成,通过以下命令删除pod
kubectl delete -f pod.yaml
探针
探针用于检测pod的健康状态,探针有三种,
ExecAction
(借助容器运行时执行)TCPSocketAction
(由 kubelet 直接检测)HTTPGetAction
(由 kubelet 直接检测)
我们通过http探针,来检测pod的健康状态,修改pod.yaml文件,并直接kubectl apply -f pod.yaml即可验证
apiVersion: v1
kind: Pod
metadata:
name: chesterapi
spec:
containers:
- name: oneapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
ports:
- containerPort: 5000
livenessProbe:
httpGet:
path: /test
port: 5000
- name: twoapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/twoapi:latest
ports:
- containerPort: 5001
livenessProbe:
httpGet:
path: /test/calloneapi
port: 5001
Pod状态
Pod重启策略
restartPolicy的选择值
Always:当容器失效时,由kubelet自动重启该容器。
OnFailure:当容器终止运行且退出码不为0时,由kubelet自动 重启该容器。
Never:不论容器运行状态如何,kubelet都不会重启该容器。
我们通过pod.yaml的探针接口地址为一个不存在的地址,并将restartPolicy设置为Never,让其即使健康检查失败,Pod也永不重启
apiVersion: v1
kind: Pod
metadata:
name: chesterapi
spec:
restartPolicy: Never
containers:
- name: oneapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
ports:
- containerPort: 5000
livenessProbe:
httpGet:
path: /test1
port: 5000
- name: twoapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/twoapi:latest
ports:
- containerPort: 5001
livenessProbe:
httpGet:
path: /test/calloneapi1
port: 5001
通过以下命令部署,并验证
kubectl apply -f pod.yamlkubectl describe pod -n chesterapi
Deployemnt
说完了pod,我们来看看deployment。生产环境中基本不存在直接定义pod的方式来部署项目,更多的是通过Deployment来部署。
用途
方便管理、部署Pod
横扩应对高负载
快速程序更新与回滚
创建
首先我们创建一个文件ns.yaml来定义一个namespace
apiVersion: v1
kind: Namespace
metadata:
name: chesterns
我们通过定义以下一个deployment,实现部署三个pod,模拟负载
apiVersion: apps/v1
kind: Deployment
metadata:
name: chesterdeployment
namespace: chesterns
labels:
app: chesterapi
spec:
replicas: 3
selector:
matchLabels:
app: chesterapi
template:
metadata:
labels:
app: chesterapi
spec:
containers:
- name: oneapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
ports:
- containerPort: 5000
livenessProbe:
httpGet:
path: /test
port: 5000
- name: twoapi
image: registry.cn-beijing.aliyuncs.com/chester-k8s/twoapi:latest
ports:
- containerPort: 5001
livenessProbe:
httpGet:
path: /test/calloneapi
port: 5001
通过以下命令部署并调用接口
kubectl apply -f deployment.yaml # 部署
kubectl get deployment -n chesterns # 获取deployment
kubectl describe pod -n chesterns # 查看pod
拿到pod的虚拟ip,开始测试
curl 10.244.36.75:5000/test
curl 10.244.36.75:5001/test/calloneapi
滚动更新(RollingUpdate)与回滚
我们可以借助k8s的滚动更新实现服务的不停机更新,k8s也为我们提供了应对异常回滚的方法,下面就开始模拟
更新镜像
kubectl set image deployment/chesterdeployment twoapi=registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest -n chesterns --record
查看更新状态
kubectl rollout status deployment/chesterdeployment -n chesterns
查看更新历史
kubectl rollout history deployment/chesterdeployment -n chesterns
回滚
kubectl rollout undo deployment/chesterdeployment -n chesterns
kubectl rollout undo deployment/chesterdeployment -n chesterns --to-revision=1
滚动更新机制
启动一个新的RS与新pod
等待新的 pod 进入 Ready 状态
建立 Endpoint,将新的 pod 归入负载均衡运维
移除与老 pod 相关的 Endpoint,而且将老 pod 状态设置为 Terminating,此时将不会有新的请求到达老 pod
给老 pod 发送 SIGTERM 信号,而且等待 terminationGracePeriodSeconds 这么长的时间。(默认为 30 秒)
超过 terminationGracePeriodSeconds 等待时间直接强制 kill 进程并关闭旧的 pod
除了滚动更新,还有一种更新Recreate,这种模式会先杀掉所有正在运行的Pod,然后创建新的Pod
横向扩展
k8s通过 kubectl scale即可快速实现pod的横向扩展
kubectl scale deployment/chesterdeployment -n chesterns --replicas=10
K8S原来如此简单(三)Pod+Deployment的更多相关文章
- K8S原来如此简单(六)Pod调度
我们前面部署的pod调度取决于kube-scheduler,它会根据自己的算法,集群的状态来选择合适的node部署我们的pod. 下面我们来看下如何来根据我们自己的要求,来影响pod的调度. 定向no ...
- K8S原来如此简单(七)存储
emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...
- K8S原来如此简单(四)Service+Ingress
上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问 Service service为一组pod提供一个统一的 ...
- K8S原来如此简单(五)Metrics Server与HPA
什么是HPA https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/ 我们前面有通过kubectl ...
- K8S原来如此简单(八)ServiceAccount+RBAC
ServiceAccount ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户. Service ...
- k8s核心资源之Pod概念&入门使用讲解(三)
目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...
- k8s之深入解剖Pod(一)
上文说了一下k8s的简单使用,接下来就让我们来具体深入了解一下Pod.为了避免篇幅太长,所以会分成几篇. 目录: Pod定义详解 静态Pod Pod容器共享Volume 一.Pod定义详解 先看一个简 ...
- k8s运维之pod排错
k8s运维之pod排错 K8S是一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernetes的目标是让部署容器化变得简单并且高效 K8S的核心优势: 1,基于yaml文件实现容器的自动创建 ...
- k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?
k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...
随机推荐
- 深入Java微服务之网关系列1:什么是网关
前言 近来,在想着重构一个新的产品.准备采用微服务的技术解决方案,来搭建基础设施框架.网关,是一个必不可少的组件.那么,网关到底是什么? 其又有什么特点或者特性,成为微服务必不可少的组件呢?今天, ...
- uos系统安装tree
apt install tree 提示无法安装软件包 执行apt update 然后执行apt install tree
- async异步流程控制
http://cnodejs.org/topic/54acfbb5ce87bace2444cbfb 先安装:G:\www\nodejs\one\models>npm install async ...
- rsync 与 inotify 的使用 & 实现实时同步备份
今日内容 rsync 内容详细 上一篇内容问题 1.yum源问题 2.VPN链接正常,但是没办法通过172 3.VPN链接时,出现了DNS错误 4.掩码不对 5.openvpn开启错误 复制的命令 1 ...
- C++ 提高编程
目录 C++ 提高编程 一. 模板 1. 概念 2. 函数模板 2.1 函数模板语法 2.2 注意事项 2.3 普通函数和函数模板的区别 2.4 普通函数和函数模板的调用规则 2.5 模板的局限性 3 ...
- 使用JS简单实现一下apply、call和bind方法
使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...
- v-model的修饰符
.lazy 就是在用户输入时数据不会进行传输,在失去焦点后或者按回车,才会将数据将进行改变 .number 因为v-model所绑定的数据,都会默认转换为string类型,而.number就能将数据转 ...
- 关于maven依赖中的scope的作用和用法
举例如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- 【C# 集合】Hash哈希函数 |散列函数|摘要算法
希函数定义 哈希函数(英語:Hash function)又称散列函数.散列函数.摘要算法.单向散列函数.散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来.该函数将数据打乱混合,重新 ...
- NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】
一.NPOI的基本知识 碰到了导出大量数据的需求场景:从数据读取数据大约50W,然后再前端导出给用户,整个过程希望能较快的完成.如果不能较快完成,可以给与友好的提示. 大量数据的导出耗时的主要地方: ...