Kubernetes 安装手册
简介
Kubernetes是一个开源的容器编排工具,具有如下功能和特点: * 自动部署 * 弹性伸缩 * 容器生命周期管理 * 基于多种基础设施(本地部署,公有云,混合云等)
安装
- 手工部署
- 使用rancher安装部署
-
使用kubeoperator部署
-
备注:优先讨论工具部署,纯手工部署最后讲解
kubeoperator部署
kube-apiserver
--authorization-mode
- 认证模式:可以是Node或RBAC,也可以是组合
--admission-control
-
admission control只负责管理API对资源的请求量,一旦pod或容器实际在某台机器上运行后,并不控制它们的行为。因此admission control实际上是一个静态的、运行前的概念,而不是运行时的概念
-
所有的admission plugins
AlwaysAdmit
AlwaysDeny
AlwaysPullImages
DefaultStorageClass
DefaultTolerationSeconds
DenyEscalatingExec
DenyExecOnPrivileged
EventRateLimit
ExtendedResourceToleration
ImagePolicyWebhook
LimitPodHardAntiAffinityTopology
LimitRanger
MutatingAdmissionWebhook
NamespaceAutoProvision
NamespaceExists
NamespaceLifecycle
NodeRestriction
OwnerReferencesPermissionEnforcement
PersistentVolumeClaimResize
PersistentVolumeLabel
PodNodeSelector
PodPreset
PodSecurityPolicy
PodTolerationRestriction
Priority
ResourceQuota
RuntimeClass
SecurityContextDeny
ServiceAccount
StorageObjectInUseProtection
TaintNodesByCondition
ValidatingAdmissionWebhook
- 默认启用的admission plugins
NamespaceLifecycle
LimitRanger
ServiceAccount
TaintNodesByCondition
Priority
DefaultTolerationSeconds
DefaultStorageClass
StorageObjectInUseProtection
PersistentVolumeClaimResize
MutatingAdmissionWebhook
ValidatingAdmissionWebhook
RuntimeClass
ResourceQuota
- NamespaceLifecycle插件
* 该插件拒绝在终止状态的namespace(即用户发起删除一个namespace的请求后,此时该namespace的.status.phase为Terminating状态,待该namespace下的所有资源全部被删除后,它才会退出)中创建新资源的请求,以及在尚未存在的namespace下创建资源的请求。
* NamespaceLifecycle的Admit函数非常直观地展示了该admission controller的策略,它接受CREATE、UPDATE和DELETE操作。在每次接收到API请求之后,执行如下检查:
当接收到的API请求试图删除namespace时,如果该namespace为default,拒绝该请求,否则接收该请求,并且从本地cache中将该namespace的记录删除。
当接收到的API请求为资源相关的请求时,查找其对应的namespace,如果该namespace不存在,拒绝该请求。
当接收到的API请求为创建资源请求时,如果该namespace为Terminating状态,拒绝该请求。
当上述情况均未违反相应规则时,则通过该请求
- LimitRanger插件
* LimitRanger插件的作用是判断客户端API请求中的资源需求是否符合系统管理员预设值,包括上限、下限、默认值以及默认比率。为了配合LimitRanger插件的使用,Kubernetes引人了LimitRange对象,用于对特定namespace中的Kubernetes对象设置资源使用的预设值。当前Kubernetes支持以namespace为单位,在pod和容器两个层次对资源使用进行管理
* 首先,向admission control注册一个名为LimitRanger的插件。
* 然后,实现Admit方法。该方法首先获取发起API请求所在的namespace中的LimitRange对象列表。遍历该LimitRange对象列表,执行如下检查:
对于.spec.container.resources.limits和.spec.container.resources.requests字段为空的manifest,填入LimitRange设定的默认值。
对于pod中的每个container,检查其.container.resources.limits和.container.resources.requests是否满足LimitRange的.spec.limits.max, .spec.limits.min和.spec.limits.maxLimitRequestRatio的设定。如果不满足,则拒绝该请求。
* LimitRanger插件只适用于Kubernetes对象创建(CREATE)和更新(UPDATE)操作,并不受理删除操作。需要注意的是,一个namespace中可能存在不止一个LimitRange对象,因此,任何一个针对Kubernetes对象的创建和更新操作都要接受该namespace中所有LimitRange对象的限制
- ServiceAccount插件
* service account为pod中的进程提供id。实际上,当用户试图与APIServer打交道时,往往通过user account来进行身份的认证及授权;类似地,集群中的pod也可能希望与APIServer通信,系统并不为其创建user account,而作为代替的就是service account。
* 如果用户启用了service account自动生成的功能,controller就会接管这项工作,主要涉及了3个层面,分别对应service account admission controller, token controller和service account controllero这里我们主要关注第一个。
* service account插件在pod创建(CREATE)时发挥作用,其Admit函数包括如下检查:
如果创建的pod是mirror pod,且其.spec.serviceAccountName或volumes.VolumeSource.secret不为空,则拒绝该请求。
如果创建的pod的.spec.serviceAccountName为空,则将该字段设为同一namespace下的default service account。
检查pod引用的service account是存在的,如不存在拒绝该请求。
查找service account对应的secret token,如该pod中未存在该volume,则为其挂载
- ResourceQuota插件
* ResourceQuota插件的作用是为特定namespace应用资源使用的配额。与LimitRanger插件类似,为了配合ResourceQuota插件的使用,Kubernetes引人了ResourceQuota对象,用于对特定namespace中的Kubernetes对象设置资源配额
advertise-address
暴露给集群中其它成员的IP地址,这个地址必须是可以访问的,如果不填写或者为空,则使用--bind-address,如果--bind-address为空,则使用节点默认的网络接口。
bind-address
默认为:0.0.0.0, --secure-port port监听需要使用的IP地址
log-dir
- 日志目录
log-file
- 日志文件,
log-file-max-size
- 日志文件最大大小,默认:1800,单位:M;如果为:0,不受限制
log-flush-frequency
- 日志刷新频率,默认:5s
logtostderr
- 日志输出到标准错误,代替输出到文件,默认:true
master-service-namespace
- master服务默认的命名空间,默认值为:default
max-mutating-requests-inflight
- 最大的mutating请求数,默认值为: 200,超过拒绝请求;0:不限制
max-requests-inflight
- 最大的non-mutating请求数,默认值为:400,超过拒绝请求;0:不限制
secure-port
- 安全访问端口,默认值为:6443
storage-backend
- 后端存储,默认为:etcd3
storage-media-type
- 用于在存储器中存储对象的媒体类型。某些资源或存储后端可能只支持特定的媒体类型,并将忽略此设置,默认值为:application/vnd.kubernetes.protobuf
v
- 日志级别详细程度的编号
kube-controller 参数
allocate-node-cidrs
- 为每个node节点分配cidr,设置为:true,则自动为node分配(例如:179.16.10.0?24),设置为:false,则需要手动分配与cluster-cidr可配合使用
alsologtostderr
- 日志除了输出到文件,也输出到标准错误
bind-address
- 绑定的IP地址,为 --secure-port port监听使用
cluster-cidr
- pod使用的cluster ip范围;--allocate-node-cidrs参数要设置为:true
cluster-name
- 集群的实例前缀;默认:kubernetes
concurrent-deployment-syncs
- 将同时执行的终结点同步操作数。数字越大=端点更新越快,但CPU(和网络)负载越大;默认值为:5
kubeconfig
- 具有授权和主位置信息的kubeconfig文件的路径
large-cluster-size-threshold
- 大集群阈值,在进行节点驱逐时使用,默认值为:50
leader-elect
- 启动一个领导人选举客户端,并在执行主循环之前获得领导权。在运行复制组件以获得高可用性时启用此选项,默认值为:true
log-dir
- 日志文件目录
log-file
- 日志文件
log-file-max-size
- 日志文件最大大小,默认:1800,单位:m
log-flush-frequency
- 日志刷新频率
master
- apiserver的地址,会覆盖kubeconfig中的值
node-cidr-mask-size
- 集群中cidr的掩码大小,默认:24
node-eviction-rate
- 当一个区域处于正常状态时,如果节点发生故障,每秒将删除这些pod的节点数(请参阅--unhealth zone threshold,以了解健康/不健康的定义)。区域是指非多区域簇中的整个簇
node-monitor-grace-period
- 允许运行的节点在标记为不正常之前无响应的时间量。节点的更新次数必须大于节点的更新次数。
service-cluster-ip-range
- 及群中服务的cidr,需要设置--allocate-node-cidrs为:true
controllers
- 启用的控制器,都好分割的列表,默认值为:*
- 此处列出1.16默认的控制器
attachdetach
bootstrapsigner
cloud-node-lifecycle
clusterrole-aggregation
cronjob
csrapproving
csrcleaner
csrsigning
daemonset
deployment
disruption
endpoint
endpointslice
garbagecollector
horizontalpodautoscaling
job
namespace
nodeipam
nodelifecycle
persistentvolume-binder
persistentvolume-expander
podgc
pv-protection
pvc-protection
replicaset
replicationcontroller
resourcequota
root-ca-cert-publisher
route
service
serviceaccount
serviceaccount-token
statefulset
tokencleaner
ttl
ttl-after-finished
Disabled-by-default controllers: bootstrapsigner
endpointslice
tokencleaner
kube-scheduler 参数
address
- --port port监听要使用的ip地址,默认为:0.0.0.0;后续使用:--bind-address代替
bind-address
- --secure-port port监听要使用的ip地址,如果为空,将会使用:0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces
leader-elect
- 启动一个领导人选举客户端,并在执行主循环之前获得领导权。在运行复制组件以获得高可用性时启用此选项。
secure-port
- 通过https进行认证授权的端口,如果为:0不适用https
config
- 配置文件的路径,命令行参数的值会覆盖此文件的值
kubelet参数
--register-node
- 当设置为:rtue,表示kubelet自注册;如下的参数会起用:
--kubeconfig - Path to credentials to authenticate itself to the apiserver.
--cloud-provider - How to talk to a cloud provider to read metadata about itself.
--register-node - Automatically register with the API server.
--register-with-taints - Register the node with the given list of taints (comma separated <key>=<value>:<effect>). No-op if register-node is false.
--node-ip - IP address of the node.
--node-labels - Labels to add when registering the node in the cluster (see label restrictions enforced by the NodeRestriction admission plugin in 1.13+).
--node-status-update-frequency - Specifies how often kubelet posts node status to master.
-
如果管理管理员想要自己创建node对象,可将参数设置为:false
-
自动注册时,node会上报自己的资源容量,如果参数值为:false,则需要管理员自己设置。
--kubeconfig
- 包含kubelet连接到apiserver的方式,若果没有此选项,则进入:standalone 模式;
--node-ip
- node的IP地址,如果设置了,node将会使用此IP地址
--node-labels
- 注册到集群时,将会为此node打上标签,必须是key=value 对,并且用逗号分隔
--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]
- 系统资源预留
-
kubelet将回预留设置的资源不分配给pod
-
详见资源预留
--kubelet-certificate-authority
- 启用apiserver到kubelet的安全验证,默认情况下,apiserver想kubelet的访问是不验证的,容易遭受中间人攻击。
--cloud-provider
- 如果起用此参数,本地的hostname和--hostname-override参数可能都会被忽略。
--port
- kubelet 监听的端口,对外提供服务