k8s是什么

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

Kubernetes 具有如下特点:

便携性: 无论公有云、私有云、混合云还是多云架构都全面支持

可扩展: 它是模块化、可插拔、可挂载、可组合的,支持各种形式的扩展

自修复: 它可以自保持应用状态、可自重启、自复制、自缩放的,通过声明式语法提供了强大的自修复能力

Kubernetes 是什么意思? K8s?

名称 Kubernetes 源于希腊语,意为 “舵手” 或 “飞行员”, 且是英文 “governor” 和 “cybernetic”的词根。 K8s 是通过将 8 个字母 “ubernete” 替换为 8 而导出的缩写。另外,在中文里,k8s 的发音与 Kubernetes 的发音比较接近。

架构

每一个 Kubernetes 就集群都由一组 Master 节点和一系列的 Worker 节点组成,其中 Master 节点主要负责存储集群的状态并为 Kubernetes 对象分配和调度资源。

Master

  • API Server 负责处理来自用户的请求,其主要作用就是对外提供 RESTful 的接口,包括用于查看集群状态的读请求以及改变集群状态的写请求,也是唯一一个与 etcd 集群通信的组件。
  • Controller 管理器运行了一系列的控制器进程,这些进程会按照用户的期望状态在后台不断地调节整个集群中的对象,当服务的状态发生了改变,控制器就会发现这个改变并且开始向目标状态迁移。 集群故障检测和恢复的自动化工作比如Replication Controller
  • Scheduler 调度器其实为 Kubernetes 中运行的 Pod 选择部署的 Worker 节点,它会根据用户的需要选择最能满足请求的节点来运行 Pod,它会在每次需要调度 Pod 时执行。

    主要用于收集和分析当前 Kubernetes 集群中所有 Minion / Node 节点的资源 (包括内存、CPU 等) 负载情况,然后依据资源占用情况分发新建的 Pod 到 Kubernetes 集群中可用的节点。

    实时监测 Kubernetes 集群中未分发和已分发的所有运行的 Pod

Worker

  • kubelet 负责 Node 节点上 Pod 的创建、修改、监控、删除等全生命周期的管理,对pod进行各种操作和日志上报
  • kube-proxy 负责宿主机的子网管理,同时也能将服务暴露给外部,其原理就是在多个隔离的网络中把请求转发给正确的 Pod 或者容器。

名词解释

  • Pod 是 Kubernetes 中可部署的最小、最基本对象。一个 Pod 代表集群中正在运行的单个进程实例。 它们共享 PID、IPC、Network 和 UTS namespace
  • Container docker容器
  • Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。
  • Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。
  • Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上。Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象。

    如: app=nginx
  • Deployment 指不具有唯一标识的一组多个相同的 Pod。Deployment 运行应用的多个副本,并自动替换任何失败或无响应的实例

部署

server.js

  1. var http = require('http');
  2. var handleRequest = function(request, response) {
  3. console.log('Received request for URL: ' + request.url);
  4. response.writeHead(200);
  5. response.end('Hello World!');
  6. };
  7. var www = http.createServer(handleRequest);
  8. www.listen(8080);
  1. FROM node:6.9.2
  2. EXPOSE 8080
  3. COPY server.js .
  4. CMD node server.js
  1. eval $(minikube docker-env)
  1. docker build -t hello-node:v1 .

创建 Deployment

  1. kubectl run hello-node --image=hello-node:v1 --port=8080

查看 Deployment:

  1. kubectl get deployments

查看pod

  1. kubectl get pods

查看集群事件:

  1. kubectl get events

查看 kubectl 配置:

  1. kubectl config view

创建service

暴露到公网

  1. kubectl expose deployment hello-node --type=LoadBalancer
  1. kubectl get services

服务访问

  1. minikube service hello-node --url

查看log

  1. kubectl logs <POD-NAME>

更新应用:

  1. response.end('Hello World Again!');

构建v2镜像

  1. docker build -t hello-node:v2 .

修改镜像

  1. kubectl set image deployment/hello-node hello-node=hello-node:v2

再次访问

清理

现在可以清理您在集群中创建的资源:

  1. kubectl delete service hello-node
  2. kubectl delete deployment hello-node

可以停止 Minikube VM:

  1. minikube stop
  2. eval $(minikube docker-env -u)

或者,删除 Minikube VM:

  1. minikube delete

通过yaml描述文件创建deployment

deployment.yaml

  1. apiVersion: apps/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. replicas: 2 # tells deployment to run 2 pods matching the template
  7. template: # create pods using pod definition in this template
  8. metadata:
  9. # unlike pod-nginx.yaml, the name is not included in the meta data as a unique name is
  10. # generated from the deployment name
  11. labels:
  12. app: nginx
  13. spec:
  14. containers:
  15. - name: nginx
  16. image: nginx:1.7.9
  17. ports:
  18. - containerPort: 80

将 kubectl 的 —record 的 flag 设置为 true 可以在 annotation 中记录当前命令创建或者升级了该资源。这在未来会很有用,例如,查看在每个 Deployment revision 中执行了哪些命令。

  1. kubectl create -f deployment.yaml --record
  1. kubectl describe deployment nginx-deployment
  1. kubectl get deployments

给这个nginx换个版本

  1. kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
  2. 或手动改配置
  3. kubectl edit deployment/nginx-deployment

查看状态:

  1. kubectl rollout status deployment/nginx-deployment
  2. - deployment "nginx-deployment" successfully rolled out

通过record可以记录命令

  1. kubectl rollout history deployment/nginx-deployment
  2. deployment.extensions/nginx-deployment
  3. REVISION CHANGE-CAUSE
  4. 1 kubectl create --filename=deployment.yaml --record=true
  5. 2 kubectl create --filename=deployment.yaml --record=true

扩容/缩容

  1. kubectl scale deployment nginx-deployment --replicas=4

查看历史操作

  1. kubectl rollout history deployment/nginx-deployment

回滚

  1. kubectl rollout history deployment/nginx-deployment --revision=2

回滚到历史版本

  1. kubectl rollout undo deployment/nginx-deployment --to-revision=2

暂停/恢复

  1. kubectl rollout pause deployment/nginx-deploymen
  2. kubectl rollout resume deploy nginx-deployment

关于rollout/pasuse/回滚

rollout

.spec.strategy.rollingUpdate.maxSurge 可以为整数或者百分比,默认为desired Pods数的25%

.spec.strategy.rollingUpdate.maxUnavailable 可以为整数或者百分比,默认为desired Pods数的25%

在Deployment rollout时,需要保证Available(Ready) Pods数不低于 desired pods number - maxUnavailable; 保证所有的Pods数不多于 desired pods number + maxSurge。

rollout时,先创建maxSurge个Pods,这时达到pods数的上限值desired replicas + maxSurge,然后delete OldRS maxUnavailable个Pods,这时Ready的Pods number最差也能保证desired replicas - maxUnavailable个。直到删除所有的pods。升级结束。

pasuse

kubectl rollout pause只会用来停止触发下一次rollout。所以正在执行的滚动不会停止。但是下次滚动就会被暂停,直到用户执行kubectl rollout resume

回滚

回滚的时候也是按照滚动的机制进行的,同样要遵守maxSurge和maxUnavailable的约束。并不是一次性将所有的Pods删除,然后再一次性创建新的Pods。

和docker swarm选型

docker swarm优点

  1. 跑的快,几个命令部署应用
  2. 应用环境孤立,单独运行。
  3. 版本控制和组件重用。

    缺点:
  4. 不提供存储选项。 Docker Swarm不提供将容器连接到存储的无障碍方式
  5. 监控不良 只能用Stats命令简单的监控

Kubernetes优点:

  1. 维护容器的稳定
  2. 大规模部署和更新软件: 水平基础架构缩放,自动扩展,手动缩放,复制控制器。
  3. 自我修复
  4. 存储问题。pod间数据共享,可以通过volume远程存储

    缺点
  5. 安装繁琐
  6. 初始过程需要时间,创建新进程需要等很长时间

Kubernetes:

需要成熟的部署和监控选项

需要快速可靠的响应时间

需要开发复杂的应用程序,并且需要高资源计算而不受限制

有一个非常大的集群

Docker,

希望快速,方便的部署集群

启动速度快

参考

https://juejin.im/post/5b63f4506fb9a04f8856f340

https://blog.csdn.net/WaltonWang/article/details/77461697

k8s service详解:https://zhuanlan.zhihu.com/p/39909011

k8s本地部署的更多相关文章

  1. k8s环境部署.net core web项目(docker本地仓库)

    在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...

  2. k8s二进制部署

    k8s二进制部署 1.环境准备 主机名 ip地址 角色 k8s-master01 10.0.0.10 master k8s-master02 10.0.0.11 master k8s-node01 1 ...

  3. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  4. 在k8s上部署日志系统elfk

    日志系统elfk 前言 经过上周的技术预研,在本周一通过开会研究,根据公司的现有业务流量和技术栈,决定选择的日志系统方案为:elasticsearch(es)+logstash(lo)+filebea ...

  5. 使用Rancher在K8S上部署高性能PHP应用程序

    介 绍 PHP是网络上最流行的编程语言之一,许多被广泛使用的内容管理系统都使用它开发,如WordPress和Drupal,并为现代服务器端框架(如Laravel和Symfony)提供核心代码. 尽管P ...

  6. 【原创】一层Nginx反向代理K8S化部署实践

    目录: 1)背景介绍 2)方案分析 3)实现细节 4)监控告警 5)日志收集 6)测试 一.背景介绍     如下图所示,传统方式部署一层Nginx,随着业务扩大,维护管理变得复杂,繁琐,耗时耗力和易 ...

  7. 4、二进制安装K8s 之 部署kube-controller-manager

    二进制安装K8s 之 部署kube-controller-manager 1.创建配置文件 cat > /data/k8s/config/kube-controller-manager.conf ...

  8. K8s二进制部署单节点 master组件 node组件 ——头悬梁

    K8s二进制部署单节点   master组件 node组件   --头悬梁 1.master组件部署 2.node   组件部署 k8s集群搭建: etcd集群 flannel网络插件 搭建maste ...

  9. 本地部署arcgis by eclipse

    首次来博客园发帖,从本地部署arcgis api开始吧: 首先还是下载arcgis的api包开始,在中国区官网下载arcgis包: 1.http://support.esrichina.com.cn/ ...

随机推荐

  1. CentOS 8 换源,设置dnf / yum镜像

    aliyun更新了centos8的说明 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos- ...

  2. ADO.NET中的5个主要对象

    1.Connection:主要是开启程序和数据库之间的连接.没有利用连接对象将数据库打开,是无法从数据库中取得数据的. Close和Dispose的区别,Close以后还可以Open,Dispose以 ...

  3. C# 分布式自增ID算法snowflake(雪花算法)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...

  4. ef linq多表查询(三表)

    var ph = (from c in reef.CQICC_CLIENT join v in reef.CQICC_VISIT_CLIENT on c.CLIENT_T_ID equals v.CL ...

  5. Struts2 Action的3种创建方式

    Action是Strut2的核心内容,相当于Servlet,用于处理业务. Action是一个Java类,直接新建Java类即可. Action有3种实现方式. 1.使用POJO,设置成员变量,写对应 ...

  6. foreachRDD

    需求: 将统计结果写入到MySQL create table wordcount( word varchar(50) default null, wordcount int(10) default n ...

  7. shell脚本按当前日期输出日志

    shell脚本基本技能是设置变量,输出信息.如下: sh脚本输出到控制台 将以上脚本保存到test.sh脚本文件中,并赋予可执行权限:sudo chmod +x test.sh 执行脚本:bash t ...

  8. linux 广播和组播

    广播和组播 广播,必须使用UDP协议,是只能在局域网内使用,指定接收端的IP为*.*.*.255后,发送的信息,局域网内的所有接受端就能够接到信息了. 广播的发送端代码 #include <st ...

  9. gerrit的使用以及问题总结

    看到了一篇很好的博客,大纲如下: 链接如下: https://www.ieclipse.cn/2016/05/14/other/tech-gerrit-guide/index.html 另外一篇: 代 ...

  10. JS高阶---函数

    [问题] [主体] 1.什么是函数? ①实现特定功能 ②多条语句的封装体 ③可以重复执行的代码块 2.为什么用函数? 提高代码的复用性,提升效率 3.如何定义函数? ①函数声明定义 ②函数表达式定义③ ...