Q、Kubernetes是啥?
Kubernetes是一个分步式自动化容器管理平台,具有完备的集群管理能力,内建智能负载均衡器,拥有强大的故障发现和自我修复功能。大家习惯把Kubernetes称为K8s。K8s本身不能实现硬件设备、操作系统,网络、软件服务等资源创建,主要是基于各个组件和模块来实现的。
一、有如下特点,优势,及应用场景。
1、特点:
可移植,可扩展,自动化。
2、优势:
轻量级,开源,弹性伸缩,负载均衡,开源
3、场景:
快速部署、扩展应用,实现docker容器创建,部署,复制,扩展,收缩,以及均衡、节省资源使用。
二、k8s几个常用概念
k8s集群中一般有master和node节点,
通过kubectl get nodes可以查看k8s集群节点情况。如下可以看到k8s集群由1个Master+2Node组成。
[root@k8master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 7d21h v1.19.3
k8snode1 Ready 7d17h v1.19.3
k8snode2 Ready 7d21h v1.19.3
[root@k8master ~]#
1、Master节点
是k8s集群管理节点,负责管理集群,对整个集群的资源进行调度,控制,提供集群资源数据访问入口,所有对集群的操作指令均需要通过访问入口授权才可以。
运行apiserver,controller manager 以及scheduler服务进程以及可选的Etcd key值数据库。
这里资源调度是由schelduler进程负责的。
2、Node节点
有地方也称作work节点,是k8s集群操作单元,也是运行pod服务节点,是pod的宿主机,拥有名称和IP,运行docker服务,关联master节点。运行kubelet,kube-proxy以及dokcer服务进程。
3、Pod
运行在node节点上,由若干容器组成。
如果把一个k8s集群看作一个小区的话,node节点就是一个单元楼,而pod就是单元楼里的门牌,容器就是门牌里面的房间。如下:
可以通过kubectl get pod查看k8s集群里pod信息,如下可以看到我的k8s集群中运行3个pod,一个mysql,两个web。
[root@k8master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-4s4td 1/1 Running 0 22h
myweb-5gngj 1/1 Running 0 22h
myweb-bt9hn 1/1 Running 0 22h
[root@k8master ~]#
可以通过describe查看pod详细信息,如下:可能看到pod运行在哪个node节点上,以及IP,Lables,RC,Port等
[root@k8master ~]# kubectl describe pod mysql-4s4td
Name: mysql-4s4td
Namespace: default
Priority: 0
Node: k8snode2/172.18.1.12
Start Time: Tue, 22 Dec 2020 13:00:44 +0800
Labels: app=mysql
Annotations:
Status: Running
IP: 10.244.2.4
IPs:
IP: 10.244.2.4
Controlled By: ReplicationController/mysql
Containers:
mysql:
Container ID: docker://e5573eebc18545665344a4335ec20996f1d7e8e9eea2513d8f773798e975173b
Image: mysql:5.6
Image ID: docker-pullable://mysql@sha256:51d59639d9a864ec302008c81d6909c532eff8b946993ef6448c086ba7917e82
Port: 3306/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 22 Dec 2020 13:01:47 +0800
Ready: True
Restart Count: 0
Environment:
MYSQL_ROOT_PASSWORD: 123456
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-9ln7v (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-9ln7v:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-9ln7v
Optional: false
QoS Class: BestEffort
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
[root@k8master ~]#
4、service
server定义了pod逻辑集合和访问该集合策略,提供一个统一的服务访问入口。关联多个相同Label的Pod,而用户不需要了解后台pod是如何运行的。
可以通过kubectl get svc查看service信息。如下
[root@k8master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 7d23h
mysql ClusterIP 10.111.33.137 3306/TCP 23h
myweb NodePort 10.105.244.254 8080:30001/TCP 23h
[root@k8master ~]#
外部系统访问service机制:
k8s有三种IP:
node IP,node节点的IP,是节点的物理网卡的IP地址。在k8s集群外主机访问k8s集群内部某个节点或服务的时候,必须通通node IP进行通信。
pod IP,每个pod的IP,是docker 容器间通信用,根据docker0网桥的IP地址,是一个虚拟的二层网络。
cluster IP:service的IP。是一个虚拟机的IP,仅作用于k8s service这个对象,无法被ping,由于k8s管理和分配,结合service Port组成一个具体的通信端口,单独的cluster IP不具备通信基础。
5、RC(Replication Controller)
是用来管理pod的副本,保证集群中存在指定数据的Pod副本。一般RC由下面几个部分组成:
pod副本数:replicas
用于筛选目标的pod的Label selector
以及用于创建pod的模板(template)
如下,一个web应用的RC
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 2 #启动2副本。
selector:
app: myweb
template: #模板
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
当定义了一个RC并提交到k8s集群后,Master节点上controller manager组件获悉后巡检当前存活的目标pod,并确保目标pod实例数量刚好等于RC中定义的数量。如果存在多个Pod副本在运行,系统会停掉一些pod,如果少于pod副本运行,会自动创建pod。
删除定义的RC不会影响到通过RC已经创建的Pod.
6、Label
在k8s集群中,任意的API对象都是通过Label进行标识,Node,Pod,Service,RC都会有Label来标识。Label是RC和Service运行的基础,二者都是通过Label来进行关联Node上运行的Pod,可以通过Label selector来查询筛选资源对象。Label和Label Selector共同构成k8s系统中最核心的应用模型。
一般:
kube-Controller进程通过资源对象RC上定义Label Selector来筛选要监控的Pod副本的数量,从而实现副本数量始终符合预期设定的全自动控制流程
kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service岛对应Pod的请求转发路由表,从而实现Service的智能负载均衡
通过对某些Node定义特定的Label,并且在Pod定义文件中使用Nodeselector这种标签调度策略,kuber-scheduler进程可以实现Pod”定向调度“的特性。
7、Namespace
Namespace用于实现多租户的资源隔离,可将集群内部的资源对象分配到不同的Namespace中,形成逻辑上的不同项目、小组或用户组,便于不同的Namespace在共享使用整个集群的资源的同时还能被分别管理。
K8s集群在启动后,会创建一个名为“default”的Namespace,且默认情况下K8s的相关资源,如Pod、RC、Service都将被系统创建到此默认名为default的Namespace中。