k8s的出现解决了应用上云的一大难题,企业中越来越多的微服务要求上云
这里,通过一篇文章让大家能够透彻理解docker、k8s,并能够在需要的时候有的放矢
一、docker
Docker 是一个开源的应用容器引擎,主要包含几个概念:镜像(Image),容器(Container),仓库(Repository)。
三者的关系可以参考这张图。其中,docker是运行容器的载体(可以对容器进行操作);容器通过镜像创建;仓库用来管理镜像
docker build命令用来构建镜像,一般通过创建Dockerfile文件构建。可以参考
1、dockerfile多阶段编译
2、dockerfile指令
参考这里就可以掌握基本用法
1、docker概念理解
2、docker基本用法
二、k8s
k8s(Kubernetes) 是用于自动部署,扩展和管理容器化应用程序的开源系统
2.1 k8s架构:
这张系统架构图中,服务分为运行在工作节点上的服务和组成集群级别控制板的服务。
Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。
每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。
Kubernetes主要由以下几个核心组件组成:
- etcd保存了整个集群的状态;
- apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;
除了核心组件,还有一些推荐的Add-ons:
- kube-dns负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集、存储与查询
2.2 基本概念
主要包括pod,deployment,servicepod
是
podkubernetes
中最小的编排单位,通常由一个容器组成或者有多个容器组成
pod部署之后会生成一个IP地址,可以通过命令获取kubectl get pods nginx -o wide
pod IP分配基于flannel:https://www.hi-linux.com/posts/30481.html
deployment
一个 pod 肯定不能均衡,自然要部署多个 Pod。deployment支持创建多个pod副本,支持可以滚动升级,回滚这些
service
会有一个ClusterIP,通过(spec.selector)
指定Pod做负载均衡
pod,deployment,servic的部署都是都通编写yaml文件实现,kind字段对应部署的类型,eg:
apiVersion: v1 kind: Pod metadata: name: nginx # 指定 label,便于检索 labels: app: nginx spec: containers: - name: nginx # 指定镜像 image: nginx:alpine # 指定暴露端口 ports: - containerPort: 80
此时,服务只能在集群中访问,如果需要把服务暴露给互联网,有三种方式:NodePort、LoadBalancer 和 Ingress
后端原理iptables和ipvs
可参考:http://dockone.io/article/4884 Kubernetes的
k8s涉及到的模块很多,比如负载均衡、弹性伸缩,滚动升级以及故障迁移等,可以在需要的时候针对性地进一步深入了解
k8s主要是对各种资源进行操作,kubectl是k8s的命令行工具(常用的一些命令):
https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/ kubectl命令行
kubectl create -f amp-pod.yaml
kubectl get pods
kubectl get pods -o wide 获取pod对应的ip地址
kubectl describe pod amp-dev-pod
kubectl delete pod amp-dev-pod
kubectl logs amp-dev-pod
kubectl describe pod nginx-pod:可以查看异常
kubectl get hpa
kubectl get replicaset
kubectl describe replicaset
kubectl delete replicaset
kubectl get deploy nginx-deployment
kubectl delete deploy nginx-deployment
学习k8s,首先得安装k8s的环境,个人开发环境,推荐minikube
安装文档:https://kubernetes.io/docs/tasks/tools/install-minikube/
在线工具:https://kubernetes.io/docs/tutorials/hello-minikube/
这里有一个k8s的系列教程:
https://cloud.tencent.com/developer/article/1515095
其它参考:
https://juejin.im/post/6844903983471935496 使用 k8s 部署你的第一个应用: Pod,Deployment 与 Service
https://blog.csdn.net/u011142688/article/details/80372552 Pod和Deployment
https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/ deployment
https://blog.csdn.net/u011314442/article/details/88825166 虚悬镜像
https://www.runoob.com/w3cnote/yaml-intro.html yaml
http://docs.kubernetes.org.cn/230.html k8s中文档