Kubernetes-master 运行机制

Master 节点运行机制

Kube-apiserver

  • k8s API Server 提供了 k8s 各类资源对象 (Pod、RC、Service 等) 的增删改查及 watch 等 HTTP Rest 接口,是整个系统的数据总线和数据中心。
  • apiserver 目前在 master 监听两个端口,通过 -insecure-port int 监听一个非安全的 127.0.0.1 的本地端口 (默认为 8080):
该端口用于接收 HTTP 请求;
该端口默认值为 8080,可以通过 API Server 的启动参数 "--insecure-port" 的值来修改默认值;
默认的 IP 地址为 "localhost",可以通过启动参数 "--insecure-bind-address" 的值来修改该 IP 地址;
非认证或未授权的 HTTP 请求通过该端口访问 API Server (kube-controller-manager、kube-scheduler)。
  • 通过参数 --bind-address=192.168.26.105 监听一个对外的访问且安全 (https) 的端口 (默认端口为 6443):
该端口默认值为 6443,可通过启动参数 "--secure-port" 的值来修改默认值;
默认 IP 地址为非本地 (Non-Localhost) 网络端口,通过启动参数 "--bind-address" 设置该值;
该端口用于接受客户端、dashboard 等外部 HTTPS 请求;
用于基于 Tocken 文件或客户端证书及 HTTP Base 的认证;
用于基于策略的授权;
  • Kubernetes API Server 的功能与使用:
提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd);
是资源配额控制的入口;
拥有完备的集群安全机制。

# curl 127.0.0.1:8080/apis #分组api
# curl 127.0.0.1:8080/api/v1 #带具体版本号的api
# curl 127.0.0.1:8080/ #返回核心api列表
# curl 127.0.0.1:8080/version #api 版本信息
# curl 127.0.0.1:8080/healthz/etcd #与etcd的心跳监测
# curl 127.0.0.1:8080/apis/autoscaling/v1 #api的详细信息
# curl 127.0.0.1:8080/metrics #指标数据
  • 启动脚本
root@k8s-master-1:~# cat /etc/systemd/system/kube-apiserver.service 
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
ExecStart=/usr/bin/kube-apiserver \
  --advertise-address=192.168.26.105 \
  --allow-privileged=true \
  --anonymous-auth=false \
  --authorization-mode=Node,RBAC \
  --bind-address=192.168.26.105 \ #外部监听端口
  --insecure-bind-address=127.0.0.1 \ #本机监听端口
  --client-ca-file=/etc/kubernetes/ssl/ca.pem \
  --endpoint-reconciler-type=lease \
  --etcd-cafile=/etc/kubernetes/ssl/ca.pem \
  --etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \
  --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \
  --etcd-servers=https://192.168.26.165:2379,https://192.168.26.175:2379,https://192.168.26.185:2379 \
  --kubelet-certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --kubelet-client-certificate=/etc/kubernetes/ssl/admin.pem \
  --kubelet-client-key=/etc/kubernetes/ssl/admin-key.pem \
  --kubelet-https=true \
  --service-account-key-file=/etc/kubernetes/ssl/ca.pem \
  --service-cluster-ip-range=172.20.0.0/16 \
  --service-node-port-range=30000-60000 \ #能够开启的 node-port 端口的范围
  --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  --requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
  --requestheader-allowed-names= \
  --requestheader-extra-headers-prefix=X-Remote-Extra- \
  --requestheader-group-headers=X-Remote-Group \
  --requestheader-username-headers=X-Remote-User \
  --proxy-client-cert-file=/etc/kubernetes/ssl/aggregator-proxy.pem \
  --proxy-client-key-file=/etc/kubernetes/ssl/aggregator-proxy-key.pem \
  --enable-aggregator-routing=true \
  --v=2
Restart=always
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  • node-port 端口使用方式
--service-node-port-range=30000-60000 
- 顺需使用
    30001
    30002
    30003 
    ......
- 划分使用
    30001-30020
    30021-30030
    30031-30040
    ......
#由于项目众多,需要在每使用一个端口后,将端口使用信息进行详细记录
#如:具体业务名称-具体服务名称-具体服务使用端口信息

kube-controller-manager

  • Controller Manager 作为集群内部的管理控制中心,非安全默认端口为 10252,负责集群内部的 Node、Pod 副本、服务端点 (Endpoint)、命名空间 (Namespace)、服务账号 (ServiceAccount)、资源定额 (ResourceQuota) 的管理,当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
  • 启动脚本:
root@k8s-master-1:~# cat /etc/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
ExecStart=/usr/bin/kube-controller-manager \
  --address=127.0.0.1 \
  --master=http://127.0.0.1:8080 \ #调用 kube-api-server 的本地端口进行通信
  --allocate-node-cidrs=true \
  --cluster-cidr=10.10.0.0/16 \
  --cluster-name=kubernetes \
  --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
  --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
  --leader-elect=true \
  --node-cidr-mask-size=24 \
  --root-ca-file=/etc/kubernetes/ssl/ca.pem \
  --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --service-cluster-ip-range=172.20.0.0/16 \
  --use-service-account-credentials=true \
  --v=2
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

kube-cheduler

  • Scheduler 负责 Pod 调度,在整个系统中起 "承上启下" 作用。
    • 承上:负责接收 Controller Manager 创建的新的 Pod,为其选择一个合适的 Node
    • 启下:Node 上的 kubelet 接管 Pod 的生命周期
  • 启动脚本
root@k8s-master-1:~# cat /etc/systemd/system/kube-scheduler.service 
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
ExecStart=/usr/bin/kube-scheduler \
  --address=127.0.0.1 \
  --master=http://127.0.0.1:8080 \ #调用 kube-api-server 的本地端口进行通信
  --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \
  --leader-elect=true \
  --v=2
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target                        
  • 通过调度算法为待调度 Pod 列表的每个 Pod 从可用 Node 列表中选择一个最合适的 Node,并将信息写入到 etcd 中 Node 节点上的 Kubelet 通过 API Server 监听到 Kubernetes Scheduler 产生的 Pod 绑定信息,然后获取对应的 Pod 清单,下载 Image,并启动容器。
优选策略
1.LeastRequestedPriority
优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)。
2.CalculateNodeLabelPriority
优先选择含有指定Label的节点。
3.BalancedResourceAllocation
优先从备选节点列表中选择各项资源使用率最均衡的节点。

mark

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注