1. 整个架构由两大部分构成:master node 和 node
1.1 master node: API server + controller manager + scheduler + etcd
API server:集群统一入口:
scheduler:调度节点
controller manager: 处理集群中常规后台任务,一个资源对应一个controller
etcd:数据储存
1.2 node:kubelet + kube_proxy
kubelet:master node 在node中的代表
kube_proxy:节点的网络代理
那么,到底如何形象化的理解呢?
而k8s具体的工作流程是怎样的呢?
2. 核心概念:
2.1 Pod:
k8s中最小的部署单元 有很多个容器组成 Pod中各容器共享网络 生命周期短暂
2.2 controller:直白点,就是通过controller来创建node
2.3 service:定义一组pod的访问规则
注意 pod,container,docker的区别:docker不是容器,容器是container。Docker是一种技术,用来创建和管理容器的。可以看作是一台简易的虚拟机。现在来说,应用程序在硬件上的部署都是通过容器化的方式进行的。而pod是k8s为了集群管理docker方便在容器这一级概念上的向上抽象,即一组容器,也是k8s中最小的部署单元。他们的关系如图:
k8s中有哪些资源对象:
首先明确一点,资源对象的建立都有两种方式:通过yaml配置文件定义资源对象或者通过命令行方式创建。
1. Namespace:
实现某种意义上的封装。
2. pod
创建并启动pod:
3. Service:
一组pod的IP地址各不相同,如果挨个访问将会麻烦。
我们通过service将关联的一组pod统一管理
4. Deployment:
一个应用(Pod)可能会被使用多次,我们希望能够快速部署;
同时希望如果有一个pod挂掉不会影响其他的pod,即实现所谓的负载均衡。
通俗点理解,也即是自愈能力。
对于Deployment的YAML文件配置:Deployments | Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
那么YAML文件怎么看呢?
apiVersion:此处值是v1,这个版本号需要根据安装的Kubernetes版本和资源类型进行变化,记住不是写死的。
kind:此处创建的是Pod,根据实际情况,此处资源类型可以是Deployment、Job、Ingress、Service等。
metadata:包含Pod的一些meta信息,比如名称、namespace、标签等信息。
spec:包括一些container,storage,volume以及其他Kubernetes需要的参数,以及诸如是否在容器失败时重新启动容器的属性。可在特定Kubernetes API找到完整的Kubernetes Pod的属性。
创建Deployment:
root@master-01 YAML_k8s]# kubectl create -f nginx-deployment.yaml
deployment.apps "nginx-deployment" created
[root@master-01 YAML_k8s]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 2m 10.20.184.83 master-01
nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 2m 10.20.190.60 node-01
nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 2m 10.20.254.108 node-03
[root@master-01 YAML_k8s]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 2m
那么,通过kubernetes集群部署容器化应用到服务器上的流程是怎样的?
1.本地将项目的文件打包,并制作镜像。
2.上传镜像到服务器的镜像仓库。
3.服务器拉取镜像并通过deployment来创建pod来集群运行容器化应用。
4.目前的话只能通过集群内的节点来访问应用,如果想要外网也能访问需要暴露应用。