Pod控制器基本概念:
Pod是kubernetes的最小单元,自主式创建的pod删除就没有了,但是通过资源控制器创建的pod如果删除还会重建。pod控制器就是用于实现代替我们去管理pod的中间层,并帮我们确保每一个pod资源处于我们所定义或者所期望的目标状态,pod资源出现故障首先要重启容器,如果一直重启有问题的话会基于某种策略重新编排。自动适应期望pod数量。
Kubernetes中内建了很多controller(控制器),这些相当于⼀个状态机,⽤来控制Pod的具体状态和⾏为。
Pod控制器有很多种类型,但是目前kubernetes中常用的控制器有:
- Replication Controller(RC):是Kubernetes系统中的核心概念,用于定义Pod副本的数量。在Master内,RC进程通过RC的定义来完成Pod的创建、监控、启停等操作。根据RC定义,Kubernetes能够确保在任意时刻都能运行用于指定的Pod"副本"(Replica)数量。随着kubernetes的迭代更新,RC即将被废弃,逐渐被ReplicaSet替代;
- ReplicaSet(RS):它的核心作用是代用户创建指定数量的Pod副本,并确定Pod副本一直处于满足用户期望数量的状态,多退少补,同时支持扩缩容机制。主要有三个组件:用户期望的Pod副本数量;标签选择器,选择属于自己管理和控制的Pod;当前Pod数量不满足用户期望数量时,根据资源模板进行新建;
- Deployment:工作在ReplicaSet之上,用于管理无状态应,除了ReplicaSet的机制,还增加了滚动更新和回滚功能,提供声明式配置;
- DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务。要求:服务是无状态的;服务必须是守护进程;
※小知识:以有状态为尺,以无状态为容
- 有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
- 无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。
核心组件
HPA
Horizontal Pod Autoscaling(Pod 水平自动伸缩),简称HPA
RC还支持二级控制器
HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量,一般情况下我们可以确保一个node上面有两个pod在运行
service
为了降低客户端与pod之间协调的复杂度,k8s为每一组提供同类服务的pod和其客户端之前添加了一个中间层,中间层就叫service(固定的)
不是一个程序,也不是一个组件,它是一个iptables的dnat规则(是一个流量,是无形的)
service作为K8S的对象,有自身的名称,而名称相当于服务的名称(可以被解析)访问只能用集群去访问,真机上不行
如图,旁边还有一个service是单独的,这就是附件(除了附件还有插件)
AddOns附件
K8S自身需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,也可以称为集群附件
dns pod
- 装完k8s后第一件事就是需要在集群上部署一个dns pod,以确保各service的名称可以被解析
- 可以动态改变(比如创建、删除、修改)
- 举个例子,假如把service的名称改掉,dns pod会自动触发,将dns解析记录中的名称也给改掉,如果改掉IP地址的话也会触发,dns服务中的解析记录也会改掉
- 如此一来,客户端去访问opd资源时就可以直接访问service的名称,然后由集群中专用的dns服务来负责解析
Kubernetes网络模型
k8s的三种网络模型分别属于三个网段,分别是:
- 节点网络
- service集群网络
- pod网络
由此延申出三个问题
问题一:
同一个pod内的多个容器间如何通信?
可以使用lo网卡
问题二:
各pod之前如何通信?
- 可以使用物理桥桥接的方式(规模大的情况下会产生广播风暴)
- Overlay Network (通过隧道的方式转发报文)
问题三:
pod与service之间如何通信?
在不同节点上的Pod通信中,我们知道了Pod是以IP地址进行通信,但Kubernetes 的集群中, Pod 可能会频繁的销毁和创建,也就是说 Pod 的 IP 不是固定的。
为了解决这个问题,Service 提供了访问 Pod 的抽象层,即为一组功能相同的Pod提供单一不变的接入点资源。
无论后端的 Pod 如何变化,Service 都作为稳定的前端对外提供服务。
同时,Service 还提供了高可用和负载均衡功能,Service 负责将请求转发给正确的 Pod。
注意:上述情形仅在节点连接到相同网关,之间没有任何路由设备时有效。否则,路由设备会因为IP私有产生丢包现象,除非设置路由规则。但随着节点的增加,路由的配置会变得非常困难。因此我们使用SDN(软件定义网络)技术来简化此类问题,SDN可以忽略底层网络拓扑,使其就像连接到同一网关。
kubectl常用命令的使用
kubectl help
查看kubectl相关的命令
Basic Commands (Beginner):
create Create a resource from a file or from stdin.
expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
Kubernetes Service
run 在集群中运行一个指定的镜像
set 为 objects 设置一个指定的特征
Basic Commands (Intermediate):
explain 查看资源的文档
get 显示一个或更多 resources
edit 在服务器上编辑一个资源
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
Deploy Commands:
rollout Manage the rollout of a resource
scale 为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
Cluster Management Commands:
certificate 修改 certificate 资源.
cluster-info 显示集群信息
top Display Resource (CPU/Memory/Storage) usage.
cordon 标记 node 为 unschedulable
uncordon 标记 node 为 schedulable
drain Drain node in preparation for maintenance
taint 更新一个或者多个 node 上的 taints
Troubleshooting and Debugging Commands:
describe 显示一个指定 resource 或者 group 的 resources 详情
logs 输出容器在 pod 中的日志
attach Attach 到一个运行中的 container
exec 在一个 container 中执行一个命令
port-forward Forward one or more local ports to a pod
proxy 运行一个 proxy 到 Kubernetes API server
cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
auth Inspect authorization
Advanced Commands:
apply 通过文件名或标准输入流(stdin)对资源进行配置
patch 使用 strategic merge patch 更新一个资源的 field(s)
replace 通过 filename 或者 stdin替换一个资源
wait Experimental: Wait for one condition on one or many resources
convert 在不同的 API versions 转换配置文件
Settings Commands:
label 更新在这个资源上的 labels
annotate 更新一个资源的注解
completion Output shell completion code for the specified shell (bash or zsh)
Other Commands:
alpha Commands for features in alpha
api-resources Print the supported API resources on the server
api-versions Print the supported API versions on the server, in the form of "group/version"
config 修改 kubeconfig 文件
plugin Runs a command-line plugin
version 输出 client 和 server 的版本信息
更详细一点如下:
命令 | 说明 |
---|---|
create | 使用文件或者标准输入的方式创建一个资源 |
expose | 将一个资源公开为为新的Kubernetes Service |
run | 创建并运行一个或多个容器镜像 |
set | 配置应用资源 |
explain | 显示资源文档信息 |
get | 获取显示一个或多个资源 |
edit | 编辑服务器上定义的资源 |
delete | 按文件名、stdin、资源和名称或按资源和标签选择器删除资源 |
create
kubectl create可以通过配置文件名或stdin创建一个集群资源对象。支持JSON和YAML格式的文件
[root@master ~]# kubectl create deployment b1 --image busybox
deployment.apps/b1 created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
b1-68578fbb6c-lgchj 0/1 Pending 0 13s
nginx-6799fc88d8-bmwdr 0/1 Terminating 0 43h
nginx-6799fc88d8-zjgtj 0/1 Pending 0 42h
run
kubectl run创建并运行一个或多个容器镜像。
kubectl run和docker run一样,它能将一个镜像运行起来。下面使用kubectl run来将一个nginx的镜像启动起来。
[root@master ~]# kubectl run nginx --image=nginx --expose --port=80 #指定镜像,指定暴露端口
service/nginx created
deployment.apps/nginx created
使用kubectl run会自动创建deployment,加上--export会自动创建service。
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 10d
nginx ClusterIP 10.68.56.89 <none> 80/TCP 1m
[root@master ~]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 16m
nginx 1 1 1 1 1m
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-5fb6c74b86-xg97j 1/1 Running 0 21m
nginx-6f858d4d45-dt44v 1/1 Running 0 6m
get
kubectl get获取列出一个或多个资源的信息。
例如,分别获取当前集群中pod、deployment和svc的信息。
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-5fb6c74b86-xg97j 1/1 Running 0 42m
nginx-566c464789-w7669 1/1 Running 0 15m
[root@master ~]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 43m
nginx 1 1 1 1 28m
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 10d
mysql ClusterIP 10.68.86.66 <none> 33060/TCP 36m
delete
kubectl delete可以通过配置文件名、stdin、资源名称或label选择器来删除资源。支持JSON和YAML格式的文件。
下面删除nginx的pod。
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-5fb6c74b86-xg97j 1/1 Running 0 55m
nginx-566c464789-w7669 1/1 Running 0 27m
[root@master ~]# kubectl delete pod/nginx-566c464789-w7669
pod "nginx-566c464789-w7669" deleted
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-5fb6c74b86-xg97j 1/1 Running 0 55m
nginx-566c464789-8lr2x 0/1 ContainerCreating 0 1m
又生成了一个新的nginx的pod,为什么?这是因为对应的deployment还存在。
[root@master ~]# kubectl delete deploy/nginx
deployment.extensions "nginx" deleted
[root@master ~]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql 1 1 1 1 1h
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-5fb6c74b86-xg97j 1/1 Running 0 1h
删除掉deployment,其对应的pod也会被删除。