master节点运行机制

 kube-apiserver

k8s API Server 提供了 k8s 各类资源对象( pod,RC,Service 等)的增删改查及 watch HTTP Rest 接口,是整个系统 的数据总线和数据中心。
提供了集群管理的 REST API 接口 ( 包括认证授权、数据校验以及集群状态变更 )
提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd) ;
是资源配额控制的入口;
拥有完备的集群安全机制
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)
root@master1:/home/zzj# kube-apiserver --help | grep insecure
      --address ip                 The IP address on which to serve the insecure --port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces). (default 127.0.0.1) (DEPRECATED: see --bind-address instead.)
      --insecure-bind-address ip   The IP address on which to serve the --insecure-port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces). (default 127.0.0.1) (DEPRECATED: This flag will be removed in a future version.)
      --insecure-port int          The port on which to serve unsecured, unauthenticated access. (default 8080) (DEPRECATED: This flag will be removed in a future version.)
root@master1:/home/zzj# ss -ntl
State                      Recv-Q                      Send-Q                                            
LISTEN                     0                           128                                                   127.0.0.1:8080                                                 0.0.0.0:*
通过参数 --bind-address=192.168.7.101 监听一个对外访问且安全 (https) 的端口 ( 默认为 6443)
该端口默认值为 6443 ,可通过启动参数 “--secure-port” 的值来修改默认值;
该端口用于接收客户端、 dashboard 等外部 HTTPS 请求;
用于基于 Tocken 文件或客户端证书及 HTTP Base 的认证;
用于基于策略的授权

以上所有参数配置都可以在 /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=10.0.0.9 \
  --allow-privileged=true \
  --anonymous-auth=false \
  --authorization-mode=Node,RBAC \
  --bind-address=10.0.0.9 \
  --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://10.0.0.6: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=10.10.0.0/16 \
  --service-node-port-range=30000-60000 \
  --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
# 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 #指标数据

kube-controller-manager

Controller Manager 作为集群内部的管理控制中心,非安全默认端口 10252 ,负责集群内的 Node Pod 副本、服务端点(Endpoint )、命名空间( Namespace )、服务账号( ServiceAccount )、资源定额( ResourceQuota ) 的管理,当某个Node 意外宕机时, Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
root@master1:/home/zzj# 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.20.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=10.10.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@master1:/home/zzj# 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(6443端口) 监听到 kubernetes Scheduler 产生的 Pod 绑定信息,然后获取对应的 Pod 清单,下载Image ,并启动容器。

node节点运行机制 

kubelet

kubernetes 集群中,每个 Node 节点都会启动 kubelet 进程,用来处理 Master 节点下发到本节点的任务,管理 Pod和其中的容器。 kubelet 会在 API Server 上注册节点信息,定期向 Master 汇报节点资源使用情况,并通过 cAdvisor(顾问 ) 监控容器和节点资源,可以把 kubelet 理解成 Server/Agent 架构中的 agent kubelet Node 上的 pod管家。
root@master1:/home/zzj# cat /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service
ExecStart=/usr/bin/kubelet \
  --config=/var/lib/kubelet/config.yaml \
  --cni-bin-dir=/usr/bin \
  --cni-conf-dir=/etc/cni/net.d \
  --hostname-override=10.0.0.9 \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --network-plugin=cni \
  --pod-infra-container-image=harbor.zzj.com/baseimage/pause-amd64:3.1 \
  --root-dir=/var/lib/kubelet \
  --v=2
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
root@master1:/home/zzj# cat /etc/kubernetes/kubelet.kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lVYmVGRys2Zy9qeFBob1cvOExjMlJLc0lJQmxnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1lURUxNQWtHQTFVRUJoTUNRMDR4RVRBUEJnTlZCQWdUQ0VoaGJtZGFhRzkxTVFzd0NRWURWUVFIRXdKWQpVekVNTUFvR0ExVUVDaE1EYXpoek1ROHdEUVlEVlFRTEV3WlRlWE4wWlcweEV6QVJCZ05WQkFNVENtdDFZbVZ5CmJtVjBaWE13SUJjTk1qRXhNakV6TURrME5UQXdXaGdQTWpFeU1URXhNVGt3T1RRMU1EQmFNR0V4Q3pBSkJnTlYKQkFZVEFrTk9NUkV3RHdZRFZRUUlFd2hJWVc1bldtaHZkVEVMTUFrR0ExVUVCeE1DV0ZNeEREQUtCZ05WQkFvVApBMnM0Y3pFUE1BMEdBMVVFQ3hNR1UzbHpkR1Z0TVJNd0VRWURWUVFERXdwcmRXSmxjbTVsZEdWek1JSUJJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNtVTZnbHZEcFhuc0RUaGJnQTJZQW9JcHBIbXYKb0FzSGRpclZBNEJTWldCRkQxblRsT2hOQzFZWmpMWUExYzNlb0JwZnZvQnpQRkdaV0VTS0RsaTVGQ1R4QUdmawp2UlNBcERiNWtTWU85Uy9aU2MySTExaFNJMjYxNkNpMXkwQnRSZXF4dnN6MnB1WWtoeUZiRVU1QzIyYnFRRjZ1CksrM1QxSDFNYktES25EWGg0dXdrMHBaUkY3ZDlTc3JOTmcwTVh6UVoyRmI2aHhXMEFxMXpjaTRTOFV5RXFFWW0KQ2N6c1R0cE1QVWUwTUNEaDRKNG9kRnY2R1ZQbDdYbjIzNTJZZHpBRWh0T0o5aHdCQU9FNlMwbE1ONEtpWTNMUgpYQWFCMzh5WGovY3JXcnQyWUhCc2RhRmV0b3FlMDhlVWhQY01HV0lBSldUbUpTZWRscFlYb1VXNHlRSURBUUFCCm8yWXdaREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBakFkQmdOVkhRNEUKRmdRVUJpN0cxL2hvdEpqRjQ0RjFuTEh4aHdjbXdxZ3dId1lEVlIwakJCZ3dGb0FVQmk3RzEvaG90SmpGNDRGMQpuTEh4aHdjbXdxZ3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQjhYbE1YOEd3czlGenRtT3JRSlVOR2tTSzQyCmRFb0tjSE93SXNpYVhkT2F3Y2ZGRWxzditKSUp4anJ0TzRoL1RHNkx1cmZRN1QzeWx0dndOQ1BEUGFDMW5ManIKaVl1Qmh0ZXhHWGRoeHhnZGpGbkJoUWwvUVVBeVB3VngxNFZHUnhLbnM3dEg3M3BrWlhCUUR2OUwxNUlOS0ptTwozejRacFd2M1Y5Tlo5TGpjelRiK2h0bEVyRlR6aDUrUXc3YVAzbUtwc2FNU2xzL1dwRExQV01iaG9pK2g2bWxaCjRxRHhTOHV6aEwrZ0dMMUQvWTRlemF0dXAzRGpDWWVVVHdBQ2pxL0ZpdU1zZnlMemRHaTVUd29WMDVpeUN4cXgKSk5MSVNwbm1hZzhrQ1ZjN3dRU29kQ0VGcktTOEpPMzRSeUh4cGx2MG0zR3VmTkp6K21KUXVOaFp3THM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    server: https://10.0.0.9:6443
  name: kubernetes

 kube-proxy

kube-proxy 运行在每个节点上,监听 API Server 中服务对象的变化,再通过管理 IPtables 来实现网络的转发。
Kube-Proxy 不同的版本可支持三种工作模式:
UserSpace
k8s v1.2 及以后就已经淘汰
IPtables
目前默认方式, 1.1 开始支持, 1.2 开始为默认
IPVS
1.9 引入到 1.11 正式版本,需要安装 ipvsadm ipset 工具包和加载 ip_vs 内核模块
root@master1:/home/zzj# cat /etc/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
# kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后,kube-proxy 会对访问 Service IP 的请求做 SNAT
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/usr/bin/kube-proxy \
  --bind-address=10.0.0.9 \
  --cluster-cidr=10.20.0.0/16 \
  --hostname-override=10.0.0.9 \
  --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
  --logtostderr=true \
  --proxy-mode=iptables
Restart=always
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

iptables 

Kube-Proxy 监听 Kubernetes Master 增加和删除 Service 以及 Endpoint 的消息。对于每一个 Service Kube Proxy 创建相应的 IPtables 规则,并将发送到 Service Cluster IP 的流量转发到 Service 后端提供服务的 Pod 的相 应端口上。
注:
虽然可以通过 Service Cluster IP 和服务端口访问到后端 Pod 提供的服务,但该 Cluster IP Ping 不通的。
其原因是 Cluster IP 只是 IPtables 中的规则,并不对应到一个任何网络设备。
IPVS 模式的 Cluster IP 是可以 Ping 通的。

 IPVS

IPVS 相对 IPtables 效率会更高一些,使用 IPVS 模式需要在运行 Kube-Proxy 的节点上安装 ipvsadm ipset 工具 包和加载 ip_vs 内核模块,当 Kube-Proxy IPVS 代理模式启动时, Kube-Proxy 将验证节点上是否安装了 IPVS 模块,如果未安装,则 Kube-Proxy 将回退到 IPtables 代理模式。
root@master1:/home/zzj# lsmod | grep vs
vmw_vsock_vmci_transport    32768  1
vsock                  36864  2 vmw_vsock_vmci_transport
vmw_vmci               69632  2 vmw_balloon,vmw_vsock_vmci_transport
ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 151552  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_defrag_ipv6         20480  1 ip_vs
nf_conntrack          135168  9 xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_nat,ipt_MASQUERADE,nf_nat_ipv4,xt_nat,nf_conntrack_netlink,ip_vs
libcrc32c              16384  4 nf_conntrack,nf_nat,raid456,ip_vs

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐