k8s本地部署
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
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
eval $(minikube docker-env)
docker build -t hello-node:v1 .
创建 Deployment
kubectl run hello-node --image=hello-node:v1 --port=8080
查看 Deployment:
kubectl get deployments
查看pod
kubectl get pods
查看集群事件:
kubectl get events
查看 kubectl 配置:
kubectl config view
创建service
暴露到公网
kubectl expose deployment hello-node --type=LoadBalancer
kubectl get services
服务访问
minikube service hello-node --url
查看log
kubectl logs <POD-NAME>
更新应用:
response.end('Hello World Again!');
构建v2镜像
docker build -t hello-node:v2 .
修改镜像
kubectl set image deployment/hello-node hello-node=hello-node:v2
再次访问
清理
现在可以清理您在集群中创建的资源:
kubectl delete service hello-node
kubectl delete deployment hello-node
可以停止 Minikube VM:
minikube stop
eval $(minikube docker-env -u)
或者,删除 Minikube VM:
minikube delete
通过yaml描述文件创建deployment
deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # tells deployment to run 2 pods matching the template
template: # create pods using pod definition in this template
metadata:
# unlike pod-nginx.yaml, the name is not included in the meta data as a unique name is
# generated from the deployment name
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
将 kubectl 的 —record 的 flag 设置为 true 可以在 annotation 中记录当前命令创建或者升级了该资源。这在未来会很有用,例如,查看在每个 Deployment revision 中执行了哪些命令。
kubectl create -f deployment.yaml --record
kubectl describe deployment nginx-deployment
kubectl get deployments
给这个nginx换个版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
或手动改配置
kubectl edit deployment/nginx-deployment
查看状态:
kubectl rollout status deployment/nginx-deployment
- deployment "nginx-deployment" successfully rolled out
通过record可以记录命令
kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=deployment.yaml --record=true
2 kubectl create --filename=deployment.yaml --record=true
扩容/缩容
kubectl scale deployment nginx-deployment --replicas=4
查看历史操作
kubectl rollout history deployment/nginx-deployment
回滚
kubectl rollout history deployment/nginx-deployment --revision=2
回滚到历史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
暂停/恢复
kubectl rollout pause deployment/nginx-deploymen
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优点
- 跑的快,几个命令部署应用
- 应用环境孤立,单独运行。
- 版本控制和组件重用。
缺点: - 不提供存储选项。 Docker Swarm不提供将容器连接到存储的无障碍方式
- 监控不良 只能用Stats命令简单的监控
Kubernetes优点:
- 维护容器的稳定
- 大规模部署和更新软件: 水平基础架构缩放,自动扩展,手动缩放,复制控制器。
- 自我修复
- 存储问题。pod间数据共享,可以通过volume远程存储
缺点 - 安装繁琐
- 初始过程需要时间,创建新进程需要等很长时间
Kubernetes:
需要成熟的部署和监控选项
需要快速可靠的响应时间
需要开发复杂的应用程序,并且需要高资源计算而不受限制
有一个非常大的集群
Docker,
希望快速,方便的部署集群
启动速度快
参考
https://juejin.im/post/5b63f4506fb9a04f8856f340
https://blog.csdn.net/WaltonWang/article/details/77461697
k8s service详解:https://zhuanlan.zhihu.com/p/39909011